summaryrefslogtreecommitdiffstats
path: root/2022
diff options
context:
space:
mode:
Diffstat (limited to '2022')
-rw-r--r--2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.vtt411
-rw-r--r--2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt52
-rw-r--r--2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt874
-rw-r--r--2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.vtt970
-rw-r--r--2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main--chapters.vtt40
-rw-r--r--2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.vtt1505
-rw-r--r--2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main--chapters.vtt25
-rw-r--r--2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.vtt424
-rw-r--r--2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.vtt1004
-rw-r--r--2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main--chapters.vtt49
-rw-r--r--2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.vtt890
-rw-r--r--2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.vtt1691
-rw-r--r--2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main--chapters.vtt55
-rw-r--r--2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.vtt1126
-rw-r--r--2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.vtt1028
-rw-r--r--2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main--chapters.vtt34
-rw-r--r--2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.vtt502
-rw-r--r--2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main--chapters.vtt53
-rw-r--r--2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.vtt473
-rw-r--r--2022/captions/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.vtt489
-rw-r--r--2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.vtt1184
-rw-r--r--2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt38
-rw-r--r--2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt739
-rw-r--r--2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.vtt6638
-rw-r--r--2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.vtt787
-rw-r--r--2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.vtt791
-rw-r--r--2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main--chapters.vtt65
-rw-r--r--2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.vtt1945
-rw-r--r--2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.vtt815
-rw-r--r--2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main--chapters.vtt31
-rw-r--r--2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.vtt323
-rw-r--r--2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.vtt554
-rw-r--r--2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main--chapters.vtt117
-rw-r--r--2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt1354
-rw-r--r--2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.vtt653
-rw-r--r--2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main--chapters.vtt56
-rw-r--r--2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.vtt1261
-rw-r--r--2022/captions/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.vtt1184
-rw-r--r--2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.vtt467
-rw-r--r--2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt43
-rw-r--r--2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt1048
-rw-r--r--2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.vtt1019
-rw-r--r--2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main--chapters.vtt29
-rw-r--r--2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.vtt818
-rw-r--r--2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.vtt464
-rw-r--r--2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main--chapters.vtt41
-rw-r--r--2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt792
-rw-r--r--2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt43
-rw-r--r--2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt826
-rw-r--r--2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.vtt497
-rw-r--r--2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.vtt726
-rw-r--r--2022/captions/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.vtt1002
-rw-r--r--2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.vtt1046
-rw-r--r--2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main--chapters.vtt80
-rw-r--r--2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.vtt1757
-rw-r--r--2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers--chapters.vtt44
-rw-r--r--2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.vtt806
-rw-r--r--2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main--chapters.vtt56
-rw-r--r--2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.vtt1192
-rw-r--r--2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.vtt563
-rw-r--r--2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main--chapters.vtt82
-rw-r--r--2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.vtt1321
-rw-r--r--2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main_es.vtt1322
-rw-r--r--2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.vtt611
-rw-r--r--2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main--chapters.vtt34
-rw-r--r--2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.vtt508
-rw-r--r--2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt2348
-rw-r--r--2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt80
-rw-r--r--2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt2258
-rw-r--r--2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main--chapters.vtt71
-rw-r--r--2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main.vtt1220
-rw-r--r--2022/captions/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.vtt852
-rw-r--r--2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.vtt1133
-rw-r--r--2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main--chapters.vtt38
-rw-r--r--2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.vtt1129
-rw-r--r--2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main--chapters.vtt56
-rw-r--r--2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.vtt1736
-rw-r--r--2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers--chapters.vtt109
-rw-r--r--2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.vtt2217
-rw-r--r--2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main--chapters.vtt32
-rw-r--r--2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.vtt756
-rw-r--r--2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main--chapters.vtt73
-rw-r--r--2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.vtt1315
-rw-r--r--2022/captions/emacsconf-2022-sat-open--opening-remarks--main--chapters.vtt29
-rw-r--r--2022/captions/emacsconf-2022-sat-open--opening-remarks--main.vtt273
-rw-r--r--2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main--chapters.vtt26
-rw-r--r--2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.vtt383
-rw-r--r--2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers--chapters.vtt32
-rw-r--r--2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.vtt1232
-rw-r--r--2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main--chapters.vtt55
-rw-r--r--2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.vtt1153
-rw-r--r--2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.vtt1535
-rw-r--r--2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main--chapters.vtt38
-rw-r--r--2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt1309
-rw-r--r--2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main--chapters.vtt68
-rw-r--r--2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.vtt1614
-rw-r--r--2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main--chapters.vtt40
-rw-r--r--2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt727
-rw-r--r--2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.vtt2153
-rw-r--r--2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.vtt471
-rw-r--r--2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers--chapters.vtt23
-rw-r--r--2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.vtt893
-rw-r--r--2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main--chapters.vtt77
-rw-r--r--2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.vtt1309
-rw-r--r--2022/cfp.md229
-rw-r--r--2022/cfp.org242
-rw-r--r--2022/decisions.md90
-rw-r--r--2022/decisions/index.org327
-rw-r--r--2022/decisions/index.org_archive462
-rw-r--r--2022/decisions/schedule-option-back-to-one.svg1
-rw-r--r--2022/decisions/schedule-option-gen-and-dev-aligned.svg1
-rw-r--r--2022/decisions/schedule-option-gen-and-dev.svg1
-rw-r--r--2022/decisions/schedule-option-gen-to-specific.svg1
-rw-r--r--2022/decisions/schedule-option-non-round-buffer.svg1
-rw-r--r--2022/decisions/schedule-option-one-afternoon-track.svg1
-rw-r--r--2022/decisions/schedule-option-one-full-day.svg1
-rw-r--r--2022/decisions/schedule-option-only-live-qa.svg1
-rw-r--r--2022/decisions/schedule-option-two-afternoon-tracks.svg1
-rw-r--r--2022/draft-schedule.md53
-rw-r--r--2022/ideas.md13
-rw-r--r--2022/info/asmblox-after.md306
-rw-r--r--2022/info/asmblox-before.md44
-rw-r--r--2022/info/asmblox-nav.md7
-rw-r--r--2022/info/async-after.md396
-rw-r--r--2022/info/async-before.md39
-rw-r--r--2022/info/async-nav.md7
-rw-r--r--2022/info/buddy-after.md156
-rw-r--r--2022/info/buddy-before.md16
-rw-r--r--2022/info/buddy-nav.md7
-rw-r--r--2022/info/buttons-after.md238
-rw-r--r--2022/info/buttons-before.md50
-rw-r--r--2022/info/buttons-nav.md7
-rw-r--r--2022/info/community-after.md7
-rw-r--r--2022/info/community-before.md16
-rw-r--r--2022/info/community-nav.md7
-rw-r--r--2022/info/dbus-after.md378
-rw-r--r--2022/info/dbus-before.md62
-rw-r--r--2022/info/dbus-nav.md7
-rw-r--r--2022/info/detached-after.md182
-rw-r--r--2022/info/detached-before.md50
-rw-r--r--2022/info/detached-nav.md7
-rw-r--r--2022/info/devel-after.md133
-rw-r--r--2022/info/devel-before.md21
-rw-r--r--2022/info/devel-nav.md7
-rw-r--r--2022/info/eev-after.md173
-rw-r--r--2022/info/eev-before.md18
-rw-r--r--2022/info/eev-nav.md7
-rw-r--r--2022/info/eshell-after.md253
-rw-r--r--2022/info/eshell-before.md52
-rw-r--r--2022/info/eshell-nav.md7
-rw-r--r--2022/info/fanfare-after.md273
-rw-r--r--2022/info/fanfare-before.md57
-rw-r--r--2022/info/fanfare-nav.md7
-rw-r--r--2022/info/grail-after.md645
-rw-r--r--2022/info/grail-before.md33
-rw-r--r--2022/info/grail-nav.md7
-rw-r--r--2022/info/handwritten-after.md123
-rw-r--r--2022/info/handwritten-before.md50
-rw-r--r--2022/info/handwritten-nav.md7
-rw-r--r--2022/info/haskell-after.md466
-rw-r--r--2022/info/haskell-before.md63
-rw-r--r--2022/info/haskell-nav.md7
-rw-r--r--2022/info/health-after.md423
-rw-r--r--2022/info/health-before.md56
-rw-r--r--2022/info/health-nav.md7
-rw-r--r--2022/info/hyperorg-after.md7
-rw-r--r--2022/info/hyperorg-before.md12
-rw-r--r--2022/info/hyperorg-nav.md7
-rw-r--r--2022/info/indieweb-after.md364
-rw-r--r--2022/info/indieweb-before.md62
-rw-r--r--2022/info/indieweb-nav.md7
-rw-r--r--2022/info/journalism-after.md277
-rw-r--r--2022/info/journalism-before.md45
-rw-r--r--2022/info/journalism-nav.md7
-rw-r--r--2022/info/jupyter-after.md270
-rw-r--r--2022/info/jupyter-before.md52
-rw-r--r--2022/info/jupyter-nav.md7
-rw-r--r--2022/info/justl-after.md290
-rw-r--r--2022/info/justl-before.md22
-rw-r--r--2022/info/justl-nav.md7
-rw-r--r--2022/info/links-after.md5
-rw-r--r--2022/info/links-before.md2
-rw-r--r--2022/info/links-nav.md7
-rw-r--r--2022/info/localizing-after.md248
-rw-r--r--2022/info/localizing-before.md30
-rw-r--r--2022/info/localizing-nav.md7
-rw-r--r--2022/info/lspbridge-after.md332
-rw-r--r--2022/info/lspbridge-before.md4
-rw-r--r--2022/info/lspbridge-nav.md7
-rw-r--r--2022/info/mail-after.md581
-rw-r--r--2022/info/mail-before.md64
-rw-r--r--2022/info/mail-nav.md7
-rw-r--r--2022/info/maint-after.md400
-rw-r--r--2022/info/maint-before.md60
-rw-r--r--2022/info/maint-nav.md7
-rw-r--r--2022/info/meetups-after.md899
-rw-r--r--2022/info/meetups-before.md63
-rw-r--r--2022/info/meetups-nav.md7
-rw-r--r--2022/info/news-after.md5
-rw-r--r--2022/info/news-before.md17
-rw-r--r--2022/info/news-nav.md2
-rw-r--r--2022/info/orgsuperlinks-after.md184
-rw-r--r--2022/info/orgsuperlinks-before.md51
-rw-r--r--2022/info/orgsuperlinks-nav.md7
-rw-r--r--2022/info/orgvm-after.md746
-rw-r--r--2022/info/orgvm-before.md46
-rw-r--r--2022/info/orgvm-nav.md7
-rw-r--r--2022/info/orgyear-after.md406
-rw-r--r--2022/info/orgyear-before.md29
-rw-r--r--2022/info/orgyear-nav.md7
-rw-r--r--2022/info/python-after.md298
-rw-r--r--2022/info/python-before.md18
-rw-r--r--2022/info/python-nav.md7
-rw-r--r--2022/info/rde-after.md391
-rw-r--r--2022/info/rde-before.md52
-rw-r--r--2022/info/rde-nav.md7
-rw-r--r--2022/info/realestate-after.md593
-rw-r--r--2022/info/realestate-before.md40
-rw-r--r--2022/info/realestate-nav.md7
-rw-r--r--2022/info/rms-after.md260
-rw-r--r--2022/info/rms-before.md78
-rw-r--r--2022/info/rms-nav.md7
-rw-r--r--2022/info/rolodex-after.md453
-rw-r--r--2022/info/rolodex-before.md32
-rw-r--r--2022/info/rolodex-nav.md7
-rw-r--r--2022/info/sat-close-after.md7
-rw-r--r--2022/info/sat-close-before.md4
-rw-r--r--2022/info/sat-close-nav.md7
-rw-r--r--2022/info/sat-open-after.md89
-rw-r--r--2022/info/sat-open-before.md15
-rw-r--r--2022/info/sat-open-nav.md6
-rw-r--r--2022/info/school-after.md137
-rw-r--r--2022/info/school-before.md16
-rw-r--r--2022/info/school-nav.md7
-rw-r--r--2022/info/science-after.md399
-rw-r--r--2022/info/science-before.md58
-rw-r--r--2022/info/science-nav.md7
-rw-r--r--2022/info/sqlite-after.md451
-rw-r--r--2022/info/sqlite-before.md57
-rw-r--r--2022/info/sqlite-nav.md7
-rw-r--r--2022/info/sun-close-after.md7
-rw-r--r--2022/info/sun-close-before.md4
-rw-r--r--2022/info/sun-close-nav.md6
-rw-r--r--2022/info/sun-open-after.md7
-rw-r--r--2022/info/sun-open-before.md4
-rw-r--r--2022/info/sun-open-nav.md7
-rw-r--r--2022/info/survey-after.md538
-rw-r--r--2022/info/survey-before.md28
-rw-r--r--2022/info/survey-nav.md7
-rw-r--r--2022/info/tramp-after.md7
-rw-r--r--2022/info/tramp-before.md16
-rw-r--r--2022/info/tramp-nav.md7
-rw-r--r--2022/info/treesitter-after.md257
-rw-r--r--2022/info/treesitter-before.md21
-rw-r--r--2022/info/treesitter-nav.md7
-rw-r--r--2022/info/watch.md9
-rw-r--r--2022/info/wayland-after.md163
-rw-r--r--2022/info/wayland-before.md10
-rw-r--r--2022/info/wayland-nav.md7
-rw-r--r--2022/info/workflows-after.md451
-rw-r--r--2022/info/workflows-before.md56
-rw-r--r--2022/info/workflows-nav.md7
-rw-r--r--2022/meetings.org21
-rw-r--r--2022/organizers-notebook.bash10
-rw-r--r--2022/organizers-notebook.md8533
-rw-r--r--2022/organizers-notebook/emergency-back-to-one-sat-pm.svg1
-rw-r--r--2022/organizers-notebook/emergency-back-to-one-sun-am.svg1
-rw-r--r--2022/organizers-notebook/emergency-back-to-one-sun-pm.svg1
-rw-r--r--2022/organizers-notebook/index.org8712
-rw-r--r--2022/organizers-notebook/schedule.svg1
-rw-r--r--2022/planning.md25
-rw-r--r--2022/prepare.md301
-rw-r--r--2022/qa.md43
-rw-r--r--2022/schedule-2022-12-03.md1
-rw-r--r--2022/schedule-2022-12-04.md1
-rw-r--r--2022/schedule-details.md54
-rw-r--r--2022/schedule-image.md1
-rw-r--r--2022/schedule.svg1
-rw-r--r--2022/sidebar.md11
-rw-r--r--2022/speakers.md98
-rw-r--r--2022/submit.md107
-rw-r--r--2022/talks.md26
-rw-r--r--2022/talks/asmblox.md94
-rw-r--r--2022/talks/async.md103
-rw-r--r--2022/talks/buddy.md100
-rw-r--r--2022/talks/buttons.md108
-rw-r--r--2022/talks/community.md57
-rw-r--r--2022/talks/dbus.md173
-rw-r--r--2022/talks/detached.md89
-rw-r--r--2022/talks/devel.md73
-rw-r--r--2022/talks/eev.md71
-rw-r--r--2022/talks/eshell.md156
-rw-r--r--2022/talks/fanfare.md179
-rw-r--r--2022/talks/grail.md322
-rw-r--r--2022/talks/handwritten.md138
-rw-r--r--2022/talks/haskell.md45
-rw-r--r--2022/talks/health.md105
-rw-r--r--2022/talks/hyperorg.md160
-rw-r--r--2022/talks/indieweb.md132
-rw-r--r--2022/talks/journalism.md208
-rw-r--r--2022/talks/jupyter.md102
-rw-r--r--2022/talks/justl.md42
-rw-r--r--2022/talks/links.md2
-rw-r--r--2022/talks/localizing.md53
-rw-r--r--2022/talks/lspbridge.md143
-rw-r--r--2022/talks/mail.md153
-rw-r--r--2022/talks/maint.md249
-rw-r--r--2022/talks/meetups.md81
-rw-r--r--2022/talks/orgsuperlinks.md196
-rw-r--r--2022/talks/orgvm.md45
-rw-r--r--2022/talks/orgyear.md129
-rw-r--r--2022/talks/python.md69
-rw-r--r--2022/talks/rde.md105
-rw-r--r--2022/talks/realestate.md91
-rw-r--r--2022/talks/rms.md433
-rw-r--r--2022/talks/rolodex.md298
-rw-r--r--2022/talks/sat-close.md50
-rw-r--r--2022/talks/sat-open.md22
-rw-r--r--2022/talks/schedule-2022-12-03.svg1
-rw-r--r--2022/talks/schedule-2022-12-04.svg1
-rw-r--r--2022/talks/school.md102
-rw-r--r--2022/talks/science.md167
-rw-r--r--2022/talks/sqlite.md175
-rw-r--r--2022/talks/sun-close.md253
-rw-r--r--2022/talks/sun-open.md23
-rw-r--r--2022/talks/survey.md160
-rw-r--r--2022/talks/tramp.md28
-rw-r--r--2022/talks/treesitter.md121
-rw-r--r--2022/talks/wayland.md122
-rw-r--r--2022/talks/workflows.md56
-rw-r--r--2022/upload.md100
-rw-r--r--2022/volunteer.md35
-rw-r--r--2022/volunteer/caption.md63
-rw-r--r--2022/volunteer/checkin.md118
-rw-r--r--2022/volunteer/host.md111
-rw-r--r--2022/volunteer/irc.md82
-rw-r--r--2022/volunteer/pad.md83
-rw-r--r--2022/watch-dev.md45
-rw-r--r--2022/watch-gen.md52
-rw-r--r--2022/watch.md68
-rw-r--r--2022/watch/announce.md6
-rw-r--r--2022/watch/dev.md151
-rw-r--r--2022/watch/gen.md200
-rw-r--r--2022/watch/info.md7
344 files changed, 118310 insertions, 0 deletions
diff --git a/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.vtt b/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.vtt
new file mode 100644
index 00000000..3bccf8fb
--- /dev/null
+++ b/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.vtt
@@ -0,0 +1,411 @@
+WEBVTT
+
+NOTE
+Introduction
+
+00:00:00.000 --> 00:00:05.799
+[Amin]: All right. Hey, everyone. Thanks, Zach, for the great talk. Here is a live Q&A.
+
+00:00:05.800 --> 00:00:12.399
+People can start putting the questions onto the pad, and Zach will answer them.
+
+00:00:12.400 --> 00:00:15.007
+Zach, take it away. Thanks, Zach. Here is a live Q&A.
+
+00:00:15.008 --> 00:01:12.599
+[Zach]: Okay. So, first question. Let's see.
+
+NOTE Why did you choose an internal state versus many 'state buffers'?
+
+00:01:12.600 --> 00:01:16.039
+Okay. So, the first question is why did you choose an internal state
+
+00:01:16.040 --> 00:01:22.959
+versus many state buffers? So, the main reason was more control
+
+00:01:22.960 --> 00:01:29.599
+from the game perspective. I mean, if this was to be a tool,
+
+00:01:29.600 --> 00:01:35.519
+if this was to be a tool that perhaps was used for more, like,
+
+00:01:35.520 --> 00:01:41.479
+real-world applications where maybe you'd want users to be able to, like,
+
+00:01:41.480 --> 00:01:43.399
+use any of their preexisting
+
+00:01:43.400 --> 00:01:48.559
+— like, if you wanted to really make a grid of cells that would —
+
+00:01:48.560 --> 00:01:53.639
+so, then I think maybe using real buffers in that case
+
+00:01:53.640 --> 00:01:56.199
+would probably be the better thing since you wouldn't have to, like,
+
+00:01:56.200 --> 00:02:04.239
+redo everything. But I found that just, like, centralizing the state
+
+00:02:04.240 --> 00:02:10.719
+into one place for the game at least made it the easiest to implement.
+
+NOTE Do you have plans to port shenzhen.io to Emacs?
+
+00:02:10.720 --> 00:02:14.079
+Next one. Do you have plans to port Shenzhen I.O. to Emacs?
+
+00:02:14.080 --> 00:02:19.559
+Well, I was actually thinking about exopunks, perhaps,
+
+00:02:19.560 --> 00:02:26.599
+but Shenzhen I.O. would be pretty cool to add as well.
+
+00:02:26.600 --> 00:02:29.959
+So, this doesn't use any Wasm at all.
+
+NOTE Did this use WASM?
+
+00:02:29.960 --> 00:02:33.799
+So, the next question is, did this use Wasm?
+
+00:02:33.800 --> 00:02:41.999
+So, it's asking about, like, using Wasm Emacs. So, this actually —
+
+00:02:42.000 --> 00:02:45.239
+this doesn't use any Wasm under the hood.
+
+00:02:45.240 --> 00:02:49.639
+It's pretty much analogous to the game TIS 100 is to real assembly
+
+00:02:49.640 --> 00:02:59.799
+as this game is to web assembly. Slight resemblance, but, yeah, just a game.
+
+NOTE Why wasm rather than a more traditional Assembly dialect? It wouldn't be harder to implement, right?
+
+00:02:59.800 --> 00:03:06.039
+So, okay, so the next question is why Wasm
+
+00:03:06.040 --> 00:03:09.359
+rather than a more traditional assembly dialect?
+
+00:03:09.360 --> 00:03:11.799
+It wouldn't be harder to implement, right?
+
+00:03:11.800 --> 00:03:16.919
+So, it would actually probably have been easier, in all honesty, just because,
+
+00:03:16.920 --> 00:03:20.679
+you know, more traditional — like, TIS 100, for example.
+
+00:03:20.680 --> 00:03:24.599
+You have each of the — you have each instruction on a line,
+
+00:03:24.600 --> 00:03:29.519
+and it's pretty easy to, you know, syntax hiding just one line.
+
+00:03:29.520 --> 00:03:32.599
+So, this with the weird S expressions across the line, deeply nested,
+
+00:03:32.600 --> 00:03:37.239
+and then, like, the step debugger thing and these weird cell things.
+
+00:03:37.240 --> 00:03:40.239
+They made things really complicated, but I definitely wanted to, like —
+
+00:03:40.240 --> 00:03:47.559
+the main reason is I didn't — I wanted it to not — to look as least as —
+
+00:03:47.560 --> 00:03:52.919
+to look — to resemble TIS 100 as little as possible,
+
+00:03:52.920 --> 00:03:54.399
+even though it's still pretty much the same game.
+
+00:03:54.400 --> 00:04:44.439
+[Amin]: Thanks, Zach. I think we still have about, like, eight minutes or so.
+
+00:04:44.440 --> 00:04:46.159
+Or eight and a half minutes of Q&A time.
+
+00:04:46.160 --> 00:04:47.919
+So, folks, if you do have any other questions,
+
+00:04:47.920 --> 00:04:50.119
+please do keep them coming in the pad, and, yeah,
+
+00:04:50.120 --> 00:04:53.079
+Zach will continue answering them.
+
+00:04:53.080 --> 00:05:08.959
+[Zach]: Sounds good. Thank you.
+
+NOTE Any next projects on your mind?
+
+00:05:08.960 --> 00:05:11.399
+So, next question. Any next projects on your mind?
+
+00:05:11.400 --> 00:05:15.679
+Yeah, actually, I have a couple ideas for projects,
+
+00:05:15.680 --> 00:05:21.639
+and these would all be, hopefully, maybe more useful.
+
+00:05:21.640 --> 00:05:24.119
+I think TreeSitter is pretty
+
+00:05:24.120 --> 00:05:28.639
+cool. I think there's a lot of directions that I could go, like,
+
+00:05:28.640 --> 00:05:34.639
+there's a plugin in NeoVim called NeoGen, which generates documentation.
+
+00:05:34.640 --> 00:05:41.359
+That would be cool. I've been playing with this. What else?
+
+00:05:41.360 --> 00:05:45.559
+Yeah, I mean, hopefully, next year, at next the Emacs conference,
+
+00:05:45.560 --> 00:05:52.679
+I could be presenting something more useful.
+
+NOTE Does this work with any other paren-based editing packages?
+
+00:05:52.680 --> 00:05:57.479
+Next question. Does this work with any other paren-based editing packages?
+
+00:05:57.480 --> 00:06:02.759
+Not at all. Not at all. In fact, just because of the way the buffer was set up,
+
+00:06:02.760 --> 00:06:07.999
+how it's just, like, the illusion of a buffer, like, not even, like,
+
+00:06:08.000 --> 00:06:17.119
+the syntax parsing works correctly, because just because everything's, like,
+
+00:06:17.120 --> 00:06:19.239
+the way the grids are set up, like, you have, like,
+
+00:06:19.240 --> 00:06:23.839
+the other cells kind of interfering with the way that parse is.
+
+00:06:23.840 --> 00:06:29.799
+But the way it was architected, it's actually a really simple macro.
+
+00:06:29.800 --> 00:06:33.159
+There's a little macro called, like, run in buffer.
+
+00:06:33.160 --> 00:06:37.279
+You have, like, run in buffer, and then you put your elist code,
+
+00:06:37.280 --> 00:06:42.439
+and then it tries to create the illusion that it's actually running
+
+00:06:42.440 --> 00:06:46.919
+in a real buffer. So this macro kind of does all the configuration setup.
+
+NOTE What kind of tool could use this idea?
+
+00:06:46.920 --> 00:06:55.839
+So, I mean, maybe with, like, more configuration settings,
+
+00:06:55.840 --> 00:06:58.399
+maybe something like that could have been done.
+
+00:06:58.400 --> 00:07:04.239
+So next question. What kind of tool could you use this idea?
+
+00:07:04.240 --> 00:07:09.479
+Oh, going back to the next project on your mind.
+
+00:07:09.480 --> 00:07:12.639
+This actually came up to my mind as, like, a graphical.
+
+00:07:12.640 --> 00:07:21.359
+So, in terms of, like, there's a lot of graphing tools, like ASCII.
+
+00:07:21.360 --> 00:07:25.679
+So, like, you type in some text representation, it generates an ASCII document.
+
+00:07:25.680 --> 00:07:28.599
+I think it would be really cool to have, like,
+
+00:07:28.600 --> 00:07:31.079
+an Emacs package that sort of works, like,
+
+00:07:31.080 --> 00:07:35.519
+those online really slick graph drawing tools.
+
+00:07:35.520 --> 00:07:40.919
+So, like, you can just press tab, and it draws a new box with an ASCII arrow,
+
+00:07:40.920 --> 00:07:43.759
+and then, like, it can create these diagrams really easy.
+
+00:07:43.760 --> 00:07:46.359
+I think that would be a really cool project.
+
+00:07:46.360 --> 00:07:52.039
+And so, something like that, obviously, like, you have different cells.
+
+00:07:52.040 --> 00:07:56.279
+And so, that's actually another thing I think would be cool to work on.
+
+NOTE How did you go about designing the puzzles?
+
+00:07:56.280 --> 00:08:04.039
+So, designing puzzles. So, it's funny.
+
+00:08:04.040 --> 00:08:07.879
+If you listen to Zach Barth's talk about TS100,
+
+00:08:07.880 --> 00:08:12.759
+he goes into, like, you pretty just, like, you pretty just,
+
+00:08:12.760 --> 00:08:16.159
+it's just like you make up a puzzle you think could work,
+
+00:08:16.160 --> 00:08:18.279
+and chances are it does end up working.
+
+00:08:18.280 --> 00:08:23.959
+And that's how I roll, at least my custom puzzles in the game, just, like,
+
+00:08:23.960 --> 00:08:28.599
+come up with some random idea, think it probably should work,
+
+00:08:28.600 --> 00:08:35.839
+and then try to go implementing it. And usually, it's implementable.
+
+00:08:35.840 --> 00:08:39.319
+I mean, four by three boxes, you can do quite a bit.
+
+NOTE What are your favorite changes in the upcoming Emacs 29?
+
+00:08:39.320 --> 00:08:44.119
+And I don't put any restrictions on the cells, like, TS100.
+
+00:08:44.120 --> 00:08:47.719
+What are your favorite changes in the upcoming Emacs 29?
+
+00:08:47.720 --> 00:08:50.479
+So, definitely TreeSitter is pretty cool.
+
+00:08:50.480 --> 00:08:55.679
+Just because, like, you have syntax, you have access to that.
+
+00:08:55.680 --> 00:08:59.719
+You can build syntax-aware extensions.
+
+00:08:59.720 --> 00:09:03.559
+So, like, I was just I was playing around with it, and it's pretty cool.
+
+00:09:03.560 --> 00:09:07.479
+You can just, like, get the syntax tree and search for syntax patterns.
+
+NOTE Are there tools to add more puzzles?
+
+00:09:07.480 --> 00:09:25.199
+So, it's exciting to see what might be done with that.
+
+00:09:25.200 --> 00:09:28.879
+Are there tools to add more puzzles? So, there's not tools,
+
+00:09:28.880 --> 00:09:35.959
+but in the code itself, there's a file called azimbox puzzles.
+
+00:09:35.960 --> 00:09:39.079
+And it's pretty much just, like, you have a generator function.
+
+00:09:39.080 --> 00:09:43.079
+You configure it's just, like, you're pretty much defining a struct.
+
+00:09:43.080 --> 00:09:45.679
+So, I mean, if you're familiar with the Emax list,
+
+00:09:45.680 --> 00:09:47.959
+you can kind of define puzzles pretty easily.
+
+00:09:47.960 --> 00:09:54.279
+Define where your inputs are, generate a function to generate these inputs,
+
+00:09:54.280 --> 00:09:57.799
+and then a generator function to generate which outputs you want.
+
+00:09:57.800 --> 00:10:02.159
+So, it's pretty, I mean, code-wise, it's pretty self-contained.
+
+00:10:02.160 --> 00:10:10.239
+But yeah, maybe I could have done, like, a more streamlined job with that.
+
+00:10:10.240 --> 00:10:17.159
+Like, a binding to graph is? Oh, yeah, with the graph thing I was mentioning.
+
+00:10:17.160 --> 00:10:23.479
+So, that would also actually be pretty cool, too. But I was thinking more just,
+
+00:10:23.480 --> 00:10:31.119
+like, plain ASCII graphs. Just, like, you already have just, like, so,
+
+00:10:31.120 --> 00:10:33.439
+a tool I've seen recently is called Diagon.
+
+00:10:33.440 --> 00:10:38.079
+So, you basically type in, like, some really, like,
+
+00:10:38.080 --> 00:10:41.759
+a textual representation of the graph, like, A arrow B, B arrow C,
+
+00:10:41.760 --> 00:10:44.079
+and it generates, like, an ASCII diagram.
+
+00:10:44.080 --> 00:10:52.799
+So, something like that would be cool, like, so, like, you have, like,
+
+00:10:52.800 --> 00:11:01.839
+a grid of, like, little nodes, and control F maybe brings you to the next one,
+
+00:11:01.840 --> 00:11:07.279
+and maybe tab, maybe would create a new node with a new ASCII
+
+00:11:07.280 --> 00:11:20.879
+arrow to it. That would be a cool, that would be a really cool extension.
+
+00:11:20.880 --> 00:11:25.319
+But, yeah, I mean, obviously, graph is an amazing tool.
+
+00:11:25.320 --> 00:11:28.079
+So, a lot could be done with that as well.
+
+00:11:28.080 --> 00:12:49.679
+[Amin]: I think we have about, like, a minute or a minute and a half of live questions.
+
+00:12:49.680 --> 00:12:50.719
+We are opening the Q&A, this BB room for people to join.
+
+00:12:50.720 --> 00:12:51.759
+So, folks who want to do that are welcome to do so.
+
+00:12:51.760 --> 00:12:52.199
+And, yeah, after that, the stream will move on.
+
+00:12:52.200 --> 00:12:52.359
+But you can still come in this BB room or keep asking questions on the web.
+
+00:12:52.360 --> 00:12:53.439
+Okay. I think that's about all the time that we have on the stream.
+
+00:12:53.440 --> 00:12:55.079
+Thanks again, Zach, so much, and both for the Q&A and for your great talk,
+
+00:12:55.080 --> 00:12:57.319
+and see you all around. Thank you.
+
+00:12:57.320 --> 00:12:58.239
+Cheers.
+
+00:12:58.240 --> 00:12:58.359
+[Zach]: Thank you.
+
+00:12:58.360 --> 00:14:19.200
+You are currently the only person in this conference.
diff --git a/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt b/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt
new file mode 100644
index 00000000..6124054e
--- /dev/null
+++ b/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt
@@ -0,0 +1,52 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:30.680
+Introduction
+
+00:00:30.680 --> 00:00:44.960
+TIS-100
+
+00:00:44.960 --> 00:01:08.040
+WebAssembly
+
+00:01:08.040 --> 00:02:07.640
+Basic stack operations
+
+00:02:07.640 --> 00:02:44.680
+Numeric commands
+
+00:02:44.680 --> 00:03:21.400
+Boolean operations
+
+00:03:21.400 --> 00:04:00.240
+Port operations
+
+00:04:00.240 --> 00:05:15.720
+Control flow
+
+00:05:15.720 --> 00:06:14.480
+Modules
+
+00:06:14.480 --> 00:08:33.040
+Puzzle
+
+00:08:33.040 --> 00:09:35.200
+The game loop
+
+00:09:35.200 --> 00:11:25.880
+Tic-tac-toe
+
+00:11:25.880 --> 00:12:07.800
+Text properties
+
+00:12:07.800 --> 00:14:00.920
+Code cells
+
+00:14:00.920 --> 00:14:37.560
+Undo
+
+00:14:37.560 --> 00:14:52.360
+Parentheses
+
+00:14:52.360 --> 00:16:07.440
+Assembly text to executable code
diff --git a/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt b/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt
new file mode 100644
index 00000000..ef640bf3
--- /dev/null
+++ b/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt
@@ -0,0 +1,874 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:03.800
+Hi, I'm Zach and today I'll be giving
+
+00:00:03.800 --> 00:00:05.320
+a presentation on asm-blox,
+
+00:00:05.320 --> 00:00:08.960
+a programming game inspired by WebAssembly.
+
+00:00:08.960 --> 00:00:10.840
+So programming games came into prominence
+
+00:00:10.840 --> 00:00:13.160
+about a decade ago and are loved for providing
+
+00:00:13.160 --> 00:00:14.760
+interesting programming challenges
+
+00:00:14.760 --> 00:00:17.160
+without all the messiness of real world programming.
+
+00:00:17.160 --> 00:00:19.960
+I wanted to make a programming game
+
+00:00:19.960 --> 00:00:24.880
+and I decided to base it off of TIS-100,
+
+00:00:24.880 --> 00:00:28.240
+having a pretty basic UI.
+
+00:00:28.240 --> 00:00:30.680
+It seemed pretty doable in Emacs.
+
+00:00:30.680 --> 00:00:33.160
+TIS 100 is a programming game
+
+00:00:33.160 --> 00:00:35.760
+where you write a fictional assembly language
+
+00:00:35.760 --> 00:00:37.280
+into a grid of cells which can each
+
+00:00:37.280 --> 00:00:39.480
+communicate with one another,
+
+00:00:39.480 --> 00:00:41.200
+you're tasked with solving
+
+00:00:41.200 --> 00:00:44.960
+fairly simple CS 101 like problems.
+
+00:00:44.960 --> 00:00:48.440
+To mix things up a bit I decided to base
+
+00:00:48.440 --> 00:00:49.800
+the language of asm-blox off of
+
+00:00:49.800 --> 00:00:52.520
+WebAssembly, which is stack based,
+
+00:00:52.520 --> 00:00:55.360
+as opposed to TIS-100 which is registered based.
+
+00:00:55.360 --> 00:00:59.200
+Here you can see the same program
+
+00:00:59.200 --> 00:01:01.680
+written in the game TIS-100,
+
+00:01:01.680 --> 00:01:03.960
+what it looks like in asm-blox,
+
+00:01:03.960 --> 00:01:08.040
+and the original WebAssembly that it's based off of.
+
+00:01:08.040 --> 00:01:10.640
+With that said, let's get into a demo.
+
+00:01:10.640 --> 00:01:12.240
+This is the game board.
+
+00:01:12.240 --> 00:01:14.120
+It's a 4 by 3 grid.
+
+00:01:14.120 --> 00:01:16.840
+Each cell has a stack of size 4.
+
+00:01:16.840 --> 00:01:20.280
+First off, I'll show some of the stack editing commands.
+
+00:01:20.280 --> 00:01:23.760
+We can add a value with the const function.
+
+00:01:23.760 --> 00:01:27.480
+Here we're adding two values to this stack
+
+00:01:27.480 --> 00:01:33.400
+to get added, and eventually the stack gets overflowed.
+
+00:01:33.400 --> 00:01:37.360
+We can fix that as follows with the clear command,
+
+00:01:37.360 --> 00:01:40.720
+so that clears the stack.
+
+00:01:40.720 --> 00:01:43.200
+We can duplicate values on the stack.
+
+00:01:43.200 --> 00:01:45.600
+This duplicates the item at the bottom of the stack.
+
+00:01:45.600 --> 00:01:48.880
+10 gets put on, 20 gets put on,
+
+00:01:48.880 --> 00:01:50.200
+then 10 will get duplicated
+
+00:01:50.200 --> 00:01:52.680
+and put on the top of the stack.
+
+00:01:52.680 --> 00:01:55.920
+We can increment. For example, this increments
+
+00:01:55.920 --> 00:01:58.760
+the second to bottom, the second to bottom
+
+00:01:58.760 --> 00:01:59.920
+from the stack.
+
+00:01:59.920 --> 00:02:04.400
+So 10, 20, increment that, clear.
+
+00:02:04.400 --> 00:02:07.640
+That's basic stack operations.
+
+00:02:07.640 --> 00:02:11.000
+Next up, we have numeric commands.
+
+00:02:11.000 --> 00:02:12.560
+For example, here, if we add "add",
+
+00:02:12.560 --> 00:02:14.680
+it pops two values off the stack,
+
+00:02:14.680 --> 00:02:17.080
+adds them, and pushes the result on.
+
+00:02:17.080 --> 00:02:20.680
+Another way we can write this is as follows.
+
+00:02:20.680 --> 00:02:22.480
+We can have the add here
+
+00:02:22.480 --> 00:02:26.400
+and then nest the two constants,
+
+00:02:26.400 --> 00:02:28.520
+and then this does the same thing.
+
+00:02:28.520 --> 00:02:31.720
+First, the inner constant operations run,
+
+00:02:31.720 --> 00:02:35.520
+and then the outer add operation runs.
+
+00:02:35.520 --> 00:02:40.280
+We can nest as deeply as we want.
+
+00:02:40.280 --> 00:02:44.680
+There's also subtraction, multiplication, and whatnot.
+
+00:02:44.680 --> 00:02:46.480
+Next up are Boolean operations.
+
+00:02:46.480 --> 00:02:49.080
+Zero counts as true.
+
+00:02:49.080 --> 00:02:51.720
+Anything else--sorry, zero counts as false.
+
+00:02:51.720 --> 00:02:52.760
+Anything else is true.
+
+00:02:52.760 --> 00:03:01.840
+For example, this would give us false and true,
+
+00:03:01.840 --> 00:03:04.040
+so that result should be false.
+
+00:03:04.040 --> 00:03:06.120
+Zero gets put on the stack,
+
+00:03:06.120 --> 00:03:08.160
+one gets put on, and then the "and" operation.
+
+00:03:08.160 --> 00:03:12.840
+So there's also or, not,
+
+00:03:12.840 --> 00:03:17.760
+and various numerical comparison operations
+
+00:03:17.760 --> 00:03:21.400
+like greater than and less than.
+
+00:03:21.400 --> 00:03:22.880
+Next up are the port operations.
+
+00:03:22.880 --> 00:03:27.320
+We can send values to other cells as follows.
+
+00:03:27.320 --> 00:03:29.600
+Here we create a value
+
+00:03:29.600 --> 00:03:33.640
+and then send it right.
+
+00:03:33.640 --> 00:03:35.040
+Let's run this.
+
+00:03:35.040 --> 00:03:37.480
+The 10 goes on the stack,
+
+00:03:37.480 --> 00:03:38.480
+and then it gets sent to the right.
+
+00:03:38.480 --> 00:03:41.360
+Here it's waiting for this cell to pick it up.
+
+00:03:41.360 --> 00:03:44.360
+It can pick it up just as follows.
+
+00:03:44.360 --> 00:03:47.480
+So left... and then why don't we have it
+
+00:03:47.480 --> 00:03:49.520
+drop that value after it gets it.
+
+00:03:49.520 --> 00:03:53.920
+So the 10 gets sent to the right.
+
+00:03:53.920 --> 00:04:00.240
+This one picks it up and drops it.
+
+00:04:00.240 --> 00:04:03.200
+Lastly, we have control flow,
+
+00:04:03.200 --> 00:04:04.280
+which is a bit tricky,
+
+00:04:04.280 --> 00:04:06.880
+but with this visual,
+
+00:04:06.880 --> 00:04:08.440
+it helps explain it.
+
+00:04:08.440 --> 00:04:12.280
+There are two block constructs, "block" and "loop",
+
+00:04:12.280 --> 00:04:16.880
+and there's two jumping constructs, "br" and "brif".
+
+00:04:16.880 --> 00:04:23.120
+So if "loop" is jumped to,
+
+00:04:23.120 --> 00:04:25.360
+the control flow goes to the beginning,
+
+00:04:25.360 --> 00:04:26.520
+the top of the loop.
+
+00:04:26.520 --> 00:04:28.640
+If a block is jumped to,
+
+00:04:28.640 --> 00:04:31.520
+it goes to the end of the block,
+
+00:04:31.520 --> 00:04:33.640
+and these various blocks
+
+00:04:33.640 --> 00:04:36.520
+are identified by their level of nestedness.
+
+00:04:36.520 --> 00:04:40.640
+From the point of view of this jump statement,
+
+00:04:40.640 --> 00:04:45.160
+this "br" statement, this is block level 0,
+
+00:04:45.160 --> 00:04:46.440
+this is 1, this is 2.
+
+00:04:46.440 --> 00:04:49.560
+So here, "br 1" would be referring to this loop.
+
+00:04:49.560 --> 00:04:51.080
+What this [br 1] would do is,
+
+00:04:51.080 --> 00:04:54.000
+it would jump to this loop right here.
+
+00:04:54.000 --> 00:04:57.360
+If we were to do this [br 2], what this would do is,
+
+00:04:57.360 --> 00:05:02.680
+this would jump past this block right here.
+
+00:05:02.680 --> 00:05:09.880
+So as another example, this right here,
+
+00:05:09.880 --> 00:05:15.720
+this is a loop that generates increasing numbers.
+
+00:05:15.720 --> 00:05:22.640
+Let's see. Next up, we have modules.
+
+00:05:22.640 --> 00:05:26.280
+This is an example of a stack module.
+
+00:05:26.280 --> 00:05:28.760
+In addition to stack, there's also heaps.
+
+00:05:28.760 --> 00:05:34.560
+What this does is it allows us to create
+
+00:05:34.560 --> 00:05:38.080
+an extra stack that we can push and pop items onto.
+
+00:05:38.080 --> 00:05:41.240
+This one can have as large size as we need.
+
+00:05:41.240 --> 00:05:43.800
+Here it has a size of 20.
+
+00:05:43.800 --> 00:05:46.400
+It's taking values from up
+
+00:05:46.400 --> 00:05:51.080
+and exposing those values on the left.
+
+00:05:51.080 --> 00:05:57.080
+This loop right here, it generates numbers,
+
+00:05:57.080 --> 00:05:59.160
+and it's putting them onto the stack.
+
+00:05:59.160 --> 00:06:00.920
+We can see here that those numbers
+
+00:06:00.920 --> 00:06:03.200
+are being exposed to this cell right here.
+
+00:06:03.200 --> 00:06:07.040
+It's just taking values, and eventually,
+
+00:06:07.040 --> 00:06:11.200
+it's going to overflow and cause an error.
+
+00:06:11.200 --> 00:06:14.480
+That finishes the basic commands.
+
+00:06:14.480 --> 00:06:16.480
+Why don't we try solving this puzzle.
+
+00:06:16.480 --> 00:06:21.320
+The puzzle description is right here.
+
+00:06:21.320 --> 00:06:23.280
+We want to read a value from I.
+
+00:06:23.280 --> 00:06:28.480
+Send 1 to G if I is greater than 0.
+
+00:06:28.480 --> 00:06:30.800
+Send 1 to E if it's equal to 0.
+
+00:06:30.800 --> 00:06:32.440
+Send 1 to L if it's less than 0.
+
+00:06:32.440 --> 00:06:35.360
+And then all the other ones, we send 0 to.
+
+00:06:35.360 --> 00:06:40.920
+First things first, let's send the value we get
+
+00:06:40.920 --> 00:06:44.400
+from the input down as follows.
+
+00:06:44.400 --> 00:06:49.680
+Let's send that value right.
+
+00:06:49.680 --> 00:06:51.240
+You get from up.
+
+00:06:51.240 --> 00:06:54.320
+Okay. So next, we're getting a value on the left.
+
+00:06:54.320 --> 00:06:58.040
+Now we want to compare if this number is greater than 0.
+
+00:06:58.040 --> 00:06:59.800
+If it's greater than 0, we send 1 to G.
+
+00:06:59.800 --> 00:07:03.280
+Let's perform the greater than operation
+
+00:07:03.280 --> 00:07:08.080
+on that item we just got, and we're comparing it to 0.
+
+00:07:08.080 --> 00:07:11.680
+Now that result, we're going to send down,
+
+00:07:11.680 --> 00:07:13.880
+and we're going to send this original value
+
+00:07:13.880 --> 00:07:16.880
+we got from here to the right.
+
+00:07:16.880 --> 00:07:19.000
+Here, we do a similar step.
+
+00:07:19.000 --> 00:07:20.240
+We get the value from the left,
+
+00:07:20.240 --> 00:07:22.920
+but this time, we have to do an equal operation.
+
+00:07:22.920 --> 00:07:25.760
+Is that number we got equal to 0?
+
+00:07:25.760 --> 00:07:28.960
+We send that result down,
+
+00:07:28.960 --> 00:07:32.880
+and then send this number to the right.
+
+00:07:32.880 --> 00:07:38.040
+Lastly, we get this number from the left.
+
+00:07:38.040 --> 00:07:42.400
+Here, we need to compare if it's less than 0.
+
+00:07:42.400 --> 00:07:45.640
+We send that result down,
+
+00:07:45.640 --> 00:07:50.280
+and now lastly, we drop that remaining value.
+
+00:07:50.280 --> 00:07:53.080
+Okay, let's--oh, and then lastly,
+
+00:07:53.080 --> 00:07:56.040
+we need to send down the value we get up.
+
+00:07:56.040 --> 00:08:02.560
+Send down, up, send down, up.
+
+00:08:02.560 --> 00:08:04.760
+Okay, so let's try running this.
+
+00:08:04.760 --> 00:08:08.920
+Let's see. We notice that
+
+00:08:08.920 --> 00:08:10.360
+the numbers are coming in from I.
+
+00:08:10.360 --> 00:08:14.200
+They're going through our various conditions
+
+00:08:14.200 --> 00:08:18.160
+and should be sending all the correct values.
+
+00:08:18.160 --> 00:08:23.560
+It looks like we're not getting any errors so far.
+
+00:08:23.560 --> 00:08:26.680
+Let's speed this up.
+
+00:08:26.680 --> 00:08:33.040
+That completes the puzzle.
+
+00:08:33.040 --> 00:08:42.000
+Now let's get into some of the implementation details.
+
+00:08:42.000 --> 00:08:46.320
+The first thing is the game loop.
+
+00:08:46.320 --> 00:08:50.560
+The game loop is... So this is actually extremely simple.
+
+00:08:50.560 --> 00:08:52.320
+All the state for the entire game
+
+00:08:52.320 --> 00:08:54.400
+is stored in just a few variables.
+
+00:08:54.400 --> 00:08:56.480
+There's one variable storing
+
+00:08:56.480 --> 00:09:01.400
+the text of each cell as a vector of strings.
+
+00:09:01.400 --> 00:09:06.280
+There's a single function
+
+00:09:06.280 --> 00:09:09.080
+that renders the entire game, the entire board.
+
+00:09:09.080 --> 00:09:11.120
+There's a single function that would render
+
+00:09:11.120 --> 00:09:13.920
+this entire screen based off of the state,
+
+00:09:13.920 --> 00:09:19.240
+and then the game waits for you to press a key.
+
+00:09:19.240 --> 00:09:24.120
+The key usually, depending on what action you perform,
+
+00:09:24.120 --> 00:09:27.040
+updates the state and causes a re-render.
+
+00:09:27.040 --> 00:09:29.360
+It's an extremely simple game loop,
+
+00:09:29.360 --> 00:09:32.800
+but it makes implementing it pretty easy.
+
+00:09:32.800 --> 00:09:35.200
+To demonstrate how this game loop works,
+
+00:09:35.200 --> 00:09:38.400
+I have a simple demo prepared.
+
+00:09:38.400 --> 00:09:41.880
+This is a game of tic-tac-toe.
+
+00:09:41.880 --> 00:09:44.800
+Let me show this real fast.
+
+00:09:44.800 --> 00:09:49.200
+It's an extremely simple implementation,
+
+00:09:49.200 --> 00:09:51.465
+but it follows the same principles
+
+00:09:51.466 --> 00:09:53.600
+that I used in asm-blox.
+
+00:09:53.600 --> 00:09:57.680
+First, we have the state defined in variables.
+
+00:09:57.680 --> 00:09:59.560
+Here we have two pieces of state.
+
+00:09:59.560 --> 00:10:01.600
+We have which player's turn it is
+
+00:10:01.600 --> 00:10:03.120
+and the state of the game board.
+
+00:10:03.120 --> 00:10:06.640
+The player turn can be nil if it's empty,
+
+00:10:06.640 --> 00:10:08.760
+the string "x" or the string "o".
+
+00:10:08.760 --> 00:10:14.240
+Then the game board is a list of nine board elements.
+
+00:10:14.240 --> 00:10:16.960
+So that's the state.
+
+00:10:16.960 --> 00:10:18.120
+Then we have a helper function.
+
+00:10:18.120 --> 00:10:19.440
+You can go into the details,
+
+00:10:19.440 --> 00:10:21.000
+but it just returns true
+
+00:10:21.000 --> 00:10:25.600
+if the board has a winning player.
+
+00:10:25.600 --> 00:10:30.040
+Part two is the rendering function.
+
+00:10:30.040 --> 00:10:32.800
+Only based off of the game state,
+
+00:10:32.800 --> 00:10:36.720
+we have a function that erases the buffer
+
+00:10:36.720 --> 00:10:40.280
+and draws this from scratch.
+
+00:10:40.280 --> 00:10:45.320
+That's this part right here.
+
+00:10:45.320 --> 00:10:46.720
+Lastly, we have the action.
+
+00:10:46.720 --> 00:10:51.920
+We have one action which is bound to RET,
+
+00:10:51.920 --> 00:10:55.840
+and it places a player token.
+
+00:10:55.840 --> 00:10:59.920
+Once it places a player token,
+
+00:10:59.920 --> 00:11:03.120
+it rerenders the board,
+
+00:11:03.120 --> 00:11:06.880
+and all the rerendering is handled by this function.
+
+00:11:06.880 --> 00:11:12.480
+Then we have just creating of the mode
+
+00:11:12.480 --> 00:11:14.680
+and initialization function.
+
+00:11:14.680 --> 00:11:16.680
+With these three steps
+
+00:11:16.680 --> 00:11:20.640
+it clearly separates out all of the state,
+
+00:11:20.640 --> 00:11:22.960
+the rendering, and the actions,
+
+00:11:22.960 --> 00:11:25.880
+and it makes implementing it very simple.
+
+00:11:25.880 --> 00:11:29.640
+One trick that's used here and that I use
+
+00:11:29.640 --> 00:11:32.382
+in my asm-blox game is that
+
+00:11:32.383 --> 00:11:33.316
+when I render the board,
+
+00:11:33.317 --> 00:11:40.800
+I propertize the text to contain extra information.
+
+00:11:40.800 --> 00:11:45.080
+For example, here, each cell has
+
+00:11:45.080 --> 00:11:49.400
+a tic-tac-toe index to indicate which number cell it is.
+
+00:11:49.400 --> 00:11:53.640
+This has index 0, 1, 2, all the way up to 8.
+
+00:11:53.640 --> 00:11:58.640
+That way, for placing, the only thing it has to do
+
+00:11:58.640 --> 00:12:01.200
+is just look at its position
+
+00:12:01.200 --> 00:12:04.960
+based off of the text property.
+
+00:12:04.960 --> 00:12:07.800
+It makes implementation extremely simple.
+
+00:12:07.800 --> 00:12:14.360
+Next up, we have the implementation of the code cells.
+
+00:12:14.360 --> 00:12:16.960
+If you notice, here it's kind of weird
+
+00:12:16.960 --> 00:12:21.000
+how it's like a buffer, but each cell kind of acts
+
+00:12:21.000 --> 00:12:25.760
+like its own buffer, and it has its own limits.
+
+00:12:25.760 --> 00:12:27.600
+All of the Emacs editing--
+
+00:12:27.600 --> 00:12:30.760
+well, some of the Emacs editing commands kind of work,
+
+00:12:30.760 --> 00:12:35.360
+like beginning-of-line, end-of-line, end-of-buffer.
+
+00:12:35.360 --> 00:12:38.240
+How is that done?
+
+00:12:38.240 --> 00:12:41.760
+Well, it's all just a trick, actually.
+
+00:12:41.760 --> 00:12:47.280
+Each cell has text properties of which line it's at
+
+00:12:47.280 --> 00:12:48.800
+and its cell coordinates.
+
+00:12:48.800 --> 00:12:54.360
+Whenever a key is pressed for editing, moving lines--
+
+00:12:54.360 --> 00:12:58.360
+there's even kind of more complicated things
+
+00:12:58.360 --> 00:13:00.600
+like switching cells around--
+
+00:13:00.600 --> 00:13:03.360
+so all of that,
+
+00:13:03.360 --> 00:13:05.200
+it knows which position it's in,
+
+00:13:05.200 --> 00:13:08.080
+it knows what cell it's in,
+
+00:13:08.080 --> 00:13:12.880
+and then it copies the text of the cell,
+
+00:13:12.880 --> 00:13:16.320
+because remember, the contents of the cell
+
+00:13:16.320 --> 00:13:18.360
+are stored in internal state.
+
+00:13:18.360 --> 00:13:23.000
+It copies that cell contents into a temporary buffer.
+
+00:13:23.000 --> 00:13:27.960
+It then moves the point to whichever line it was
+
+00:13:27.960 --> 00:13:31.160
+in the game board.
+
+00:13:31.160 --> 00:13:33.000
+It performs the action.
+
+00:13:33.000 --> 00:13:36.200
+It makes sure that the resulting text isn't
+
+00:13:36.200 --> 00:13:40.160
+longer than the cell width or the cell height.
+
+00:13:40.160 --> 00:13:42.040
+If everything checks out,
+
+00:13:42.040 --> 00:13:45.120
+it updates the state and calls a re-render.
+
+00:13:45.120 --> 00:13:48.440
+So there's nothing going on in here
+
+00:13:48.440 --> 00:13:51.080
+that's, like, actually inserting a letter A.
+
+00:13:51.080 --> 00:14:00.920
+It's all updating the state and causing a re-render.
+
+00:14:00.920 --> 00:14:03.640
+So this makes things like certain
+
+00:14:03.640 --> 00:14:06.480
+internal Emacs editing constructs
+
+00:14:06.480 --> 00:14:09.120
+pretty hard to use, like undoing.
+
+00:14:09.120 --> 00:14:12.200
+Normally the undoing construct
+
+00:14:12.200 --> 00:14:15.120
+works off the contents of the buffer.
+
+00:14:15.120 --> 00:14:17.840
+But if your buffer is actually just
+
+00:14:17.840 --> 00:14:20.080
+a reflection of the internal state,
+
+00:14:20.080 --> 00:14:21.440
+then how does undoing work?
+
+00:14:21.440 --> 00:14:24.880
+Well, it pretty much is kind of a hack.
+
+00:14:24.880 --> 00:14:27.040
+I mean, undoing is here,
+
+00:14:27.040 --> 00:14:32.680
+but it's pretty much redone
+
+00:14:32.680 --> 00:14:37.560
+in a not so configurable, not so modifiable way.
+
+00:14:37.560 --> 00:14:40.080
+Pretty much everything is like that,
+
+00:14:40.080 --> 00:14:42.440
+from these parentheses highlighting...
+
+00:14:42.440 --> 00:14:46.320
+Normally, parentheses highlighting
+
+00:14:46.320 --> 00:14:47.243
+would be kind of weird,
+
+00:14:47.244 --> 00:14:49.840
+with cross-line parentheses and everything.
+
+00:14:49.840 --> 00:14:52.360
+All of that had to be redone.
+
+00:14:52.360 --> 00:14:58.160
+Another point about how this is implemented
+
+00:14:58.160 --> 00:15:02.360
+is the assembly text to executable code.
+
+00:15:02.360 --> 00:15:05.800
+If you're familiar with WebAssembly
+
+00:15:05.800 --> 00:15:10.720
+you might have encountered a tool wat-wasm.
+
+00:15:10.720 --> 00:15:16.440
+It basically converts the WebAssembly text format
+
+00:15:16.440 --> 00:15:18.280
+to byte code.
+
+00:15:18.280 --> 00:15:22.440
+And what I do here... It goes through a similar process.
+
+00:15:22.440 --> 00:15:28.000
+Normally, when you're writing this text format,
+
+00:15:28.000 --> 00:15:30.360
+you can nest things as deeply as you want.
+
+00:15:30.360 --> 00:15:33.800
+Basically, what happens is it flattens out everything.
+
+00:15:33.800 --> 00:15:35.920
+It kind of knows the order
+
+00:15:35.920 --> 00:15:38.160
+that all these things are going to get executed,
+
+00:15:38.160 --> 00:15:40.680
+and then it puts it into one single line
+
+00:15:40.680 --> 00:15:44.120
+that it can just run through and execute.
+
+00:15:44.120 --> 00:15:48.360
+The same thing for the loops and blocks.
+
+00:15:48.360 --> 00:15:52.240
+It internally generates labels and jump statements.
+
+00:15:52.240 --> 00:15:58.640
+So that concludes this presentation.
+
+00:15:58.640 --> 00:15:59.666
+Thank you for listening,
+
+00:15:59.667 --> 00:16:07.440
+and I hope you enjoy the rest of the conference.
diff --git a/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.vtt b/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.vtt
new file mode 100644
index 00000000..b13e2c13
--- /dev/null
+++ b/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.vtt
@@ -0,0 +1,970 @@
+WEBVTT
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:06.999
+[Amin]: Okay, so for folks, you can start asking your questions over IRC or the PAD,
+
+00:00:07.000 --> 00:00:10.839
+and after a minute or two, we'll also open up this big blue button room
+
+00:00:10.840 --> 00:00:14.799
+for those of you who would like to join here to ask these questions directly.
+
+00:00:14.800 --> 00:00:16.199
+Michael, take it away.
+
+00:00:16.200 --> 00:00:21.599
+[Michael]: Okay, cool. It looks like we've got two questions on the PAD.
+
+NOTE How does this approach compare to using tq.el, Emacs' built-in library for transaction queues?
+
+00:00:21.600 --> 00:00:26.039
+The first, how does this approach compare to using TQ.L,
+
+00:00:26.040 --> 00:00:29.279
+Emacs's built-in library for transaction queues?
+
+00:00:29.280 --> 00:00:31.759
+Yeah, that's actually a great question.
+
+00:00:31.760 --> 00:00:35.159
+I should have called out TQ in the talk
+
+00:00:35.160 --> 00:00:40.559
+because I actually took a hard look at it in terms of my implementation.
+
+00:00:40.560 --> 00:00:47.159
+You could absolutely build this using TQ.L. I chose not to because
+
+00:00:47.160 --> 00:00:51.199
+I didn't see any compelling benefits to pay the cost
+
+00:00:51.200 --> 00:00:58.199
+of adding another dependency and creating a buffer for each new connection.
+
+00:00:58.200 --> 00:01:04.679
+In the actual implementation, input is buffered into a variable connected
+
+00:01:04.680 --> 00:01:10.479
+to the connection object and just handled there.
+
+NOTE Have you considered using the aio.el library (written by Chris Wellons) that implements async/await for Emacs lisp using promises?
+
+00:01:10.480 --> 00:01:16.439
+Have you considered using the AIO.L library written by Chris Wellens,
+
+00:01:16.440 --> 00:01:22.239
+implements async await for Emacs Lisp using promises. Implemented
+
+00:01:22.240 --> 00:01:25.559
+using Elisp's record data structure turns the nested callbacks into
+
+00:01:25.560 --> 00:01:30.279
+regular-looking Elisp code without introducing new keywords. Cool. No,
+
+00:01:30.280 --> 00:01:34.959
+I didn't because I was not aware of the package. But the fact
+
+00:01:34.960 --> 00:01:40.519
+that it was written by Chris Wellens alone is enough to get me to take a look.
+
+00:01:40.520 --> 00:01:43.879
+So yeah, perhaps that could have been another implementation.
+
+00:01:43.880 --> 00:01:49.159
+But I don't know. This kind of code journey finally got me
+
+00:01:49.160 --> 00:02:03.919
+to understand Emacs Lisp. I don't regret anything else.
+
+00:02:03.920 --> 00:02:07.119
+[Amin]: I think your last sentence was a little cutting off, Michael.
+
+00:02:07.120 --> 00:02:09.199
+Maybe you were a little far from the mic.
+
+00:02:09.200 --> 00:02:13.199
+But yeah. Okay. All I was going to say is, yeah, I mean,
+
+00:02:13.200 --> 00:02:19.679
+leave it to Chris Wellens to solve the problem in all generality.
+
+00:02:19.680 --> 00:02:27.479
+All I noted at the end was given that this little project
+
+00:02:27.480 --> 00:02:34.079
+is what finally got me to understand Emacs macros or Lisp macros, you know,
+
+00:02:34.080 --> 00:02:42.719
+I kind of, I don't regret running down this implementation.
+
+00:02:42.720 --> 00:02:45.439
+We've got another question coming in.
+
+NOTE Are you aware that EMMS has an MPD client? There's also mpc.el built into Emacs.
+
+00:02:45.440 --> 00:02:49.399
+Am I aware that Ems has an MPD, I absolutely am.
+
+00:02:49.400 --> 00:02:54.399
+And there's actually another MPD client for Emacs called MPD-L.
+
+00:02:54.400 --> 00:03:05.399
+Yes, yes there is. So again, I probably should have talked about this in before,
+
+00:03:05.400 --> 00:03:10.759
+but I was pressed for time. I was not looking, yeah,
+
+00:03:10.760 --> 00:03:16.239
+I was not looking for a full-fledged MPD client. Sometimes MPD-L
+
+00:03:16.240 --> 00:03:22.839
+and MPC.L can give you a full UX within Emacs
+
+00:03:22.840 --> 00:03:27.599
+and I would absolutely recommend them if that's what you're looking for.
+
+00:03:27.600 --> 00:03:36.039
+I wanted to just add a few tweaks to my workflow.
+
+00:03:36.040 --> 00:03:41.039
+Now increase the volume while coding, put the track name and the mode line,
+
+00:03:41.040 --> 00:03:46.159
+things like that. So I felt like those were a little heavyweight.
+
+00:03:46.160 --> 00:03:53.439
+In fact, I ended up corresponding with the author of MPD-L.
+
+00:03:53.440 --> 00:04:00.679
+And kind of the analogy I came up with was if, you know, MPD-L is to MPD
+
+00:04:00.680 --> 00:04:03.959
+as good news is to email, I wanted to build mail utils.
+
+00:04:03.960 --> 00:04:07.039
+I just wanted a couple of very tight little utilities
+
+00:04:07.040 --> 00:04:12.879
+that would get me what I wanted. But yeah, actually
+
+00:04:12.880 --> 00:04:15.559
+that's also a great callout. Perhaps I should have included references
+
+00:04:15.560 --> 00:04:39.719
+to those clients. One thing I will mention is
+
+00:04:39.720 --> 00:04:42.559
+I think we've got plenty of time for questions.
+
+00:04:42.560 --> 00:04:47.879
+Maybe close to 25 minutes or half an hour, which is very interesting.
+
+00:04:47.880 --> 00:04:51.679
+I think in many cases it's been more than the actual length of the talks.
+
+00:04:51.680 --> 00:04:57.039
+And I think that's a side effect of sort of, I guess, going with two tracks,
+
+00:04:57.040 --> 00:05:01.879
+which is nicer. There's much more breathing room between the talks this year.
+
+00:05:01.880 --> 00:05:05.759
+So if there are questions, as long as there are questions coming in,
+
+00:05:05.760 --> 00:05:09.759
+or if you do also want to present anything extended, you know,
+
+00:05:09.760 --> 00:05:11.999
+more than what you covered in your talk, you're also welcome to do that
+
+00:05:12.000 --> 00:05:14.439
+and, like, stay here. So.
+
+00:05:14.440 --> 00:05:20.359
+Okay. Cool. Now I'm happy to hang out. This is an interesting question.
+
+NOTE Have you seen the Lonesome Pine Specials?
+
+00:05:20.360 --> 00:05:22.839
+Have I seen the Lonesome Pine specials?
+
+00:05:22.840 --> 00:05:28.079
+During the talk he saw my music library and figured I'd be interested.
+
+00:05:28.080 --> 00:05:32.279
+I have not. But oh, interesting. Bella Fleck. Cool.
+
+00:05:32.280 --> 00:06:10.359
+I will be checking out Lonesome Pine, thank you.
+
+00:06:10.360 --> 00:07:27.159
+Oh, that's an awesome, awesome tip. Cool.
+
+00:07:27.400 --> 00:07:29.999
+That's probably going to be it for the questions.
+
+00:07:30.000 --> 00:07:33.999
+Do we just, do we hang out for the balance of the time?
+
+00:07:34.000 --> 00:07:37.679
+Yeah, sure. I think there's actually one new question on the pad
+
+00:07:37.680 --> 00:07:40.999
+and I might have one to ask as well, but yeah, otherwise we can.
+
+00:07:41.000 --> 00:07:44.399
+Oh, apologies. Yeah, I needed to scroll down.
+
+NOTE Would using dynamic/special vars add anything interesting / easier to async elisp in your opinion?
+
+00:07:44.400 --> 00:07:49.679
+Would using dynamic special VARs add anything interesting,
+
+00:07:49.680 --> 00:07:55.239
+easier to async with? I'm not sure what you mean by
+
+00:07:55.240 --> 00:08:48.159
+dynamic or special variables. Can you say a little more?
+
+00:08:48.160 --> 00:08:54.999
+Okay, fair enough. I mean, certainly in the examples that I included,
+
+00:08:55.000 --> 00:09:21.919
+we could use variables at a larger scope. Yeah, yeah.
+
+00:09:21.920 --> 00:09:31.199
+Interesting. Good question. I would have to think on that one.
+
+00:09:31.200 --> 00:09:39.479
+To be honest, I went hard down the lexical binding path a few years ago
+
+00:09:39.480 --> 00:09:43.959
+when it was introduced to ELISP, precisely because I found dynamic binding
+
+00:09:43.960 --> 00:09:49.239
+so much more difficult to reason about. Possibly.
+
+00:09:49.240 --> 00:10:10.119
+[Amin]: So I guess one question I might have,
+
+00:10:10.120 --> 00:10:13.479
+prefixing it with the fact that I wasn't able to fully follow your talk
+
+00:10:13.480 --> 00:10:16.559
+because I've been basically behind the scenes.
+
+NOTE How does your project compare to some of the other MPD clients?
+
+00:10:16.560 --> 00:10:22.079
+But how would you say that your project compares to some of the other,
+
+00:10:22.080 --> 00:10:23.879
+I guess, MPD clients?
+
+00:10:23.880 --> 00:10:29.359
+[Michael]: Yeah, like a couple of years ago, I used to use ncmpcpp myself,
+
+00:10:29.360 --> 00:10:33.159
+and also I tried a bunch of different ones.
+
+00:10:33.160 --> 00:10:35.679
+I never quite got into using emms as one.
+
+00:10:35.680 --> 00:10:39.359
+[Amin]: I noticed that you mentioned that, for example, for some of the other ones,
+
+00:10:39.360 --> 00:10:43.079
+maybe like npc.l, yours may be much more lightweight.
+
+00:10:43.080 --> 00:10:47.279
+But yeah, I was wondering how you would compare them.
+
+00:10:47.280 --> 00:10:55.639
+[Michael]: Yeah, yeah. So those are what I would call full-fledged applications.
+
+00:10:55.640 --> 00:11:00.759
+You're familiar with ncmpcpp. You could swap that out as your daily driver
+
+00:11:00.760 --> 00:11:06.039
+for any of those. They show you the playlist. They let you browse.
+
+00:11:06.040 --> 00:11:15.079
+They let you set up saved playlists, et cetera, et cetera, et cetera.
+
+00:11:15.080 --> 00:11:19.479
+And this does none of that. This is basically a building block.
+
+00:11:19.480 --> 00:11:23.599
+These are building blocks for building up Emacs commands.
+
+00:11:23.600 --> 00:11:31.879
+So for instance, I actually have a little minor mode that holds the key cord.
+
+00:11:31.880 --> 00:11:36.079
+You can adjust the volume. You can skip to the next track.
+
+00:11:36.080 --> 00:11:44.439
+You can do a few things like that. But that's it.
+
+00:11:44.440 --> 00:11:48.839
+More of a tool kit than an application, I guess, is the way I would put it.
+
+00:11:48.840 --> 00:11:55.039
+[Amin]: Right, right. Makes a lot of sense.
+
+NOTE Can you share the code to the macro that creates the callback tree?
+
+00:11:55.040 --> 00:12:05.599
+Awesome. Another question. Can I share the code to the macro?
+
+00:12:05.600 --> 00:12:15.599
+Help a bit for folks.
+
+00:12:15.640 --> 00:12:22.519
+And it's on OPA. Let me share a link here. Or
+
+00:12:22.520 --> 00:12:26.879
+I guess maybe GitHub would be the better UX. I can do that right now.
+
+00:12:26.880 --> 00:12:27.599
+Let's see here.
+
+00:12:27.600 --> 00:12:32.559
+I'll put it in the pad.
+
+00:12:32.560 --> 00:12:34.199
+Don't judge me. It's my first list macro.
+
+00:12:34.240 --> 00:12:44.639
+OK. So I can do that. I can do that. I can do that. I can do that.
+
+00:12:44.640 --> 00:13:11.279
+I can do that. I can do that. I can do that. I can do that.
+
+00:13:11.280 --> 00:13:22.559
+[Amin]: I think we got all the questions. I think this is an interesting sort of,
+
+00:13:22.560 --> 00:13:26.399
+I guess, topic or thing that's come up today. I think multiple times,
+
+00:13:26.400 --> 00:13:30.919
+there was also partly mentioned in RMS's talk as part of the Q&A
+
+00:13:30.920 --> 00:13:33.679
+where he was sort of complaining a little bit or saying that
+
+00:13:33.680 --> 00:13:36.839
+how he would like to see some of org's features, I guess,
+
+00:13:36.840 --> 00:13:39.799
+be decoupled from org or org syntax
+
+00:13:39.800 --> 00:13:42.439
+and just be made available either as libraries
+
+00:13:42.440 --> 00:13:45.199
+or maybe as smaller minor modes that one could use then
+
+00:13:45.200 --> 00:13:49.279
+throughout anywhere else in Emacs. And I think I do agree,
+
+00:13:49.280 --> 00:13:53.559
+and especially now in the context of MPD and using it via Emacs,
+
+00:13:53.560 --> 00:13:57.639
+I think it's very important to also have libraries or toolkits,
+
+00:13:57.640 --> 00:14:02.519
+as you mentioned, to be able to build upon them however you wish. So kudos.
+
+00:14:02.520 --> 00:14:05.439
+Thanks so much for working on this. It's very kind of you.
+
+00:14:05.440 --> 00:14:09.359
+[Michael]: Yeah, I mean, there was a much remarked upon,
+
+00:14:09.360 --> 00:14:14.679
+perhaps even controversial talk at last year's EmacsConf by Carl Voigt,
+
+00:14:14.680 --> 00:14:20.879
+if memory serves, proposing that the org mode markup language be sort of
+
+00:14:20.880 --> 00:14:27.279
+hoisted out and given a specification, he wanted to call it org down.
+
+00:14:27.280 --> 00:14:30.599
+And I think some people, for reasons unclear to me,
+
+00:14:30.600 --> 00:14:32.039
+were highly resistant to this.
+
+00:14:32.040 --> 00:14:42.879
+But yeah, yeah, mm-hmm, yeah, interesting.
+
+NOTE There's another package (chuntaro?) in addition to wellon's aio that also implements a coroutine trampoline on the emacs event loop. any thoughts on the async/await paradigm generally red/blue functions, etc?
+
+00:14:42.880 --> 00:14:46.959
+There's another package, Taro, perhaps,
+
+00:14:46.960 --> 00:14:55.999
+pronouncing that phonetically, in addition to Welland's AIO
+
+00:14:56.000 --> 00:15:01.759
+that also implements a coroutine trampoline on the Emacs event loop.
+
+00:15:01.760 --> 00:15:03.439
+Interesting.
+
+NOTE Any thoughts on the async await paradigm generally, red-blue functions, etc.?
+
+00:15:03.440 --> 00:15:07.759
+Any thoughts on the async await paradigm generally, red-blue functions,
+
+00:15:07.760 --> 00:15:10.879
+et cetera? Oh, wow.
+
+00:15:10.880 --> 00:15:18.799
+What color are my functions could be the topic of another talk in and of itself.
+
+00:15:18.800 --> 00:15:24.239
+Yeah, that's sort of the problem with async, isn't it? It's like a virus
+
+00:15:24.240 --> 00:15:26.399
+that infects your code base once you start.
+
+00:15:26.400 --> 00:15:31.959
+And having spent a fair amount of time in the past year or two
+
+00:15:31.960 --> 00:15:36.959
+writing async rust, I guess I've kind of made my peace with it.
+
+00:15:36.960 --> 00:15:39.639
+I was highly resistant to it at first.
+
+00:15:39.640 --> 00:15:46.919
+But who is that venture capitalist that diagrammed
+
+00:15:46.920 --> 00:15:50.079
+the uptake of new technology? And at first,
+
+00:15:50.080 --> 00:15:53.919
+you sort of saw this exponential curve of enthusiasm,
+
+00:15:53.920 --> 00:15:57.079
+then a peak, and you called it the valley of despair,
+
+00:15:57.080 --> 00:16:00.439
+and then sort of a plateau of acceptance.
+
+00:16:00.440 --> 00:16:05.519
+I kind of feel like asynchronous programming is kind of the hot new topic,
+
+00:16:05.520 --> 00:16:12.239
+and everybody's diving in, including in scenarios
+
+00:16:12.240 --> 00:16:14.639
+where I'm not sure I see the benefit
+
+00:16:14.640 --> 00:16:16.919
+to the additional complexity to your program.
+
+00:16:16.920 --> 00:16:23.719
+So I did it here because, as I tried to demonstrate,
+
+00:16:23.720 --> 00:16:28.319
+response latency back to the MPD server
+
+00:16:28.320 --> 00:16:34.639
+can reach into the realm of human perception, depending on the query.
+
+00:16:34.640 --> 00:16:37.519
+And my use case was, I'm in a buffer coding.
+
+00:16:37.520 --> 00:16:42.279
+I just want to quick adjust the volume, and I didn't want any pauses.
+
+00:16:42.280 --> 00:16:48.279
+But in a lot of other scenarios, I just don't see the benefit to.
+
+00:16:48.280 --> 00:16:55.959
+So yeah, I mean, that's my two cents.
+
+00:16:55.960 --> 00:17:07.759
+Yeah, I think there's a lot of care to be taken, well,
+
+00:17:07.760 --> 00:17:12.599
+I guess in both in advance consideration, but also while implementation,
+
+00:17:12.600 --> 00:17:15.839
+if one is going to add asynchronicity to an existing code base
+
+00:17:15.840 --> 00:17:20.719
+and making sure to cover essentially as many as existing workflows
+
+00:17:20.720 --> 00:17:23.239
+and code paths as possible.
+
+00:17:23.240 --> 00:17:27.879
+Yeah, exactly, exactly.
+
+00:17:27.880 --> 00:17:31.799
+You know, I've certainly gotten myself into trouble writing asynchronous code
+
+00:17:31.800 --> 00:17:36.039
+and locked up the async runtime, and it's like, well, you know,
+
+00:17:36.040 --> 00:17:39.759
+is the benefit worth it? I mean, look, if you're building a socket server
+
+00:17:39.760 --> 00:17:51.399
+of some sort, like a web service, microservice type of thing, all
+
+00:17:51.400 --> 00:17:54.999
+of the famous 10k connection problem from the last decade,
+
+00:17:55.000 --> 00:18:01.319
+if you're writing a command line tool, you know, Klee,
+
+00:18:01.320 --> 00:19:17.759
+I'm not sure why you need to spin up anything to run time for that. Yeah,
+
+00:19:17.760 --> 00:19:44.399
+I mean, I'm not sure why you need to spin up anything to run time for that.
+
+00:19:44.400 --> 00:20:10.399
+Yeah. Yeah. Yeah. Yeah, I mean, I'm not sure why you need
+
+00:20:10.400 --> 00:20:14.239
+to spin up anything to run time for that. Yeah. Yeah. Yeah. Yeah. Yeah. Yeah.
+
+00:20:14.240 --> 00:20:18.399
+Yeah. Yeah. Yeah. Yeah. Yeah. Yeah. Yeah. Yeah. Yeah.
+
+00:20:18.400 --> 00:20:20.919
+We'll definitely be checking. It's. So, Centauro appears to be the author.
+
+00:20:20.920 --> 00:20:24.999
+The package name is called Emacs Promise. Interesting. Okay,
+
+00:20:25.000 --> 00:20:29.039
+I see you reacting, I just wanted to check out if my mic is working.
+
+00:20:29.040 --> 00:20:30.999
+The talk, thank you for your interesting talk.
+
+00:20:31.000 --> 00:20:33.599
+That's a yak. I already shaved myself
+
+00:20:33.600 --> 00:20:36.639
+how to do async programming in Emacs.
+
+00:20:36.640 --> 00:20:39.679
+I found about the TQQ and I improved on it, too,
+
+00:20:39.680 --> 00:20:42.919
+and then I was thinking, okay, async programming.
+
+00:20:42.920 --> 00:20:49.079
+It wasn't how to do macros, but it was my whole into, yes,
+
+00:20:49.080 --> 00:20:51.679
+how to do async programming without callback hell.
+
+00:20:51.680 --> 00:20:54.719
+And as you said in your title, you did async before it was cool,
+
+00:20:54.720 --> 00:20:58.679
+because you often hear the opinion that Emacs doesn't do multithreading,
+
+00:20:58.680 --> 00:21:02.639
+it's just single threaded and therefore old and useless.
+
+00:21:02.640 --> 00:21:06.319
+Not like that, maybe.
+
+NOTE Do you think it's a viable future for Emacs to get out of callback hell?
+
+00:21:06.320 --> 00:21:10.599
+The solution you found, do you think it's a viable future
+
+00:21:10.600 --> 00:21:13.399
+for Emacs to get out of callback hell?
+
+00:21:13.400 --> 00:21:22.279
+I think so, but I would certainly, in the pad,
+
+00:21:22.280 --> 00:21:25.119
+somebody pointed out that Christopher Wellens
+
+00:21:25.120 --> 00:21:28.959
+came up with a general purpose async await library
+
+00:21:28.960 --> 00:21:32.839
+that I will definitely be taking a look at,
+
+00:21:32.840 --> 00:21:36.359
+because I think he used the phrase yak shaving
+
+00:21:36.360 --> 00:21:38.839
+and that's absolutely what I was doing here.
+
+00:21:38.840 --> 00:21:45.559
+So this solution is purpose-built to my little personal problem.
+
+00:21:45.560 --> 00:21:53.999
+It sounds like Wellens may have solved the problem in greater generality.
+
+00:21:54.000 --> 00:21:56.439
+But yeah, absolutely. I mean, periodically
+
+00:21:56.440 --> 00:22:00.999
+in the Emacs IRC channel or an Emacs devil, somebody will say, oh my God,
+
+00:22:01.000 --> 00:22:07.639
+I can't believe Emacs is single threaded, this is hopeless, and yeah, I think
+
+00:22:07.640 --> 00:22:10.159
+that here's another use case for asynchronous problem.
+
+00:22:10.160 --> 00:22:22.319
+It's interesting that you mentioned like the AIO from Christopher Wellens,
+
+00:22:22.320 --> 00:22:24.159
+because I had a look at it too.
+
+00:22:24.160 --> 00:22:28.919
+And if I remember correctly, he uses Emacs generators.
+
+00:22:28.920 --> 00:22:37.799
+I'm not really sure, I'm not sure anymore if that's the case. But yeah,
+
+00:22:37.800 --> 00:22:48.199
+that's another cool macro use to get out of callback Emacs generators.
+
+00:22:48.200 --> 00:22:55.399
+Did you see it already? I'm looking at it right now for the first time,
+
+00:22:55.400 --> 00:23:02.279
+oh gosh, look at this. And if you want, I can spare you a lot of time,
+
+00:23:02.280 --> 00:23:07.439
+because if you go down this road and you get the same direction as me,
+
+00:23:07.440 --> 00:23:10.599
+you'll find out like, okay, that's a cool solution.
+
+00:23:10.600 --> 00:23:13.519
+You already mentioned Go, the solution Go uses
+
+00:23:13.520 --> 00:23:15.799
+with the coroutines or green threads
+
+00:23:15.800 --> 00:23:22.359
+or whatever you name it. And I think, in my opinion, the best solution
+
+00:23:22.360 --> 00:23:28.159
+or the neatest solution of this problem in this plant or in general is Futures,
+
+00:23:28.160 --> 00:23:33.319
+no, not Futures, wrong name, host called, no, I just forgot.
+
+00:23:33.320 --> 00:23:41.839
+It's a guy's scheme, and it's from Andy Wingo. And he does it with fibers,
+
+00:23:41.840 --> 00:23:49.439
+not Futures, fibers, this is a really good solution for the problem of how
+
+00:23:49.440 --> 00:23:55.119
+to do async, how to do multi-color functions
+
+00:23:55.120 --> 00:23:57.719
+and say they have all functions the same name.
+
+00:23:57.720 --> 00:24:05.599
+And it's fundamentally based on concurrent ML, and yeah, fibers on top, this
+
+00:24:05.600 --> 00:24:09.079
+is cool. I would like to see this in the mix. Interesting.
+
+00:24:09.080 --> 00:24:13.559
+So I found this talk, Channels, Concurrency, and Cores,
+
+00:24:13.560 --> 00:24:16.679
+a New Concurrent ML Implementation.
+
+00:24:16.680 --> 00:24:18.439
+This one, yes.
+
+00:24:18.440 --> 00:24:34.719
+Okay, I will be taking a look at this, thank you.
+
+00:24:34.720 --> 00:24:35.759
+You're welcome.
+
+00:24:35.760 --> 00:24:39.319
+Maybe to expand on this, if you don't mind. Please.
+
+NOTE Generators
+
+00:24:39.320 --> 00:24:44.919
+The idea behind it is like Chris Wellon uses generators,
+
+00:24:44.920 --> 00:24:47.399
+generators like in Python generators,
+
+00:24:47.400 --> 00:24:49.599
+like you have some function, and it can yield,
+
+00:24:49.600 --> 00:24:54.279
+and you can start it again at this point, and so on and so on.
+
+00:24:54.280 --> 00:25:00.559
+It's an Emacs, and it's a hack. It uses a macro for the code processing,
+
+00:25:00.560 --> 00:25:02.879
+and then it's bits of callbacks, more or less.
+
+00:25:02.880 --> 00:25:07.759
+And it's a solution for like how do I specify callbacks
+
+00:25:07.760 --> 00:25:15.039
+without writing actually callbacks with writing synchronous looking one color.
+
+00:25:15.040 --> 00:25:20.759
+And the general solution, and that's the reason Andy Wingo can do it in Guile,
+
+00:25:20.760 --> 00:25:27.519
+for them is the limited continuations. You have a delimited continuation,
+
+00:25:27.520 --> 00:25:30.639
+that means you have a point in your program where you can yield,
+
+00:25:30.640 --> 00:25:35.639
+and it yields until a prompt, like it yields a part of your code.
+
+00:25:35.640 --> 00:25:38.839
+What that means is your code can stop
+
+00:25:38.840 --> 00:25:43.239
+and pass the rest of the computation to something else,
+
+00:25:43.240 --> 00:25:46.319
+and this something else can invoke the computation.
+
+00:25:46.320 --> 00:25:48.079
+That means you can have a scheduler.
+
+00:25:48.080 --> 00:25:56.839
+And How do you arrange for your continuation to be restarted or all can again?
+
+00:25:56.840 --> 00:26:04.119
+Good question. That's exactly the thing the Fibers does, like the scheduler.
+
+00:26:04.120 --> 00:26:08.559
+You could put it like an Apollo interface, even in Linux,
+
+00:26:08.560 --> 00:26:14.239
+which Apollo network connection or a file creation, something like that,
+
+00:26:14.240 --> 00:26:15.079
+or a socket.
+
+00:26:15.080 --> 00:26:17.119
+Interesting.
+
+00:26:17.120 --> 00:26:21.799
+This sounds not dissimilar from what I understand goes coroutines to be.
+
+00:26:21.800 --> 00:26:25.319
+This is coroutines, more or less.
+
+00:26:25.320 --> 00:26:26.079
+Right.
+
+00:26:26.080 --> 00:26:31.839
+These are the things you can do when you have
+
+00:26:31.840 --> 00:26:34.799
+like Andy Wingo can do it in Guile
+
+00:26:34.800 --> 00:26:36.919
+because he's got his fingers into the interpreter.
+
+00:26:36.920 --> 00:26:43.119
+Yes, he does. He sort of got inside knowledge.
+
+00:26:43.120 --> 00:26:49.639
+I don't know.
+
+00:26:49.640 --> 00:26:51.919
+Yeah, I think so, too.
+
+00:26:51.920 --> 00:26:53.919
+He implemented the delimited continuations,
+
+00:26:53.920 --> 00:26:59.759
+but yes, it was maybe my point I wanted to make.
+
+00:26:59.760 --> 00:27:01.359
+Like there's a neat solution.
+
+00:27:01.360 --> 00:27:04.719
+Sometimes you need these delimited continuations
+
+00:27:04.720 --> 00:27:12.279
+and function-wise you need like some kind of callback.
+
+00:27:12.280 --> 00:27:16.999
+Actually, you always need some kind of callback. You just hide it, well,
+
+00:27:17.000 --> 00:27:20.439
+and you call the delimited continuation.
+
+00:27:20.440 --> 00:27:20.639
+Right.
+
+00:27:20.640 --> 00:27:25.919
+I mean, if you've ever tried to do asynchronous programming,
+
+00:27:25.920 --> 00:27:33.679
+say, in C using EpoL, sort of wind up structuring your entire program
+
+00:27:33.680 --> 00:27:40.759
+around this event loop and kind of you sort of have this state
+
+00:27:40.760 --> 00:27:45.039
+that you move through as various things get signaled,
+
+00:27:45.040 --> 00:27:49.159
+whether data shows up on a file descriptor or a timer goes off, whatever.
+
+00:27:49.160 --> 00:27:52.159
+And it's kind of mind-bending.
+
+00:27:52.160 --> 00:27:53.559
+It's definitely, you know,
+
+00:27:53.560 --> 00:27:57.639
+humans seem to be most comfortable writing imperatively.
+
+00:27:57.640 --> 00:28:04.159
+And so whether it's Ruster or Golang or JavaScript, it all seems to be like,
+
+00:28:04.160 --> 00:28:07.119
+how can we wrap that state machine more ergonomically?
+
+00:28:07.120 --> 00:28:12.999
+Yes, exactly. How much more time do we have for Q&A?
+
+00:28:13.000 --> 00:28:31.119
+I think we have about seven and a half, eight more minutes.
+
+00:28:31.120 --> 00:28:37.439
+Yeah. We don't have to use all of it if there are no questions,
+
+00:28:37.440 --> 00:28:39.439
+but you're also welcome to hang out if you want.
+
+00:28:39.440 --> 00:28:41.519
+I'm happy to wait.
+
+00:28:41.520 --> 00:28:42.839
+Cool.
+
+00:28:42.840 --> 00:28:52.519
+And also, if there are no questions, I mean,
+
+00:28:52.520 --> 00:28:55.119
+one thing we could maybe do is to, if you
+
+00:28:55.120 --> 00:28:58.079
+like to maybe give a quick demo, like walk through some of the parts of,
+
+00:28:58.080 --> 00:29:00.999
+you know, your package, your code that could also work whichever,
+
+00:29:01.000 --> 00:29:02.239
+whatever you're more comfortable with.
+
+00:29:02.240 --> 00:29:07.879
+Honestly, I wasn't prepared for a live demo, so.
+
+00:29:07.880 --> 00:29:12.839
+Oh, yeah, sure. No worries. Sorry. Don't mean to put you on the spot.
+
+00:29:12.840 --> 00:29:15.439
+I'm going to steer clear of that.
+
+00:29:15.440 --> 00:29:16.999
+That's fair enough.
+
+00:29:17.000 --> 00:29:17.599
+Thank you.
+
+00:29:17.600 --> 00:29:25.199
+Okay. you
+
+00:29:25.200 --> 00:29:25.239
+
+
+00:29:25.240 --> 00:31:11.719
+questions maybe we can wrap it up sounds good
+
+00:31:11.720 --> 00:31:20.999
+I actually think I need to check in for my next talk soon
+
+00:31:21.000 --> 00:31:26.519
+oh yeah sure all right any last question before we wrap up folks
+
+00:31:26.520 --> 00:32:05.959
+all right I think in that case we can go ahead and wrap up
+
+00:32:05.960 --> 00:32:07.919
+thanks so much Michael for the great talk
+
+00:32:07.920 --> 00:32:10.359
+I very much look forward to checking out your work
+
+00:32:10.360 --> 00:32:11.999
+and yeah seeing what what could be done with it
+
+00:32:12.000 --> 00:32:14.719
+and using it as a building block and toolkit all right well
+
+00:32:14.720 --> 00:32:17.079
+thank you so much
+
+00:32:17.080 --> 00:32:20.079
+I feel like I learned as much through the Q&A
+
+00:32:20.080 --> 00:32:22.239
+as other people probably did from the talk
+
+00:32:22.240 --> 00:32:22.519
+wonderful
+
+00:32:22.520 --> 00:32:24.279
+yeah it's great it's a great way to get to know each other
+
+00:32:24.280 --> 00:32:24.839
+and get to know each other
+
+00:32:24.840 --> 00:32:25.759
+wonderful yeah it's great
+
+00:32:25.760 --> 00:32:29.999
+and yeah we were very lucky to be able to do these sort of live Q&A's
+
+00:32:30.000 --> 00:32:33.359
+and awesome speakers like yourself just being able to join in
+
+00:32:33.360 --> 00:32:35.439
+and yeah just teach and learn
+
+00:32:35.440 --> 00:32:37.999
+all right see you in a bit
+
+00:32:38.000 --> 00:32:47.040
+awesome yep see you in a little bit bye
diff --git a/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main--chapters.vtt b/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main--chapters.vtt
new file mode 100644
index 00000000..c5528717
--- /dev/null
+++ b/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main--chapters.vtt
@@ -0,0 +1,40 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:47.200
+Asynchronous programming
+
+00:00:47.200 --> 00:01:42.600
+Automating my music player
+
+00:01:42.600 --> 00:03:22.080
+Working with the API
+
+00:03:22.080 --> 00:05:05.200
+make-network-process
+
+00:05:05.200 --> 00:05:57.920
+The sequence of events
+
+00:05:57.920 --> 00:07:50.480
+Queues
+
+00:07:50.480 --> 00:09:24.240
+Callbacks
+
+00:09:24.240 --> 00:11:48.080
+Client-side code
+
+00:11:48.080 --> 00:12:27.760
+Demo
+
+00:12:27.760 --> 00:13:15.520
+Logic
+
+00:13:15.520 --> 00:14:53.520
+Callback hell
+
+00:14:53.520 --> 00:16:46.400
+Lisp macros
+
+00:16:46.400 --> 00:17:47.880
+Conclusion
diff --git a/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.vtt b/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.vtt
new file mode 100644
index 00000000..eb25844e
--- /dev/null
+++ b/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.vtt
@@ -0,0 +1,1505 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:00:02.720
+Hey everyone, I'm Michael
+
+2
+00:00:02.720 --> 00:00:04.480
+and I'm going to be talking to you today
+
+3
+00:00:04.480 --> 00:00:07.640
+about asynchronous programming in Emacs Lisp.
+
+4
+00:00:07.640 --> 00:00:10.360
+I'm located in the San Francisco Bay Area
+
+5
+00:00:10.360 --> 00:00:12.040
+where I'm a developer as well as
+
+6
+00:00:12.040 --> 00:00:14.160
+a long time Emacs user.
+
+7
+00:00:14.160 --> 00:00:18.760
+You may have heard of async or asynchronous programming.
+
+8
+00:00:18.760 --> 00:00:21.360
+The idea has been around for decades
+
+9
+00:00:21.360 --> 00:00:24.400
+but it first gained widespread attention in JavaScript
+
+10
+00:00:24.400 --> 00:00:26.720
+back in the aughts.
+
+11
+00:00:26.720 --> 00:00:29.680
+Then in the teens it gained tremendous popularity
+
+12
+00:00:29.680 --> 00:00:31.720
+in the DevOps world with Golang.
+
+13
+00:00:31.720 --> 00:00:33.800
+And just in the last few years
+
+14
+00:00:33.800 --> 00:00:37.880
+support for async programming has landed in Rust.
+
+15
+00:00:37.880 --> 00:00:40.080
+Well it can be done in Emacs as well
+
+16
+00:00:40.080 --> 00:00:42.040
+and this talk will demonstrate that
+
+17
+00:00:42.040 --> 00:00:44.600
+by walking you through a little problem
+
+18
+00:00:44.600 --> 00:00:47.200
+that I actually solved for myself.
+
+19
+00:00:47.200 --> 00:00:49.040
+Like a lot of these stories
+
+20
+00:00:49.040 --> 00:00:51.920
+it begins with scratching a personal itch.
+
+21
+00:00:51.920 --> 00:00:55.320
+In my case automating my music server.
+
+22
+00:00:55.320 --> 00:00:58.240
+I use something called the music player daemon locally
+
+23
+00:00:58.240 --> 00:01:00.240
+and as the name suggests
+
+24
+00:01:00.240 --> 00:01:03.560
+it just kind of hangs out in the background.
+
+25
+00:01:03.560 --> 00:01:08.040
+Reads music files and talks to assorted sound drivers.
+
+26
+00:01:08.040 --> 00:01:09.640
+In fact it is so focused on
+
+27
+00:01:09.640 --> 00:01:12.440
+that mission that it doesn't even offer a user interface.
+
+28
+00:01:12.440 --> 00:01:14.400
+Instead it serves an API
+
+29
+00:01:14.400 --> 00:01:16.120
+and invites application developers
+
+30
+00:01:16.120 --> 00:01:19.360
+to build clients on top of that API.
+
+31
+00:01:19.360 --> 00:01:22.200
+Okay so let's hop into a vterm
+
+32
+00:01:22.200 --> 00:01:25.080
+and I'd like to show you the MPD client I use
+
+33
+00:01:25.080 --> 00:01:26.600
+for my daily driver.
+
+34
+00:01:26.600 --> 00:01:29.520
+Something called ncmpcpp.
+
+35
+00:01:29.520 --> 00:01:31.800
+Doesn't exactly roll off the tongue
+
+36
+00:01:31.800 --> 00:01:33.720
+but I've got a playlist.
+
+37
+00:01:33.720 --> 00:01:36.560
+I can browse the file system.
+
+38
+00:01:36.560 --> 00:01:39.240
+Looks like I can search my music library.
+
+39
+00:01:39.240 --> 00:01:40.000
+Yada yada yada.
+
+40
+00:01:40.000 --> 00:01:42.600
+It's got all the basic features.
+
+41
+00:01:42.600 --> 00:01:44.640
+The point that I want to make is that
+
+42
+00:01:44.640 --> 00:01:51.920
+ncmpcpp is a completely independent project of MPD.
+
+43
+00:01:51.920 --> 00:01:53.720
+Separate and distinct.
+
+44
+00:01:53.720 --> 00:01:55.680
+It does all of its work
+
+45
+00:01:55.680 --> 00:01:57.200
+by simply communicating with
+
+46
+00:01:57.200 --> 00:02:01.400
+the music player daemon over the API.
+
+47
+00:02:01.400 --> 00:02:03.440
+Well I wanted to program to that API
+
+48
+00:02:03.440 --> 00:02:05.840
+only from within Emacs.
+
+49
+00:02:05.840 --> 00:02:09.520
+Now there are already Emacs MPD clients out there
+
+50
+00:02:09.520 --> 00:02:11.560
+but I didn't really want a full blown client.
+
+51
+00:02:11.560 --> 00:02:14.320
+I just wanted a few small tweaks
+
+52
+00:02:14.320 --> 00:02:16.320
+over my current configuration.
+
+53
+00:02:16.320 --> 00:02:19.280
+A command to skip to the next song.
+
+54
+00:02:19.280 --> 00:02:22.360
+Maybe shove the current track into the mode line.
+
+55
+00:02:22.360 --> 00:02:24.160
+Things like this.
+
+56
+00:02:24.160 --> 00:02:28.560
+I needed an elisp API that would let me do this.
+
+57
+00:02:28.560 --> 00:02:32.000
+Okay well let's get out of ncmpcpp
+
+58
+00:02:32.000 --> 00:02:37.560
+and let's get into a netcat session
+
+59
+00:02:37.560 --> 00:02:39.400
+with my local MPD server.
+
+60
+00:02:39.400 --> 00:02:43.840
+As you can see we get a welcome string.
+
+61
+00:02:43.840 --> 00:02:46.800
+So it is a server goes first protocol.
+
+62
+00:02:46.800 --> 00:02:49.640
+But after that it's a very familiar
+
+63
+00:02:49.640 --> 00:02:53.960
+text based request response oriented protocol.
+
+64
+00:02:53.960 --> 00:02:56.240
+I can ask for the volume.
+
+65
+00:02:56.240 --> 00:02:58.160
+I can ask for the status.
+
+66
+00:02:58.160 --> 00:03:06.000
+But in particular I wanted an asynchronous API.
+
+67
+00:03:06.000 --> 00:03:07.800
+If I issue a command like
+
+68
+00:03:07.800 --> 00:03:11.840
+find every track in my library
+
+69
+00:03:11.840 --> 00:03:15.360
+that's going to produce a lot of data
+
+70
+00:03:15.360 --> 00:03:18.920
+that's a human perceptible pause
+
+71
+00:03:18.920 --> 00:03:22.080
+as Emacs processes all the input.
+
+72
+00:03:22.080 --> 00:03:25.560
+What I wanted was a style of programming
+
+73
+00:03:25.560 --> 00:03:28.080
+where I could fire off my command
+
+74
+00:03:28.080 --> 00:03:31.560
+have the Emacs command loop keep working
+
+75
+00:03:31.560 --> 00:03:33.440
+and only invoke some callback
+
+76
+00:03:33.440 --> 00:03:35.280
+when there was data available.
+
+77
+00:03:35.280 --> 00:03:39.560
+Well Emacs is famously single threaded
+
+78
+00:03:39.560 --> 00:03:41.840
+so it shouldn't come as a surprise
+
+79
+00:03:41.840 --> 00:03:44.080
+that it offers a rich set of primitives
+
+80
+00:03:44.080 --> 00:03:46.720
+that enable the sort of network programming
+
+81
+00:03:46.720 --> 00:03:49.320
+that I wanted to do.
+
+82
+00:03:49.320 --> 00:03:50.760
+In particular it offers
+
+83
+00:03:50.760 --> 00:03:53.280
+a function called make network process.
+
+84
+00:03:53.280 --> 00:03:57.800
+Now this method offers a bewildering variety of options.
+
+85
+00:03:57.800 --> 00:03:59.320
+But at the heart of the matter
+
+86
+00:03:59.320 --> 00:04:01.040
+it opens a network connection
+
+87
+00:04:01.040 --> 00:04:03.120
+to some endpoint out there
+
+88
+00:04:03.120 --> 00:04:06.640
+and we can configure it to be non blocking.
+
+89
+00:04:06.640 --> 00:04:09.840
+It returns a handle that you can use to refer to
+
+90
+00:04:09.840 --> 00:04:14.880
+this network connection with other methods.
+
+91
+00:04:14.880 --> 00:04:17.760
+Other methods such as process and string
+
+92
+00:04:17.760 --> 00:04:19.600
+which as the name suggests
+
+93
+00:04:19.600 --> 00:04:21.960
+allows you to send textual data
+
+94
+00:04:21.960 --> 00:04:26.320
+to the remote endpoint of your network connection.
+
+95
+00:04:26.320 --> 00:04:29.400
+You can also use it with set process filter
+
+96
+00:04:29.400 --> 00:04:32.160
+which allows you to associate a callback
+
+97
+00:04:32.160 --> 00:04:33.240
+with your network connection.
+
+98
+00:04:33.240 --> 00:04:35.920
+That callback will be invoked
+
+99
+00:04:35.920 --> 00:04:40.480
+when there is data available
+
+100
+00:04:40.480 --> 00:04:41.960
+in the processes read buffer.
+
+101
+00:04:41.960 --> 00:04:44.960
+In other words in a request response oriented protocol
+
+102
+00:04:44.960 --> 00:04:47.800
+like that of MPD you open your socket
+
+103
+00:04:47.800 --> 00:04:50.960
+with make network process
+
+104
+00:04:50.960 --> 00:04:53.760
+send your request via process send string
+
+105
+00:04:53.760 --> 00:04:56.360
+and life will just continue in emacs
+
+106
+00:04:56.360 --> 00:04:57.560
+until some data shows up
+
+107
+00:04:57.560 --> 00:05:00.720
+in the processes read buffer
+
+108
+00:05:00.720 --> 00:05:05.200
+at which point your callback will be invoked.
+
+109
+00:05:05.200 --> 00:05:07.560
+It turns out this was enough
+
+110
+00:05:07.560 --> 00:05:12.280
+for a purpose built async runtime.
+
+111
+00:05:12.280 --> 00:05:14.800
+Let's work through the sequence of events
+
+112
+00:05:14.800 --> 00:05:16.480
+when opening a connection
+
+113
+00:05:16.480 --> 00:05:18.720
+and firing off a few commands in this style.
+
+114
+00:05:18.720 --> 00:05:22.120
+So let's imagine a library
+
+115
+00:05:22.120 --> 00:05:25.520
+that offers a connection object of some sort
+
+116
+00:05:25.520 --> 00:05:28.720
+a caller and an MPD server out on the network.
+
+117
+00:05:28.720 --> 00:05:31.880
+The caller will presumably get themselves
+
+118
+00:05:31.880 --> 00:05:34.760
+a connection object by invoking some sort of
+
+119
+00:05:34.760 --> 00:05:38.080
+connect method on our library.
+
+120
+00:05:38.080 --> 00:05:41.160
+We can handle this through make network process
+
+121
+00:05:41.160 --> 00:05:45.360
+but we're going to invoke make network process
+
+122
+00:05:45.360 --> 00:05:47.200
+with no weight equal to true
+
+123
+00:05:47.200 --> 00:05:48.520
+in other words asynchronously.
+
+124
+00:05:48.520 --> 00:05:52.240
+That means the method is going to return immediately.
+
+125
+00:05:52.240 --> 00:05:56.320
+We won't even know if the connection is up
+
+126
+00:05:56.320 --> 00:05:57.920
+let alone what the response would be.
+
+127
+00:05:57.920 --> 00:06:01.560
+This has some implications.
+
+128
+00:06:01.560 --> 00:06:05.280
+At this point we've returned control to the caller
+
+129
+00:06:05.280 --> 00:06:09.400
+the emacs event loop is proceeding quite happily
+
+130
+00:06:09.400 --> 00:06:11.320
+and so the caller is free
+
+131
+00:06:11.320 --> 00:06:14.920
+to start using our connection object.
+
+132
+00:06:14.920 --> 00:06:17.640
+They might say issue a status command.
+
+133
+00:06:17.640 --> 00:06:20.600
+Okay well in our library
+
+134
+00:06:20.600 --> 00:06:22.680
+we don't have a connection yet.
+
+135
+00:06:22.680 --> 00:06:25.920
+How on earth are we going to service this?
+
+136
+00:06:25.920 --> 00:06:29.440
+Well we can simply give ourselves a queue
+
+137
+00:06:29.440 --> 00:06:33.360
+and note down the fact that we owe a status command.
+
+138
+00:06:33.360 --> 00:06:35.560
+That's pretty quick.
+
+139
+00:06:35.560 --> 00:06:38.120
+We've now returned control back to our caller
+
+140
+00:06:38.120 --> 00:06:40.640
+and they are again free to issue more commands.
+
+141
+00:06:40.640 --> 00:06:41.840
+Maybe they issue a play command.
+
+142
+00:06:41.840 --> 00:06:45.160
+Okay well we're going to go deeper into debt
+
+143
+00:06:45.160 --> 00:06:48.160
+and note that we also owe a play command.
+
+144
+00:06:48.160 --> 00:06:56.160
+At some point in the indeterminate future MPDU
+
+145
+00:06:56.160 --> 00:06:57.320
+is the connection will get up
+
+146
+00:06:57.320 --> 00:07:03.000
+MPDU will allocate resources to track a new client.
+
+147
+00:07:03.000 --> 00:07:06.160
+They will write the welcome string into the socket
+
+148
+00:07:06.160 --> 00:07:07.920
+and those bytes are going to show up
+
+149
+00:07:07.920 --> 00:07:10.360
+in the emacs process read buffer
+
+150
+00:07:10.360 --> 00:07:13.160
+at which point our callback will be invoked.
+
+151
+00:07:13.160 --> 00:07:17.440
+We can parse the welcome string maybe
+
+152
+00:07:17.440 --> 00:07:19.240
+note the version that connection object
+
+153
+00:07:19.240 --> 00:07:20.400
+that might come in handy
+
+154
+00:07:20.400 --> 00:07:21.720
+but the key point is
+
+155
+00:07:21.720 --> 00:07:24.080
+our callback needs to take a look at the queue
+
+156
+00:07:24.080 --> 00:07:25.240
+and notice
+
+157
+00:07:25.240 --> 00:07:27.200
+oh we owe a status command
+
+158
+00:07:27.200 --> 00:07:29.880
+and so we'll invoke process and string
+
+159
+00:07:29.880 --> 00:07:32.280
+and send the status command down the pipe.
+
+160
+00:07:32.280 --> 00:07:36.760
+Again at some indeterminate time in the future
+
+161
+00:07:36.760 --> 00:07:38.600
+some bytes are going to show up
+
+162
+00:07:38.600 --> 00:07:41.200
+in our processes read buffer
+
+163
+00:07:41.200 --> 00:07:43.160
+and our callback will again be invoked.
+
+164
+00:07:43.160 --> 00:07:48.560
+We've got volume is 75 plus a lot of other stuff
+
+165
+00:07:48.560 --> 00:07:50.480
+and here we come to the next problem.
+
+166
+00:07:50.480 --> 00:07:54.440
+If our caller invoked status
+
+167
+00:07:54.440 --> 00:07:56.960
+they probably wanted to know about the status
+
+168
+00:07:56.960 --> 00:07:59.880
+so how shall we get them to them?
+
+169
+00:07:59.880 --> 00:08:03.040
+Well there's really not a lot of options at this point
+
+170
+00:08:03.040 --> 00:08:04.280
+except the callback.
+
+171
+00:08:04.280 --> 00:08:09.000
+Okay so change of plan our queue
+
+172
+00:08:09.000 --> 00:08:11.720
+is no longer a queue of commands
+
+173
+00:08:11.720 --> 00:08:13.840
+it's going to be a queue of commands
+
+174
+00:08:13.840 --> 00:08:15.880
+with associated callbacks.
+
+175
+00:08:15.880 --> 00:08:20.280
+We read the response off the socket
+
+176
+00:08:20.280 --> 00:08:23.440
+invoke our caller supplied callback
+
+177
+00:08:23.440 --> 00:08:26.080
+and then pop the queue.
+
+178
+00:08:26.080 --> 00:08:28.920
+At this point our callback
+
+179
+00:08:28.920 --> 00:08:32.160
+the library callback needs to know
+
+180
+00:08:32.160 --> 00:08:34.040
+that we still have a pending command
+
+181
+00:08:34.040 --> 00:08:35.720
+we fire that off down the pipe
+
+182
+00:08:35.720 --> 00:08:38.520
+at some indeterminate time in the future
+
+183
+00:08:38.520 --> 00:08:40.360
+we get a call we get a response
+
+184
+00:08:40.360 --> 00:08:42.640
+our callback is invoked
+
+185
+00:08:42.640 --> 00:08:45.720
+we invoke the caller supplied callback
+
+186
+00:08:45.720 --> 00:08:47.240
+and we pop the queue.
+
+187
+00:08:47.240 --> 00:08:53.760
+The structure of such a program
+
+188
+00:08:53.760 --> 00:08:55.800
+is best viewed as a finite state machine
+
+189
+00:08:55.800 --> 00:08:57.640
+and this is typically where you end up
+
+190
+00:08:57.640 --> 00:08:59.200
+in asynchronous programming at least
+
+191
+00:08:59.200 --> 00:09:03.360
+when you don't have a runtime grafted onto your program
+
+192
+00:09:03.360 --> 00:09:04.960
+the way you do with Golang
+
+193
+00:09:04.960 --> 00:09:08.240
+or when you don't have sort of extensive library support
+
+194
+00:09:08.240 --> 00:09:09.680
+the way you do with Rust.
+
+195
+00:09:09.680 --> 00:09:14.480
+Your data structure exists in one of these states
+
+196
+00:09:14.480 --> 00:09:15.440
+at any given time
+
+197
+00:09:15.440 --> 00:09:18.960
+and when input shows up on your file descriptor
+
+198
+00:09:18.960 --> 00:09:24.240
+you transition along one of these edges to a new state.
+
+199
+00:09:24.240 --> 00:09:28.160
+Cool so let's take a look at some of the code
+
+200
+00:09:28.160 --> 00:09:29.480
+that flows from this.
+
+201
+00:09:29.480 --> 00:09:32.240
+Okay let's hop over to an Emacs
+
+202
+00:09:32.240 --> 00:09:33.920
+and take a look at how we might code this up.
+
+203
+00:09:33.920 --> 00:09:38.360
+If you recall the sequence diagrams I shared
+
+204
+00:09:38.360 --> 00:09:40.120
+we're going to be scribbling down the command
+
+205
+00:09:40.120 --> 00:09:42.160
+and the callback that will be invoking
+
+206
+00:09:42.160 --> 00:09:43.240
+upon its completion.
+
+207
+00:09:43.240 --> 00:09:45.440
+So the first thing I did was give myself
+
+208
+00:09:45.440 --> 00:09:47.400
+a little command struct
+
+209
+00:09:47.400 --> 00:09:52.280
+with that I was able to define the connection object.
+
+210
+00:09:52.280 --> 00:09:56.280
+We're going to be storing the handle to the connection.
+
+211
+00:09:56.280 --> 00:09:59.400
+We're going to write down the protocol version
+
+212
+00:09:59.400 --> 00:10:02.000
+that we harvest from the welcome message
+
+213
+00:10:02.000 --> 00:10:03.560
+and of course we'll be recording
+
+214
+00:10:03.560 --> 00:10:05.760
+the command queue as well.
+
+215
+00:10:05.760 --> 00:10:08.640
+And so I gave myself a little connection object
+
+216
+00:10:08.640 --> 00:10:10.960
+with a connection struct
+
+217
+00:10:10.960 --> 00:10:12.240
+with those three attributes.
+
+218
+00:10:12.240 --> 00:10:15.000
+With the data model squared away
+
+219
+00:10:15.000 --> 00:10:17.840
+it was really pretty easy to code up
+
+220
+00:10:17.840 --> 00:10:21.160
+the connect implementation.
+
+221
+00:10:21.160 --> 00:10:24.880
+I'm deleting some details for exposition purposes
+
+222
+00:10:24.880 --> 00:10:29.520
+but in the event it's really not that more complex
+
+223
+00:10:29.520 --> 00:10:30.520
+than what you see here.
+
+224
+00:10:30.520 --> 00:10:32.840
+We're going to unpack the arguments,
+
+225
+00:10:32.840 --> 00:10:35.040
+figure out where the MPD server is
+
+226
+00:10:35.040 --> 00:10:37.280
+to which you would like us to connect.
+
+227
+00:10:37.280 --> 00:10:39.920
+We'll connect via make network process.
+
+228
+00:10:39.920 --> 00:10:42.640
+We'll associate a library defined callback
+
+229
+00:10:42.640 --> 00:10:45.920
+with that connection via set process filter.
+
+230
+00:10:45.920 --> 00:10:48.440
+Then we'll instantiate the connection object
+
+231
+00:10:48.440 --> 00:10:50.120
+and return it to the caller.
+
+232
+00:10:50.120 --> 00:10:53.800
+Once the caller has a connection object
+
+233
+00:10:53.800 --> 00:10:56.880
+they're free to send commands down that connection.
+
+234
+00:10:56.880 --> 00:10:59.120
+So what we're doing here
+
+235
+00:10:59.120 --> 00:11:02.320
+is simply instantiating a command object
+
+236
+00:11:02.320 --> 00:11:05.200
+on the basis of the caller supplied arguments
+
+237
+00:11:05.200 --> 00:11:06.640
+and appending it to the queue.
+
+238
+00:11:06.640 --> 00:11:07.920
+And then the last thing we do
+
+239
+00:11:07.920 --> 00:11:11.040
+and I've just indicated this with a comment
+
+240
+00:11:11.040 --> 00:11:12.040
+is we kick the queue.
+
+241
+00:11:12.040 --> 00:11:14.560
+This kind of goes back to
+
+242
+00:11:14.560 --> 00:11:18.200
+the state transition diagram I laid out earlier.
+
+243
+00:11:18.200 --> 00:11:22.680
+What this means is the logic for saying well
+
+244
+00:11:22.680 --> 00:11:24.280
+if we're waiting the completion
+
+245
+00:11:24.280 --> 00:11:25.480
+of a previously sent command
+
+246
+00:11:25.480 --> 00:11:27.280
+there's really not much more to be done.
+
+247
+00:11:27.280 --> 00:11:31.000
+We're just going to push this command onto the queue
+
+248
+00:11:31.000 --> 00:11:31.600
+and return.
+
+249
+00:11:31.600 --> 00:11:33.120
+On the other hand
+
+250
+00:11:33.120 --> 00:11:37.120
+if the queue was empty on entry to LMPD send
+
+251
+00:11:37.120 --> 00:11:39.160
+there's no reason not to just
+
+252
+00:11:39.160 --> 00:11:43.400
+immediately send the command.
+
+253
+00:11:43.400 --> 00:11:44.680
+And this is an example of
+
+254
+00:11:44.680 --> 00:11:46.520
+the sort of client side code
+
+255
+00:11:46.520 --> 00:11:48.080
+that results from this API.
+
+256
+00:11:48.080 --> 00:11:51.360
+So you can see here we are giving ourselves
+
+257
+00:11:51.360 --> 00:11:54.240
+a connection to the MPD server on the local host
+
+258
+00:11:54.240 --> 00:11:56.600
+and we're going to send the get volume command
+
+259
+00:11:56.600 --> 00:11:58.160
+down that connection.
+
+260
+00:11:58.160 --> 00:12:02.840
+And if that command completes and all is well
+
+261
+00:12:02.840 --> 00:12:05.360
+we'll just send a message to Emacs.
+
+262
+00:12:05.360 --> 00:12:07.800
+Unfortunately you can't see my mini buffer
+
+263
+00:12:07.800 --> 00:12:10.960
+so I'll hop over to the messages buffer
+
+264
+00:12:10.960 --> 00:12:12.720
+and there's our result.
+
+265
+00:12:12.720 --> 00:12:15.160
+The volume is 43.
+
+266
+00:12:15.160 --> 00:12:17.960
+Great I thought.
+
+267
+00:12:17.960 --> 00:12:22.520
+Simple clean responsive easy to code to.
+
+268
+00:12:22.520 --> 00:12:27.760
+That is unfortunately not the end of the story.
+
+269
+00:12:27.760 --> 00:12:32.320
+Let's continue this example a little bit.
+
+270
+00:12:32.320 --> 00:12:33.560
+Let's imagine that
+
+271
+00:12:33.560 --> 00:12:35.920
+if the volume comes back from the server
+
+272
+00:12:35.920 --> 00:12:37.360
+and it is less than 50
+
+273
+00:12:37.360 --> 00:12:38.600
+we would like to set it to 50.
+
+274
+00:12:38.600 --> 00:12:41.560
+So this is interesting
+
+275
+00:12:41.560 --> 00:12:43.200
+because we have two commands
+
+276
+00:12:43.200 --> 00:12:45.840
+and whether or not we send the second command
+
+277
+00:12:45.840 --> 00:12:46.840
+is going to depend on
+
+278
+00:12:46.840 --> 00:12:48.560
+the response we get from the first.
+
+279
+00:12:48.560 --> 00:12:51.640
+Okay I thought well that's fine
+
+280
+00:12:51.640 --> 00:12:55.080
+I can simply put that logic in the callback
+
+281
+00:12:55.080 --> 00:12:57.920
+that I specified for the get volume command.
+
+282
+00:12:57.920 --> 00:13:01.560
+So here we are we check the return code
+
+283
+00:13:01.560 --> 00:13:04.400
+we parse the volume we compare it to 50
+
+284
+00:13:04.400 --> 00:13:08.360
+and if it's less we just invoke LMPD send again
+
+285
+00:13:08.360 --> 00:13:10.800
+from the first command's callback.
+
+286
+00:13:10.800 --> 00:13:13.440
+Okay I could live with that
+
+287
+00:13:13.440 --> 00:13:15.520
+it's not the worst thing I've ever seen.
+
+288
+00:13:15.520 --> 00:13:19.400
+Let's extend this example a little further
+
+289
+00:13:19.400 --> 00:13:21.480
+and this is contrived but bear with me.
+
+290
+00:13:21.480 --> 00:13:25.480
+Let us suppose that if we do set the volume to 50
+
+291
+00:13:25.480 --> 00:13:27.800
+we'd like to get the volume one more time
+
+292
+00:13:27.800 --> 00:13:30.640
+just to make sure that our change took on the server.
+
+293
+00:13:30.640 --> 00:13:33.560
+Okay we can play the same game.
+
+294
+00:13:33.560 --> 00:13:37.280
+We will put that logic in the callback
+
+295
+00:13:37.280 --> 00:13:39.520
+that we specified for the set volume command.
+
+296
+00:13:39.520 --> 00:13:43.480
+And here we are we check the return code
+
+297
+00:13:43.480 --> 00:13:45.480
+we send a message to Emacs
+
+298
+00:13:45.480 --> 00:13:49.200
+we send the get volume command again
+
+299
+00:13:49.200 --> 00:13:51.080
+along with its own callback
+
+300
+00:13:51.080 --> 00:13:55.280
+and at this point I think you know I hope it's clear
+
+301
+00:13:55.280 --> 00:13:57.520
+the problem that is emerging
+
+302
+00:13:57.520 --> 00:14:01.360
+and if it's not yet let's let me note that so far
+
+303
+00:14:01.360 --> 00:14:03.000
+we're only handling the happy path
+
+304
+00:14:03.000 --> 00:14:04.520
+in each of these callbacks.
+
+305
+00:14:04.520 --> 00:14:06.840
+We really ought to do something about the error path
+
+306
+00:14:06.840 --> 00:14:10.120
+for purposes of illustration let's just say
+
+307
+00:14:10.120 --> 00:14:12.120
+we send a message to Emacs
+
+308
+00:14:12.120 --> 00:14:14.320
+that means it would look like this
+
+309
+00:14:14.320 --> 00:14:16.560
+and it's at this point
+
+310
+00:14:16.560 --> 00:14:19.400
+that I really think it's impossible to deny
+
+311
+00:14:19.400 --> 00:14:23.280
+that this API is actually not that easy to program to
+
+312
+00:14:23.280 --> 00:14:27.160
+and if there are any JavaScript devs watching
+
+313
+00:14:27.160 --> 00:14:28.840
+you're probably chuckling right now
+
+314
+00:14:28.840 --> 00:14:30.720
+because I have discovered for myself
+
+315
+00:14:30.720 --> 00:14:33.880
+what they call callback hell.
+
+316
+00:14:33.880 --> 00:14:36.040
+If you are returning
+
+317
+00:14:36.040 --> 00:14:40.160
+the results of asynchronous function invocations
+
+318
+00:14:40.160 --> 00:14:42.200
+to their caller via callbacks
+
+319
+00:14:42.200 --> 00:14:45.640
+you pretty much inevitably end up in this sort of
+
+320
+00:14:45.640 --> 00:14:48.040
+deeply nested sequence of callbacks
+
+321
+00:14:48.040 --> 00:14:49.880
+that is difficult to write difficult to read
+
+322
+00:14:49.880 --> 00:14:53.520
+and difficult to reason about.
+
+323
+00:14:53.520 --> 00:14:57.480
+And yet when I was stuck in this situation
+
+324
+00:14:57.480 --> 00:15:00.080
+it just seemed like it really shouldn't be this bad.
+
+325
+00:15:00.080 --> 00:15:05.320
+If I give myself this sort of tabular data structure
+
+326
+00:15:05.320 --> 00:15:10.160
+I felt that this expressed precisely the same logic
+
+327
+00:15:10.160 --> 00:15:11.960
+just in a much easier to read manner.
+
+328
+00:15:11.960 --> 00:15:15.840
+I could in my mind's eye
+
+329
+00:15:15.840 --> 00:15:19.720
+see the code for transforming this data structure
+
+330
+00:15:19.720 --> 00:15:21.040
+which is really just a list
+
+331
+00:15:21.040 --> 00:15:25.600
+into the code that you just saw in the previous slide
+
+332
+00:15:25.600 --> 00:15:29.440
+and really if Lisp is good at anything
+
+333
+00:15:29.440 --> 00:15:31.080
+it is list processing right
+
+334
+00:15:31.080 --> 00:15:33.080
+and it was really at this point
+
+335
+00:15:33.080 --> 00:15:35.240
+that a little bit of enlightenment dawned.
+
+336
+00:15:35.240 --> 00:15:40.800
+I learned that Lisp is homo iconic
+
+337
+00:15:40.800 --> 00:15:46.040
+which is just means that the language itself
+
+338
+00:15:46.040 --> 00:15:49.360
+is a data structure in that language.
+
+339
+00:15:49.360 --> 00:15:53.160
+Lisp code is after all just a list
+
+340
+00:15:53.160 --> 00:15:57.160
+and the power of Lisp macros
+
+341
+00:15:57.160 --> 00:15:59.760
+is taking that data structure
+
+342
+00:15:59.760 --> 00:16:02.400
+some data structure that you've defined
+
+343
+00:16:02.400 --> 00:16:04.640
+and doing exactly what I wanted to do
+
+344
+00:16:04.640 --> 00:16:07.520
+transforming it from one list into another
+
+345
+00:16:07.520 --> 00:16:11.080
+the destination list being Lisp code.
+
+346
+00:16:11.080 --> 00:16:16.000
+So I got busy and I coded up my first Lisp macro
+
+347
+00:16:16.000 --> 00:16:19.160
+which I called LMPD chain
+
+348
+00:16:19.160 --> 00:16:21.600
+and that lengthy list of you know
+
+349
+00:16:21.600 --> 00:16:24.200
+three or four nested callbacks
+
+350
+00:16:24.200 --> 00:16:25.920
+gets turned into this
+
+351
+00:16:25.920 --> 00:16:29.520
+which I hope you'll agree is much simpler
+
+352
+00:16:29.520 --> 00:16:32.240
+much easier to read much easier to reason about.
+
+353
+00:16:32.240 --> 00:16:36.000
+And if you're morbidly curious
+
+354
+00:16:36.000 --> 00:16:40.160
+you can you can expand your macros
+
+355
+00:16:40.160 --> 00:16:44.200
+and this invocation of LMPD chain expands to this.
+
+356
+00:16:44.200 --> 00:16:46.400
+So that's my story.
+
+357
+00:16:46.400 --> 00:16:50.840
+In all fairness I should note that
+
+358
+00:16:50.840 --> 00:16:55.160
+the MPD protocol has some subtleties and complexities
+
+359
+00:16:55.160 --> 00:16:56.880
+that I didn't really get into
+
+360
+00:16:56.880 --> 00:16:58.360
+both due to time constraints
+
+361
+00:16:58.360 --> 00:17:00.520
+and because they're not terribly relevant
+
+362
+00:17:00.520 --> 00:17:02.000
+to the points I wanted to touch on
+
+363
+00:17:02.000 --> 00:17:05.360
+I should also note that there's
+
+364
+00:17:05.360 --> 00:17:07.720
+a fair amount of work in the library itself
+
+365
+00:17:07.720 --> 00:17:11.240
+around accumulating partial responses
+
+366
+00:17:11.240 --> 00:17:12.560
+as they show up in the buffer
+
+367
+00:17:12.560 --> 00:17:16.120
+and dispatching them piecemeal to the caller
+
+368
+00:17:16.120 --> 00:17:19.720
+that was really too complex to get into here.
+
+369
+00:17:19.720 --> 00:17:22.360
+If you would like to see the code
+
+370
+00:17:22.360 --> 00:17:25.080
+it's available on GitHub as well as Melpa.
+
+371
+00:17:25.080 --> 00:17:29.200
+I'll be putting a version of this talk
+
+372
+00:17:29.200 --> 00:17:30.480
+on my personal site
+
+373
+00:17:30.480 --> 00:17:33.720
+and you can always reach out to me personally
+
+374
+00:17:33.720 --> 00:17:36.960
+I hang out on IRC as SPIF
+
+375
+00:17:36.960 --> 00:17:41.920
+or you can just email me as SPIF at P.O.Box dot com.
+
+376
+00:17:41.920 --> 00:17:47.880
+Thank you very much.
diff --git a/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main--chapters.vtt b/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main--chapters.vtt
new file mode 100644
index 00000000..565d1168
--- /dev/null
+++ b/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main--chapters.vtt
@@ -0,0 +1,25 @@
+WEBVTT
+
+00:00.000 --> 00:00:27.899
+Introduction
+
+00:27.900 --> 00:01:32.719
+Why Emacs Buddy?
+
+01:32.720 --> 00:02:17.039
+What can you expect?
+
+02:17.040 --> 00:02:58.959
+Why not just mailing lists or Reddit?
+
+02:58.960 --> 00:03:47.959
+How do you get in touch with a buddy?
+
+03:47.960 --> 00:04:14.759
+How did it go?
+
+04:14.760 --> 00:05:48.359
+Example
+
+05:48.360 --> 00:07:59.520
+What if you want to be a buddy?
diff --git a/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.vtt b/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.vtt
new file mode 100644
index 00000000..8d4b023c
--- /dev/null
+++ b/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.vtt
@@ -0,0 +1,424 @@
+WEBVTT captioned by andrea
+
+00:00.000 --> 00:03.919
+Hello, welcome to my talk, the Emacs Buddy Initiative.
+
+00:03.920 --> 00:04.759
+Who am I?
+
+00:04.760 --> 00:06.999
+I'm Andrea. I work as a Clojure Software Engineer
+
+00:07.000 --> 00:08.999
+somewhere in the middle of the UK.
+
+00:09.000 --> 00:12.519
+And I started with Emacs during my PhD,
+
+00:12.520 --> 00:14.119
+thanks to my PhD supervisor
+
+00:14.120 --> 00:15.759
+that introduced me to this tool.
+
+00:15.760 --> 00:17.279
+And from now and from then,
+
+00:17.280 --> 00:20.319
+I am basically using it for everything.
+
+00:20.320 --> 00:22.159
+You can find more about this everything
+
+00:22.160 --> 00:26.519
+at ag91.github.io, that is my blog.
+
+00:26.520 --> 00:27.899
+So let's get into the talk.
+
+00:27.900 --> 00:29.479
+Why Emacs Buddy?
+
+00:29.480 --> 00:32.919
+Emacs Buddy is an initiative to bring us together.
+
+00:32.920 --> 00:36.559
+And the reason is because Emacs is a limitless tool.
+
+00:36.560 --> 00:38.799
+So you can keep learning about it,
+
+00:38.800 --> 00:41.039
+you can keep expanding it,
+
+00:41.040 --> 00:44.799
+and also takes time to get up to speed.
+
+00:44.800 --> 00:48.679
+So you may actually extend Emacs
+
+00:48.680 --> 00:50.619
+or you may actually get introduced,
+
+00:50.620 --> 00:52.319
+start using Emacs,
+
+00:52.320 --> 00:56.359
+but you could fall into all the traps
+
+00:56.360 --> 01:00.879
+or all the wasted times that other users have already gone through.
+
+01:00.880 --> 01:04.599
+And so, since there are a lot of amazing people
+
+01:04.600 --> 01:07.359
+in the Emacs community,
+
+01:07.360 --> 01:10.119
+why do every time redo the same error?
+
+01:10.120 --> 01:12.159
+So let's bring us together.
+
+01:12.160 --> 01:17.479
+And it would be amazing to get a one-to-one relation.
+
+01:17.480 --> 01:21.559
+So I have somebody that actually knows what you want to do,
+
+01:21.560 --> 01:23.399
+what you want to achieve with Emacs,
+
+01:23.400 --> 01:27.439
+and supports you because they have done a similar path to yours.
+
+01:27.440 --> 01:32.719
+And so they can remove some of the obstacles for you.
+
+01:32.720 --> 01:34.479
+So what can you expect?
+
+01:34.480 --> 01:37.879
+The main thing is guidance on your Emacs journey,
+
+01:37.880 --> 01:41.279
+because the Emacs journey is infinite, it doesn't really end.
+
+01:41.280 --> 01:44.079
+But the farther you go,
+
+01:44.080 --> 01:46.799
+the more value you get from this amazing tool.
+
+01:46.800 --> 01:50.359
+And that helps you save time.
+
+01:50.360 --> 01:54.279
+And at the same time, you can meet like-minded people.
+
+01:54.280 --> 01:59.079
+And so you can learn about Emacs or about your context,
+
+01:59.080 --> 02:02.919
+if they are in, for example, if you are a physicist,
+
+02:02.920 --> 02:07.559
+they are physicists or they are interested in the field.
+
+02:07.560 --> 02:09.159
+You may not only learn about Emacs,
+
+02:09.160 --> 02:11.879
+but you can learn also something about the field.
+
+02:11.880 --> 02:17.039
+And anyway, the idea is that you can move forward together.
+
+02:17.040 --> 02:20.399
+Somebody asked, why not just mailing lists or Reddit?
+
+02:20.400 --> 02:24.639
+Well, the point is that mailing list is many people
+
+02:24.640 --> 02:28.519
+can help you solve one issue that you have.
+
+02:28.520 --> 02:31.559
+And that naturally doesn't become a discussion
+
+02:31.560 --> 02:35.279
+of where you are from, what are you trying to achieve,
+
+02:35.280 --> 02:39.999
+and where you want to move forward with using this editor
+
+02:40.000 --> 02:42.279
+or using this tool.
+
+02:42.280 --> 02:45.639
+Instead, here, we want something more personal,
+
+02:45.640 --> 02:48.639
+something more like you tell your story.
+
+02:48.640 --> 02:53.879
+And if I can help you achieve what you need,
+
+02:53.880 --> 02:58.959
+I am also interested in your story as a buddy.
+
+02:58.960 --> 03:03.359
+So given that, how do you get in touch with a buddy?
+
+03:03.360 --> 03:04.679
+Well, the thing is easy.
+
+03:04.680 --> 03:12.719
+Just ping me at this email, andrea-dev@hotmail.com.
+
+03:12.720 --> 03:15.399
+And I can put you in touch with one of the buddies
+
+03:15.400 --> 03:16.759
+that are available.
+
+03:16.760 --> 03:20.199
+Or you can contact them personally, directly,
+
+03:20.200 --> 03:26.279
+because on the web page, on the Emacs Buddy web page,
+
+03:26.280 --> 03:32.559
+there are links to their material or their websites.
+
+03:32.560 --> 03:35.599
+And sometimes you can find the contact yourself.
+
+03:35.600 --> 03:37.159
+Anyway, I am a facilitator.
+
+03:37.160 --> 03:41.919
+So if you contact me, I will find the contact for the person
+
+03:41.920 --> 03:43.079
+that you want to get in touch.
+
+03:43.080 --> 03:44.479
+You can also get in touch with me.
+
+03:44.480 --> 03:47.959
+I'm a buddy myself.
+
+03:47.960 --> 03:49.599
+How did it go so far?
+
+03:49.600 --> 03:52.479
+Well, from when I started the initiative,
+
+03:52.480 --> 03:55.039
+more or less we had 10 buddies.
+
+03:55.040 --> 03:58.719
+We had 10 buddies that are available to help you
+
+03:58.720 --> 04:01.519
+with your Emacs journey.
+
+04:01.520 --> 04:04.879
+And I buddyed myself, or I got in touch
+
+04:04.880 --> 04:10.679
+with people that wanted a buddy, about eight people.
+
+04:10.680 --> 04:14.759
+Each of these conversations was quite interesting.
+
+04:14.760 --> 04:19.639
+I decided to paraphrase one.
+
+04:19.640 --> 04:23.519
+I had this user that got in touch and said:
+
+04:23.520 --> 04:25.559
+"I used Emacs for 10 years.
+
+04:25.560 --> 04:27.279
+I'm curious about the initiative,
+
+04:27.280 --> 04:32.359
+and here is my GitHub that I started writing recently,
+
+04:32.360 --> 04:37.679
+Elisp projects", projects in Elisp to extend Emacs.
+
+04:37.680 --> 04:40.839
+I looked at their code.
+
+04:40.840 --> 04:43.879
+I suggested, "Oh, why don't you use dash?
+
+04:43.880 --> 04:45.299
+It's something that I'm familiar with.
+
+04:45.300 --> 04:49.439
+Maybe you may like it as well."
+
+04:49.440 --> 04:51.719
+And then I started asking, "Oh, what do you do with Emacs?
+
+04:51.720 --> 04:55.999
+Have you tried a note taking tool like Org Roam?"
+
+04:56.000 --> 04:58.039
+And then the conversation started.
+
+04:58.040 --> 05:00.199
+So "yeah, I tried Org Roam version one.
+
+05:00.200 --> 05:01.199
+I use my own thing.
+
+05:01.200 --> 05:02.879
+But what is it...
+
+05:02.880 --> 05:04.239
+I'm curious about version two.
+
+05:04.240 --> 05:05.839
+Did you use it?
+
+05:05.840 --> 05:07.079
+Do you know about Luhmann?"
+
+05:07.080 --> 00:05:09.861
+That is the inspiration of Org Roam
+
+00:05:09.862 --> 00:05:13.239
+and the backlinking and stuff.
+
+05:13.240 --> 05:15.479
+And then I started the conversation about that.
+
+05:15.480 --> 05:18.359
+And we discussed about functional programming.
+
+05:18.360 --> 05:23.279
+We discussed a bit about philosophy and went on.
+
+05:23.280 --> 05:29.159
+And then this conversation is not currently going.
+
+05:29.160 --> 05:32.759
+So we arrived to a point in which it sort of died out.
+
+05:32.760 --> 05:36.679
+But if I want or if they want, they can ping me back.
+
+05:36.680 --> 05:37.439
+I can ping them.
+
+05:37.440 --> 05:40.799
+So it's sort of a reference of this person exists
+
+05:40.800 --> 05:44.439
+and is an interesting person to chat with when I have something
+
+05:44.440 --> 05:48.359
+to say to them.
+
+05:48.360 --> 05:50.479
+And what if you want to be a buddy?
+
+05:50.480 --> 05:54.279
+Well, if you want to be a buddy, it's easy as well.
+
+05:54.280 --> 06:02.279
+So basically, just open a PR on the Emacs buddy repository.
+
+06:02.280 --> 06:05.279
+That is something that I am maintaining at the moment.
+
+06:05.280 --> 06:07.759
+Or simply send me the information.
+
+06:07.760 --> 06:09.999
+Somebody just sent me an email with the information.
+
+06:10.000 --> 06:14.719
+I have created the commit to make it public available.
+
+06:14.720 --> 06:18.559
+The information is just your name, a summary,
+
+06:18.560 --> 06:21.559
+what kind of user you are so that you can attract
+
+06:21.560 --> 06:28.039
+the right people to you, and a link to your material
+
+06:28.040 --> 06:31.959
+so that if they are curious about your summary or about you,
+
+06:31.960 --> 06:35.559
+they can actually go and check and even contact you directly.
+
+06:35.560 --> 06:40.559
+If they contact via me, I will know your email anyway
+
+06:40.560 --> 06:44.319
+from the PR you open.
+
+06:44.320 --> 06:45.759
+So that is all.
+
+06:45.760 --> 06:53.039
+There are ideas to maybe... if... this is basically
+
+06:53.040 --> 06:54.759
+an advertisement for this initiative
+
+06:54.760 --> 06:57.639
+so that we can get people that want to be helped
+
+06:57.640 --> 07:01.199
+or people that want to help.
+
+07:01.200 --> 07:03.599
+It's building up organically, so no rush
+
+07:03.600 --> 07:08.639
+to make this thing grow, escalate enormously.
+
+07:08.640 --> 07:12.479
+But for example, there are ideas to join this with the meetup
+
+07:12.480 --> 07:15.719
+talk that is being happening in the conference.
+
+07:15.720 --> 07:19.519
+So for example, if you find out something very interesting,
+
+07:19.520 --> 07:22.199
+you can bring the discussion that you have with your buddy
+
+07:22.200 --> 07:27.559
+into a meetup so that the group with which you speak is bigger.
+
+07:27.560 --> 07:28.919
+There are ideas like that.
+
+07:28.920 --> 07:33.119
+But first of all, just get in touch if you want to find
+
+07:33.120 --> 07:36.599
+like-minded people that want to help you with your Emacs
+
+07:36.600 --> 07:38.919
+journey or if you want to help others.
+
+07:38.920 --> 07:39.799
+Thank you very much.
+
+07:39.800 --> 07:59.520
+Enjoy the rest of the talks and chat to you soon.
diff --git a/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.vtt b/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.vtt
new file mode 100644
index 00000000..5ade9186
--- /dev/null
+++ b/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.vtt
@@ -0,0 +1,1004 @@
+WEBVTT
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:06.799
+Yes. Okay. Hi, everyone. We are back now, and I'm with Mats. Hi, Mats.
+
+00:00:06.800 --> 00:00:09.559
+Hi. How are you doing?
+
+00:00:09.560 --> 00:00:11.879
+I'm fine. How are you?
+
+00:00:11.880 --> 00:00:15.239
+I'm doing great as well. As the talk goes by,
+
+00:00:15.240 --> 00:00:20.119
+I keep warming up, and this is a very nice feeling. I look absolutely big
+
+00:00:20.120 --> 00:00:23.639
+with this down jacket, but it works, and I'm not going to question it.
+
+00:00:23.640 --> 00:00:27.039
+You do know, for the people coming every year to AMX Conf, that I do try
+
+00:00:27.040 --> 00:00:30.999
+to look dashing, but I also need to be warm, because this year,
+
+00:00:31.000 --> 00:00:33.359
+we are doing it in December and not in November.
+
+00:00:33.360 --> 00:00:36.639
+Okay. So, Mats,
+
+00:00:36.640 --> 00:00:40.599
+how about you start reading questions? I believe you've got one already.
+
+NOTE So with one line of code you can create custom hyperbutton types that are live in any Emacs buffer. Is that right?
+
+00:00:40.600 --> 00:00:45.719
+I got one question already. Yes. The question is, so with one line of code,
+
+00:00:45.720 --> 00:00:50.279
+you can create custom hyper button types that are live in an AMX buffer.
+
+00:00:50.280 --> 00:00:55.959
+Is that right? Yes. The short answer is yes.
+
+00:00:55.960 --> 00:01:01.599
+Maybe I should use the presentation and go into here.
+
+00:01:01.600 --> 00:01:09.759
+Let's see if I can find it.
+
+00:01:09.760 --> 00:01:17.839
+No. Read it wrong. So, here, the field macro allows you, in principle, to,
+
+00:01:17.840 --> 00:01:22.759
+in one line, define a hyper button, starting with the starting delimiter
+
+00:01:22.760 --> 00:01:25.519
+and an end delimiter, and then there's this mapping
+
+00:01:25.520 --> 00:01:36.319
+to whatever functionality should sort of come out of pressing that button.
+
+00:01:36.320 --> 00:01:39.199
+So, that was significantly more than just a yes. Thank you.
+
+00:01:39.200 --> 00:01:42.479
+I'll be glad we put your screen up so that you can answer this.
+
+00:01:42.480 --> 00:01:45.479
+So, people, just to remind you, so we do have the pad to answer the pad
+
+00:01:45.480 --> 00:01:49.039
+to ask you questions over there. We are, let me check
+
+00:01:49.040 --> 00:01:54.799
+how much time we have for this Q&A. We have until 15 of the next hour,
+
+00:01:54.800 --> 00:02:00.719
+which leaves about 20 minutes, but right now we only have one question.
+
+00:02:00.720 --> 00:02:07.519
+So, people on ISE, if you could place questions in the pad. Right.
+
+00:02:07.520 --> 00:02:10.679
+Sorry, I'm managing multiple things at the same time.
+
+00:02:10.680 --> 00:02:12.839
+Is there anything else you wanted to talk about? Anything else?
+
+00:02:12.840 --> 00:02:16.479
+Because, you know, to let people know,
+
+00:02:16.480 --> 00:02:19.719
+we do ask speakers to submit pre-recordings to us
+
+00:02:19.720 --> 00:02:21.639
+because it makes our life much easier on the day
+
+00:02:21.640 --> 00:02:25.519
+of the recording at EmacsConf, on the day of the conference at EmacsConf,
+
+00:02:25.520 --> 00:02:29.479
+because this way we can get away with not having
+
+00:02:29.480 --> 00:02:33.559
+to worry about live presentation catching fires and not, oh,
+
+00:02:33.560 --> 00:02:36.039
+I cannot share my screen, my microphone is not working.
+
+00:02:36.040 --> 00:02:40.439
+So, not only is everything working today inside the BBBO room,
+
+00:02:40.440 --> 00:02:44.159
+but Matt also sent a pre-recording. So, that's great.
+
+00:02:44.160 --> 00:02:50.079
+I got another question. Oh yes, go, but please, I'm down in the background.
+
+00:02:50.080 --> 00:02:53.319
+Let me jump over to the second question.
+
+NOTE Is there a good way to share common patterns for links other than the ones that you shared? shall those be PRs to your repository?
+
+00:02:53.320 --> 00:02:56.639
+The second question is, is there a good way to share common patterns
+
+00:02:56.640 --> 00:03:00.399
+for links other than the ones that you shared?
+
+00:03:00.400 --> 00:03:05.599
+Shall those be pull requests to your repository?
+
+00:03:05.600 --> 00:03:16.919
+Okay, let me think. Those should not be pull requests to our repository
+
+00:03:16.920 --> 00:03:19.999
+because these are your patterns, your links.
+
+00:03:20.000 --> 00:03:23.959
+That's something you would share like that I'm showing here.
+
+00:03:23.960 --> 00:03:27.239
+Could even be like you're sharing maybe the pattern, how this
+
+00:03:27.240 --> 00:03:31.599
+button looks, but maybe the implementation could in principle be different.
+
+00:03:31.600 --> 00:03:36.359
+So, the one you're sharing with might put their information
+
+00:03:36.360 --> 00:03:41.719
+in some other storage that might be accessed using the same information,
+
+00:03:41.720 --> 00:03:46.439
+or maybe just placed in some other part of the file system.
+
+00:03:46.440 --> 00:03:53.239
+So, the only good way to share it would be like to send it over email
+
+00:03:53.240 --> 00:03:57.519
+or some other message to someone else. Share it some way.
+
+00:03:57.520 --> 00:04:02.639
+First question. I like the link to evaluate calc expressions.
+
+00:04:02.640 --> 00:04:07.879
+Any way to get the outcome into the buffer and not just in the message window?
+
+00:04:07.880 --> 00:04:13.999
+I mean, that will be up to the sort of the implementation of the function
+
+00:04:14.000 --> 00:04:19.519
+that you would use in the bottom. I mean, the function that
+
+00:04:19.520 --> 00:04:25.999
+is evaluated could do anything really. So, that was just an example
+
+00:04:26.000 --> 00:04:30.519
+to show that you could, you don't have to be a link that you actually go
+
+00:04:30.520 --> 00:04:34.399
+to some new place. It can just be some computation or whatever. So,
+
+00:04:34.400 --> 00:04:39.519
+that's just trying to show that you shouldn't be limiting yourself
+
+00:04:39.520 --> 00:04:44.399
+to just thinking about links. It can be computing anything.
+
+00:04:44.400 --> 00:04:49.959
+It's really the thing about Elisp really. It's just when people ask you,
+
+00:04:49.960 --> 00:04:53.439
+you know, when they come from outside of Emacs and they ask you,
+
+00:04:53.440 --> 00:04:56.759
+can your function do this? The answer is more often than not, yes.
+
+00:04:56.760 --> 00:04:59.159
+Can you write it in Elisp? Yeah, I might need
+
+00:04:59.160 --> 00:05:01.839
+to look at the documentation a little bit, but I'll be able to do it.
+
+00:05:01.840 --> 00:05:06.239
+And, you know, calc does have the ability to paste the result
+
+00:05:06.240 --> 00:05:10.879
+when you're not calc used as a library, but calc the node.
+
+00:05:10.880 --> 00:05:13.319
+When you type something in it and you press Y,
+
+00:05:13.320 --> 00:05:17.119
+it will paste it into the buffer, which means that there is the ability
+
+00:05:17.120 --> 00:05:19.799
+to communicate between calc and the buffer you're currently in. So,
+
+00:05:19.800 --> 00:05:24.439
+it's probably just a matter of doing Ctrl-H-K-Y inside the calc mode,
+
+00:05:24.440 --> 00:05:27.719
+checking which function is running, and just putting this at the end
+
+00:05:27.720 --> 00:05:29.319
+of the button, and voila, there you go.
+
+00:05:29.320 --> 00:05:34.079
+So, Matt, I don't think you have any questions at the moment.
+
+00:05:34.080 --> 00:05:37.559
+We're going to leave some time for people to gather more questions,
+
+00:05:37.560 --> 00:05:41.839
+but I think, if I'm not mistaken, I might be wrong with the,
+
+00:05:41.840 --> 00:05:42.919
+we changed the schedule a little bit,
+
+00:05:42.920 --> 00:05:46.719
+but you're the first Hyperbole talk for today,
+
+00:05:46.720 --> 00:05:52.319
+and as such, you are introducing people to the concept of buttons,
+
+00:05:52.320 --> 00:05:56.719
+which is very instrumental to Hyperbole. Hyperbole?
+
+00:05:56.720 --> 00:06:00.639
+I'm going to go with Hyperbole, actually.
+
+00:06:00.680 --> 00:06:03.919
+So, could you maybe, I know it's a big task,
+
+00:06:03.920 --> 00:06:07.639
+and you've also touched upon what Hyperbole was, but a lot
+
+00:06:07.640 --> 00:06:10.599
+of people always ask, you know, Hyperbole, Org Mode,
+
+00:06:10.600 --> 00:06:13.559
+I see both of them sometimes crop up at the top of the subreddit,
+
+00:06:13.560 --> 00:06:16.519
+and I'm not exactly sure which one is doing which.
+
+00:06:16.520 --> 00:06:22.239
+You're using the term links, and this speaks to me as someone who works
+
+00:06:22.240 --> 00:06:24.359
+in Zettelkasten Methods, so maybe
+
+00:06:24.360 --> 00:06:27.479
+could you, I'm asking you with a very difficult question now,
+
+NOTE Could you differentiate Hyperbole and Org?
+
+00:06:27.480 --> 00:06:32.359
+could you differentiate maybe Hyperbole and Org, or try your best,
+
+00:06:32.360 --> 00:06:38.119
+knowing that we'll have more Hyperbole talks later in the conference?
+
+00:06:38.120 --> 00:06:45.959
+Well, I will not try to get into that sort of wormhole,
+
+00:06:45.960 --> 00:06:56.919
+because I don't think they should be compared, they're more companions, so yeah.
+
+00:06:56.920 --> 00:07:00.479
+It's the best way you could have answered this question, and you know,
+
+00:07:00.480 --> 00:07:04.799
+I'm going to remove you from this tricky situation in which I put you,
+
+00:07:04.800 --> 00:07:08.999
+so yes, they are complementary tool, they do some of the same thing,
+
+00:07:09.000 --> 00:07:11.639
+they do have different philosophy, and at the end,
+
+00:07:11.640 --> 00:07:13.079
+if they allow you to take notes,
+
+00:07:13.080 --> 00:07:15.999
+if they allow you to relate notes in different places,
+
+00:07:16.000 --> 00:07:19.239
+you know, it's a good note-taking system. Let's put it at this,
+
+00:07:19.240 --> 00:07:23.519
+let's not concern ourselves with comparison, at least Org, you know,
+
+00:07:23.520 --> 00:07:26.559
+the best thing about comparing is cross-pollination,
+
+00:07:26.560 --> 00:07:29.639
+which is made all the more easier with something like Emacs,
+
+00:07:29.640 --> 00:07:33.399
+because ideas from one mode can be taken and applied in another mode.
+
+00:07:33.400 --> 00:07:36.799
+Now, maybe not straightforwardly between Hyperbole and Org,
+
+00:07:36.800 --> 00:07:39.439
+but the idea can be translated at the very least.
+
+00:07:39.440 --> 00:07:42.959
+You did have a question, I'll answer this one very quick,
+
+00:07:42.960 --> 00:07:44.639
+because it's a quick one.
+
+00:07:44.640 --> 00:07:46.919
+Yeah, yes, you want to take it?
+
+00:07:46.920 --> 00:07:51.079
+I just want to quickly follow up on what you said there,
+
+00:07:51.080 --> 00:07:56.399
+that, ah, now I lost, I lost it, maybe come back,
+
+00:07:56.400 --> 00:07:59.039
+so let's jump into the question instead,
+
+00:07:59.040 --> 00:08:08.239
+because I got an answer, so thank you for everybody who wrote the answer,
+
+00:08:08.240 --> 00:08:13.359
+great, and the next question was, this talk is really straightforward,
+
+00:08:13.360 --> 00:08:16.119
+so that's probably why there aren't many questions,
+
+00:08:16.120 --> 00:08:19.959
+maybe Mats could talk about Hyperbole in general, while he was, aha, okay,
+
+00:08:19.960 --> 00:08:24.279
+that's maybe what you were trying to do here, so maybe I should,
+
+00:08:24.280 --> 00:08:27.719
+and the last one is, second question, last question is,
+
+NOTE How did you present the right buffer with shortcuts at the right of your buffer?
+
+00:08:27.720 --> 00:08:30.719
+how did you present the lossage bar at the right of your buffer?
+
+00:08:30.720 --> 00:08:36.639
+A lot of people are wondering, the lossage bar, oh, well, you have
+
+00:08:36.640 --> 00:08:41.399
+to elaborate on what the lossage bar is. I can, although
+
+00:08:41.400 --> 00:08:45.199
+I do have a slight problem, my daily backup is running,
+
+00:08:45.200 --> 00:08:48.639
+so if my voice is crackly, I'm sorry, I can't do anything about it,
+
+00:08:48.640 --> 00:08:49.279
+can you hear me?
+
+00:08:49.280 --> 00:08:51.719
+Yeah, you're shopping up,
+
+00:08:51.720 --> 00:08:57.319
+but I can understand what you're saying, so that's great.
+
+00:08:57.320 --> 00:09:01.719
+So lossage is the stuff that you have on the right side of your screen,
+
+00:09:01.720 --> 00:09:05.399
+it's the commands that you're running and the key binding that you're using
+
+00:09:05.400 --> 00:09:08.719
+to run them, and yes, this is a mode that we ask,
+
+00:09:08.720 --> 00:09:12.159
+or that we provide Emacs on speakers with,
+
+00:09:12.160 --> 00:09:16.599
+and it's called interactive log mode, which is available on GitHub,
+
+00:09:16.600 --> 00:09:21.079
+which will allow you to have this pretty print on the right side of your screen,
+
+00:09:21.080 --> 00:09:22.279
+or whatever really, it's just a buffer.
+
+00:09:22.280 --> 00:09:30.159
+Yeah, and I haven't used it before doing this presentation, so it was a news
+
+00:09:30.160 --> 00:09:38.559
+to me, so I'm very new to using it, but it works. Well, if you move around,
+
+00:09:38.560 --> 00:09:40.199
+you see that, yeah.
+
+00:09:40.200 --> 00:09:46.519
+So for the people, we did open up the BBB chat room now,
+
+00:09:46.520 --> 00:09:50.199
+which means that again, if you go to the talk page for Matz,
+
+00:09:50.200 --> 00:09:56.839
+where this was Button, you will be able to join the BBB by clicking on the link,
+
+00:09:56.840 --> 00:09:59.199
+and you'll be able to ask questions right away to Matz.
+
+00:09:59.200 --> 00:10:03.439
+We've started a nice question about org hyperbole and stuff like this,
+
+00:10:03.440 --> 00:10:06.559
+but maybe we should, yes, I'm trying to save you here,
+
+00:10:06.560 --> 00:10:09.679
+maybe we should re-center on the buttons and what they can do,
+
+00:10:09.680 --> 00:10:13.679
+especially what we talked about Elisp, allowing buttons to be whatever,
+
+00:10:13.680 --> 00:10:17.839
+and since Matz, you have your Emacs available,
+
+00:10:17.840 --> 00:10:21.279
+it might be a good opportunity for you to show some of the buttons
+
+00:10:21.280 --> 00:10:24.119
+that you're using as well, maybe some different ones that you've presented.
+
+00:10:24.120 --> 00:10:27.199
+So if people want to join, that would be a great opportunity
+
+00:10:27.200 --> 00:10:32.359
+to ask your questions. We have about 20 more minutes of Q&A,
+
+00:10:32.360 --> 00:10:36.199
+and if we don't have any more people showing up
+
+00:10:36.200 --> 00:10:40.319
+and no more questions on the pad, we can also go on a little break,
+
+00:10:40.320 --> 00:10:44.719
+and I would appreciate this, but I'm also happy to stay.
+
+00:10:44.720 --> 00:10:52.479
+Yeah, I understand the interest, but there are more talks coming up
+
+00:10:52.480 --> 00:10:58.199
+in related to hyperbole, and I haven't prepared any cool stuff.
+
+NOTE Working with different support systems
+
+00:10:58.200 --> 00:11:02.639
+What I could mention that I think is cool, I will not demo that,
+
+00:11:02.640 --> 00:11:09.919
+but I work as a programmer, and then I have different support systems,
+
+00:11:09.920 --> 00:11:16.719
+which have these strings, identifiers that may be linked
+
+00:11:16.720 --> 00:11:23.799
+to different information, like a ticketing system, for instance,
+
+00:11:23.800 --> 00:11:29.199
+that would do bugs. It could be like a novel text string
+
+00:11:29.200 --> 00:11:38.639
+that identify your bug or your ticket, and it's an internal tool,
+
+00:11:38.640 --> 00:11:42.799
+so no one else can support that, but by using hyperbole,
+
+00:11:42.800 --> 00:11:46.839
+I can write my own interpretation of that string
+
+00:11:46.840 --> 00:11:49.999
+and get that to work as a button, so I can easily
+
+00:11:50.000 --> 00:11:56.279
+from the code or from some notes link directly into that ticketing system.
+
+00:11:56.280 --> 00:12:03.919
+So that's the point I'm trying to make with this talk is
+
+00:12:03.920 --> 00:12:07.839
+that it's useful for setting up your own environment
+
+00:12:07.840 --> 00:12:11.719
+that only you really know about and how you want to navigate
+
+00:12:11.720 --> 00:12:20.599
+with your information, and it's not about trying to force some type
+
+00:12:20.600 --> 00:12:25.719
+of work stream upon anybody. It's more like giving you the opportunity
+
+00:12:25.720 --> 00:12:28.319
+to streamline your own workflow instead.
+
+00:12:28.320 --> 00:12:33.479
+I think the remaining talks about hyperbole will be more focused
+
+00:12:33.480 --> 00:12:38.199
+on all the features. It's a multi-functional package
+
+00:12:38.200 --> 00:12:40.119
+with a lot of different stuff in it,
+
+00:12:40.120 --> 00:12:46.999
+so I could not give justice to it in just doing some quick demos.
+
+00:12:47.000 --> 00:12:49.119
+It won't show all the things you can do.
+
+00:12:49.120 --> 00:12:52.639
+Yeah, but I'm going to say for someone saying
+
+00:12:52.640 --> 00:12:54.839
+that you couldn't do justice to the topic,
+
+00:12:54.840 --> 00:12:58.079
+you've done a very fine job, so do not worry about this.
+
+00:12:58.080 --> 00:13:01.759
+It's funny, I was listening to you describe this, the
+
+00:13:01.760 --> 00:13:03.759
+buttons really, but when
+
+00:13:03.760 --> 00:13:06.839
+you think about it, you could have forgotten about the buttons
+
+00:13:06.840 --> 00:13:11.239
+and really remembered about Emacs and would make as much sense as well,
+
+00:13:11.240 --> 00:13:14.799
+because Emacs as a whole, the Elisp stuff behind it allows you
+
+00:13:14.800 --> 00:13:17.039
+to do whatever interface you want very easily,
+
+00:13:17.040 --> 00:13:23.759
+and the buttons really enshrines the interface type of things really,
+
+00:13:23.760 --> 00:13:26.399
+because you just have a button that is running code.
+
+00:13:26.400 --> 00:13:27.799
+It's no longer, oh, you need to go to
+
+00:13:27.800 --> 00:13:30.079
+the end of the parenthesis, the end of the sex,
+
+00:13:30.080 --> 00:13:32.879
+and you need to evaluate it. There's something more interactive about it,
+
+00:13:32.880 --> 00:13:35.879
+which feels closer to your user interface as a result to this,
+
+00:13:35.880 --> 00:13:37.959
+but I've already blabbered enough.
+
+00:13:37.960 --> 00:13:40.639
+We do have someone with a microphone in the VBB chat,
+
+00:13:40.640 --> 00:13:43.399
+so does this person want to unmute themselves
+
+00:13:43.400 --> 00:13:44.279
+and ask a question, maybe?
+
+00:13:44.280 --> 00:13:52.879
+I think I have some very knowledgeable person about hyperbole in the chat.
+
+00:13:52.880 --> 00:13:57.639
+Yes, I didn't want to spoil it, but I'm not sure if they're going
+
+00:13:57.640 --> 00:14:00.759
+to unmute themselves, so I don't want to put too much pressure on them.
+
+00:14:00.760 --> 00:14:03.519
+Can you guys hear me? We can, yes.
+
+00:14:03.520 --> 00:14:09.879
+Hi, Bob. Hi, long time fan of hyperbole.
+
+00:14:09.880 --> 00:14:12.919
+You might want to cue people in on a joke here,
+
+00:14:12.920 --> 00:14:14.599
+because I'm not sure if anyone knows who you are.
+
+NOTE Bob Weiner
+
+00:14:14.600 --> 00:14:19.879
+I wrote hyperbole, and Matt's my co-maintainer on it,
+
+00:14:19.880 --> 00:14:23.159
+so really exciting to have the first talk here.
+
+00:14:23.160 --> 00:14:26.879
+I think I just wanted to mention two things.
+
+00:14:26.880 --> 00:14:28.879
+Maybe you could show a little key series,
+
+00:14:28.880 --> 00:14:33.879
+just type one out dynamically and show how simple that is,
+
+00:14:33.880 --> 00:14:39.639
+and then talk about the UKIPA daily journal,
+
+00:14:39.640 --> 00:14:45.479
+right? Time-stamped journal that was originally org mode,
+
+00:14:45.480 --> 00:14:49.479
+and I think you're now using Hyperbole's K-outliner,
+
+00:14:49.480 --> 00:14:56.319
+so maybe mention doing that. Okay.
+
+00:14:56.320 --> 00:14:59.959
+Something that's more than one key sequence, please.
+
+00:14:59.960 --> 00:15:09.199
+Do a couple operations that you do a lot of or that are interesting,
+
+00:15:09.200 --> 00:15:10.839
+all in one.
+
+00:15:10.840 --> 00:15:15.719
+So the key series is like a keyboard macro,
+
+00:15:15.720 --> 00:15:20.879
+so it's not limited to one key sequence,
+
+00:15:20.880 --> 00:15:27.199
+but any series of key sequences can be strung together
+
+00:15:27.200 --> 00:15:28.879
+just like that with nothing else,
+
+00:15:28.880 --> 00:15:35.399
+and then you activate it the same way as any other button, right?
+
+00:15:35.400 --> 00:15:38.079
+Yes, but you're putting me on the spot here,
+
+00:15:38.080 --> 00:15:41.199
+because now I have to remember, actually, how to write these things.
+
+00:15:41.200 --> 00:15:46.079
+You just write it the way you would type it.
+
+00:15:46.080 --> 00:15:49.479
+Yeah, I see it.
+
+00:15:49.480 --> 00:16:00.079
+Okay, so let's see. So the key series is between these braces and...
+
+00:16:00.080 --> 00:16:05.159
+And you could leave out the quote marks if you don't...
+
+00:16:05.160 --> 00:16:07.639
+Maybe I can skip that as well.
+
+00:16:07.640 --> 00:16:09.559
+So here's the key series.
+
+00:16:09.560 --> 00:16:10.919
+Let's see what's happening.
+
+00:16:10.920 --> 00:16:12.999
+Do I go to the 10th folder or not?
+
+00:16:13.000 --> 00:16:16.119
+Boom, I got there. Yeah, it worked.
+
+00:16:16.120 --> 00:16:23.159
+Bob, great. So you can name them and then reuse them,
+
+00:16:23.160 --> 00:16:29.119
+and so it's sort of like you've got this toolkit that you can embed
+
+00:16:29.120 --> 00:16:31.919
+in all these different modes that you have in Emacs,
+
+00:16:31.920 --> 00:16:34.639
+and you just carry it with you.
+
+00:16:34.640 --> 00:16:38.759
+It's not like a whole mode unto itself that you always have to use.
+
+00:16:38.760 --> 00:16:46.599
+Yeah, so in this example here with the field, you can,
+
+00:16:46.600 --> 00:16:52.119
+instead of having like this path string here,
+
+00:16:52.120 --> 00:16:54.359
+you can have a key series as well.
+
+00:16:54.360 --> 00:17:01.399
+But to the other point, also, Elisp is available,
+
+00:17:01.400 --> 00:17:02.959
+but this is even more available
+
+00:17:02.960 --> 00:17:05.959
+because you don't even have to code using Elisp.
+
+00:17:05.960 --> 00:17:09.079
+So that's the point also with this, the fill and the file macros.
+
+00:17:09.080 --> 00:17:11.879
+You should make it even simpler.
+
+00:17:11.880 --> 00:17:15.519
+And if you just know how to type some command,
+
+00:17:15.520 --> 00:17:18.679
+you can use the key series together with this
+
+00:17:18.680 --> 00:17:21.359
+to get some functionality out of this.
+
+00:17:21.360 --> 00:17:26.399
+I think one of the things we've taken to saying about Hyperbole
+
+00:17:26.400 --> 00:17:31.239
+is it's kind of the lightest hypertext markup
+
+00:17:31.240 --> 00:17:35.159
+that you can have, as you saw there, right?
+
+00:17:35.160 --> 00:17:37.519
+I mean, there were just braces, and all of a sudden,
+
+00:17:37.520 --> 00:17:40.999
+it's a live hyper button. So we've tried to strip away
+
+00:17:41.000 --> 00:17:44.879
+having to write stuff like HTML or even all the drawers
+
+00:17:44.880 --> 00:17:47.519
+and stuff like that, and we've tried to make it so that you know,
+
+00:17:47.520 --> 00:17:51.439
+even all the like drawers and the property markup in org mode,
+
+00:17:51.440 --> 00:17:57.679
+and just provide very, very simple sort of syntactical things similar
+
+00:17:57.680 --> 00:18:01.679
+to what Elisp does, so that you can get a lot of power
+
+00:18:01.680 --> 00:18:07.999
+and put buttons everywhere, but not have to recognize a lot of syntax
+
+00:18:08.000 --> 00:18:11.639
+or use a whole bunch of keys on your buttons.
+
+00:18:11.640 --> 00:18:16.039
+It's pretty interesting,
+
+00:18:16.040 --> 00:18:16.679
+by the way.
+
+00:18:16.680 --> 00:18:17.959
+I'm sorry I have to do this,
+
+00:18:17.960 --> 00:18:20.519
+but we only have about five more minutes in the Q&A before we need
+
+00:18:20.520 --> 00:18:24.039
+to move on to the next talk. But don't worry, you've had a little test
+
+00:18:24.040 --> 00:18:27.079
+of Hyperbole right there, and you'll have more over the weekend.
+
+00:18:27.080 --> 00:18:30.319
+We've had a lot of Hyperbole talk this year, which is amazing.
+
+00:18:30.320 --> 00:18:33.559
+You know, we usually have a lot of talk about org, but this year
+
+00:18:33.560 --> 00:18:37.479
+is truly the one where we also have a similar amount of Hyperbole talk,
+
+00:18:37.480 --> 00:18:42.399
+which is amazing to see. Obviously, I am more of an org guy,
+
+00:18:42.400 --> 00:18:45.679
+but I see so many parallels between the two, so many bridges
+
+00:18:45.680 --> 00:18:50.319
+that could be built as well, and it's amazing to see the amount of passion
+
+00:18:50.320 --> 00:18:53.439
+that goes into this. Usually I deal with people who are passionate about org,
+
+00:18:53.440 --> 00:18:56.719
+but to see that there's a similar amount of passion on the Hyperbole side
+
+00:18:56.720 --> 00:18:58.279
+of things is truly amazing to me.
+
+00:18:58.280 --> 00:19:04.799
+I think we had one more question in the pad, if you can take it, Matt.
+
+NOTE Do the links/buttons created in hyperbole (like that one with the url) get exported on org-mode files too? (like when exported to html)
+
+00:19:04.800 --> 00:19:10.639
+Yeah, the last here is, does the links buttons create in Hyperbole,
+
+00:19:10.640 --> 00:19:16.159
+like the one with the URL get exported on org mode files too,
+
+00:19:16.160 --> 00:19:18.999
+like when exported to HTML?
+
+00:19:19.000 --> 00:19:21.039
+Oh, tricky question.
+
+00:19:21.040 --> 00:19:31.519
+I mean, these implicit buttons, they are just like the patterns.
+
+00:19:31.520 --> 00:19:35.319
+So the pattern will of course be exported to HTML,
+
+00:19:35.320 --> 00:19:37.439
+but you will not be able maybe
+
+00:19:37.440 --> 00:19:43.519
+to do something there unless you're watching the HTML within Emacs,
+
+00:19:43.520 --> 00:19:50.199
+so the sort of Hyperbole machinery would be available, if that makes sense.
+
+00:19:50.200 --> 00:19:58.359
+I mean, yeah, it's possible. It depends what the encoding is,
+
+00:19:58.360 --> 00:20:03.999
+what the encoding is, but we do have an outliner mode, the K outliner
+
+00:20:04.000 --> 00:20:10.439
+in Hyperbole as well, and that has a single command export to HTML.
+
+00:20:10.440 --> 00:20:13.879
+So if you've embedded URLs in there,
+
+00:20:13.880 --> 00:20:19.519
+you would see them just like if you embedded them in org mode,
+
+00:20:19.520 --> 00:20:25.559
+and potentially the org exporter, if you just write a raw URL,
+
+00:20:25.560 --> 00:20:30.119
+will also encode it for you when you export it.
+
+00:20:30.120 --> 00:20:35.039
+There's other Hyperbole buttons in there. Yeah, but the functionality that
+
+00:20:35.040 --> 00:20:38.159
+is by clicking on that button will not be exported.
+
+00:20:38.160 --> 00:20:44.079
+Well, it's like you can try printing the button, I'm not sure. No amount
+
+00:20:44.080 --> 00:20:46.479
+of clicking on it is actually going to trigger an action.
+
+00:20:46.480 --> 00:20:51.639
+I might be wrong though. Sorry, I mean printing on paper,
+
+00:20:51.640 --> 00:20:55.799
+it's a very confusing terminology that we're using right there, not printing
+
+00:20:55.800 --> 00:20:56.759
+in a terminal.
+
+00:20:56.760 --> 00:21:02.359
+One cool thing if you use the Hyperbole export to HTML is
+
+00:21:02.360 --> 00:21:07.519
+that you can expand and collapse your trees in the HTML.
+
+00:21:07.520 --> 00:21:10.439
+I don't think you can do that with the org export right now.
+
+00:21:10.440 --> 00:21:15.999
+But Bob, you're going to show something about that tomorrow, right?
+
+00:21:16.000 --> 00:21:21.319
+I don't think it's in this presentation because I'm- Oh, it's not
+
+00:21:21.320 --> 00:21:25.079
+in the presentation, okay. On the org side of the house this time,
+
+00:21:25.080 --> 00:21:32.879
+but it'll be in a different one about Hyperbole some other time. All right,
+
+00:21:32.880 --> 00:21:36.199
+so we have about two minutes until we need to go to the next talk,
+
+00:21:36.200 --> 00:21:38.479
+but thank you so much, Matz, and thank you so much, Bob,
+
+00:21:38.480 --> 00:21:41.839
+also for showing up and giving us a taste of what is probably going
+
+00:21:41.840 --> 00:21:44.759
+to follow up tomorrow. I can't remember, I think your talk is
+
+00:21:44.760 --> 00:21:51.599
+in the afternoon, right, Bob? Correct, about 1 p.m. EST. Yeah, so
+
+00:21:51.600 --> 00:21:56.959
+in about 22 hours, 23 hours. I'm trying my best to give you times
+
+00:21:56.960 --> 00:21:59.119
+which are time zone independence,
+
+00:21:59.120 --> 00:22:01.839
+so I'm sorry if I'm missing the mark a little bit,
+
+00:22:01.840 --> 00:22:04.679
+but hopefully this would be useful for many people. But otherwise,
+
+00:22:04.680 --> 00:22:07.719
+just check the schedule and you'll be able to get everything. All right, well,
+
+00:22:07.720 --> 00:22:09.999
+thank you so much, Matz, for answering so many questions
+
+00:22:10.000 --> 00:22:12.839
+and for your presentation as well. I feel like it was good
+
+00:22:12.840 --> 00:22:16.599
+to have your presentation before Bob's one tomorrow,
+
+00:22:16.600 --> 00:22:22.039
+because focusing on the one aspect of Hyperbole, the buttons, and linking it
+
+00:22:22.040 --> 00:22:26.119
+to Elisp, linking it to interactivity, linking it to UI, I think is going
+
+00:22:26.120 --> 00:22:29.239
+to prime people to then understand fully what Hyperbole,
+
+00:22:29.240 --> 00:22:34.319
+or what are the capabilities of Hyperbole, beyond this, or inspired by this.
+
+00:22:34.320 --> 00:22:37.199
+So thank you so much. Thanks, Matz. Thank you.
+
+00:22:37.200 --> 00:22:38.599
+Great.
+
+00:22:38.600 --> 00:22:42.519
+All right, and we are going live with the next talk in about 30 seconds.
+
+00:22:42.520 --> 00:22:45.519
+I think we're going to close the BBB room,
+
+00:22:45.520 --> 00:22:49.759
+because nobody has showed up otherwise. So I will see you both later.
+
+00:22:49.760 --> 00:22:50.599
+Bye-bye.
+
+00:22:50.600 --> 00:22:54.000
+Bye-bye.
diff --git a/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main--chapters.vtt b/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main--chapters.vtt
new file mode 100644
index 00000000..53204574
--- /dev/null
+++ b/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main--chapters.vtt
@@ -0,0 +1,49 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:01:01.760
+Introduction
+
+26
+00:01:01.760 --> 00:01:29.920
+Implicit buttons
+
+37
+00:01:29.920 --> 00:02:37.080
+Filenames
+
+57
+00:02:37.080 --> 00:03:10.120
+Other built-in implicit buttons
+
+68
+00:03:10.120 --> 00:04:13.400
+Creating new implicit button types with defib, defil, and defal
+
+94
+00:04:13.400 --> 00:04:44.480
+Personal data
+
+106
+00:04:44.480 --> 00:07:10.720
+Defining an implicit button with defil
+
+154
+00:07:10.720 --> 00:07:54.520
+Types of link expressions
+
+171
+00:07:54.520 --> 00:08:32.200
+Another button example
+
+184
+00:08:32.200 --> 00:08:57.160
+Action buttons
+
+191
+00:08:57.160 --> 00:09:29.760
+The defal macro
+
+202
+00:09:29.760 --> 00:10:32.000
+Conclusion
diff --git a/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.vtt b/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.vtt
new file mode 100644
index 00000000..e7e58879
--- /dev/null
+++ b/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.vtt
@@ -0,0 +1,890 @@
+WEBVTT captioned by sachac
+
+1
+00:00:00.000 --> 00:00:06.280
+Hi everyone! I'm Mats Liddell.
+
+2
+00:00:06.280 --> 00:00:07.320
+In this talk, I will show
+
+3
+00:00:07.320 --> 00:00:09.040
+how you can link to personal data
+
+4
+00:00:09.040 --> 00:00:13.960
+using Hyperbole's support for implicit button types.
+
+5
+00:00:13.960 --> 00:00:16.040
+Before starting, a few words about me.
+
+6
+00:00:16.040 --> 00:00:18.000
+I work as a software engineer,
+
+7
+00:00:18.000 --> 00:00:19.200
+and in my spare time
+
+8
+00:00:19.200 --> 00:00:21.280
+I'm co-maintaining the Hyperbole package
+
+9
+00:00:21.280 --> 00:00:24.360
+together with the package author Bob Weiner.
+
+10
+00:00:24.360 --> 00:00:27.240
+Hyperbole dates back to 1993,
+
+11
+00:00:27.240 --> 00:00:29.680
+and have had some inactive years in the past,
+
+12
+00:00:29.680 --> 00:00:31.680
+but work is now active again.
+
+13
+00:00:31.680 --> 00:00:33.080
+The package is available
+
+14
+00:00:33.080 --> 00:00:36.160
+through the GNU ELPA package archive.
+
+15
+00:00:36.160 --> 00:00:37.960
+The talk will focus on
+
+16
+00:00:37.960 --> 00:00:39.600
+creation of implicit button types.
+
+17
+00:00:39.600 --> 00:00:41.480
+For more info on Hyperbole,
+
+18
+00:00:41.480 --> 00:00:43.120
+listen to other presentations
+
+19
+00:00:43.120 --> 00:00:46.360
+and check out the package documentation.
+
+20
+00:00:46.360 --> 00:00:50.000
+What I want you to take with you from this talk is
+
+21
+00:00:50.000 --> 00:00:51.640
+that the implicit button types
+
+22
+00:00:51.640 --> 00:00:54.440
+can make patterns in your files into buttons;
+
+23
+00:00:54.440 --> 00:00:56.600
+and that new implicit button types
+
+24
+00:00:56.600 --> 00:00:58.480
+can quickly be created by using
+
+25
+00:00:58.480 --> 00:01:01.760
+the `defil` and the `defal` macros.
+
+26
+00:01:01.760 --> 00:01:05.160
+So what is an implicit button type?
+
+27
+00:01:05.160 --> 00:01:06.800
+I think of it as a text pattern
+
+28
+00:01:06.800 --> 00:01:08.920
+that has some extended meaning.
+
+29
+00:01:08.920 --> 00:01:10.760
+When you see the pattern in the text,
+
+30
+00:01:10.760 --> 00:01:12.800
+you can think of it as a button type.
+
+31
+00:01:12.800 --> 00:01:13.880
+When you press the button,
+
+32
+00:01:13.880 --> 00:01:16.880
+something related to that meaning happens.
+
+33
+00:01:16.880 --> 00:01:19.000
+It can be jumping to some place,
+
+34
+00:01:19.000 --> 00:01:22.440
+opening an external tool, doing some computation.
+
+35
+00:01:22.440 --> 00:01:24.160
+So there can be some action
+
+36
+00:01:24.160 --> 00:01:29.920
+associated with the pattern.
+
+37
+00:01:29.920 --> 00:01:33.320
+To make it clear, let's look at some examples.
+
+38
+00:01:33.320 --> 00:01:36.080
+Let's start with something that is maybe so obvious
+
+39
+00:01:36.080 --> 00:01:39.600
+that you don't even think of it as a pattern: a file name.
+
+40
+00:01:39.600 --> 00:01:41.360
+When you see such a string in text,
+
+41
+00:01:41.360 --> 00:01:45.360
+you will naturally associate it with a file on disk,
+
+42
+00:01:45.360 --> 00:01:46.720
+and if you would click on it,
+
+43
+00:01:46.720 --> 00:01:52.680
+you would probably expect that file to open.
+
+44
+00:01:52.680 --> 00:01:55.120
+In the first sentence on the slide,
+
+45
+00:01:55.120 --> 00:01:56.840
+you might recognize the file name
+
+46
+00:01:56.840 --> 00:02:01.760
+for the bash initialization file, ~/.bashrc.
+
+47
+00:02:01.760 --> 00:02:03.840
+Hyperbole comes with built-in support
+
+48
+00:02:03.840 --> 00:02:06.520
+for recognizing files and directory path names
+
+49
+00:02:06.520 --> 00:02:08.680
+as implicit button types in text.
+
+50
+00:02:08.680 --> 00:02:11.760
+For Hyperbole to take action on the button type,
+
+51
+00:02:11.760 --> 00:02:13.440
+you move the cursor within the button
+
+52
+00:02:13.440 --> 00:02:16.320
+and press M-RET or use a mouse click.
+
+53
+00:02:16.320 --> 00:02:22.360
+So let's try that.
+
+54
+00:02:22.360 --> 00:02:27.720
+Similar for the path, /usr/local in the next sentence.
+
+55
+00:02:27.720 --> 00:02:29.520
+That will open the corresponding
+
+56
+00:02:29.520 --> 00:02:37.080
+directory using dired-mode.
+
+57
+00:02:37.080 --> 00:02:39.760
+Other examples of built-in implicit button types
+
+58
+00:02:39.760 --> 00:02:43.720
+that Hyperbole recognizes are email addresses,
+
+59
+00:02:43.720 --> 00:02:47.320
+web addresses, requests for comment documents
+
+60
+00:02:47.320 --> 00:02:50.120
+in the form of RFC followed by a number,
+
+61
+00:02:50.120 --> 00:02:53.040
+GNU debbugs issues, plus many more.
+
+62
+00:02:53.040 --> 00:02:55.360
+These are some examples
+
+63
+00:02:55.360 --> 00:02:58.080
+of implicit button types with built-in support.
+
+64
+00:02:58.080 --> 00:02:59.920
+I list them here to give you an idea
+
+65
+00:02:59.920 --> 00:03:02.480
+how the text pattern in itself is enough
+
+66
+00:03:02.480 --> 00:03:03.960
+for the system to recognize it
+
+67
+00:03:03.960 --> 00:03:10.120
+as something actionable.
+
+68
+00:03:10.120 --> 00:03:12.480
+So as shown, Hyperbole has built-in support
+
+69
+00:03:12.480 --> 00:03:14.040
+for implicit buttons.
+
+70
+00:03:14.040 --> 00:03:16.120
+There's only one problem here.
+
+71
+00:03:16.120 --> 00:03:17.920
+The behavior is predefined.
+
+72
+00:03:17.920 --> 00:03:20.240
+There is of course a trade off.
+
+73
+00:03:20.240 --> 00:03:21.560
+It is convenient to get
+
+74
+00:03:21.560 --> 00:03:23.480
+many button types out of the box
+
+75
+00:03:23.480 --> 00:03:25.520
+with likely good standard behavior
+
+76
+00:03:25.520 --> 00:03:27.680
+and that works in many places.
+
+77
+00:03:27.680 --> 00:03:29.360
+But what if you would want to create
+
+78
+00:03:29.360 --> 00:03:31.160
+your own completely new mapping,
+
+79
+00:03:31.160 --> 00:03:32.880
+possibly to your own data?
+
+80
+00:03:32.880 --> 00:03:38.120
+It is here that Hyperbole's support for creating
+
+81
+00:03:38.120 --> 00:03:41.280
+new implicit button types comes in.
+
+82
+00:03:41.280 --> 00:03:43.360
+For the full pattern matching button type,
+
+83
+00:03:43.360 --> 00:03:46.720
+like for the filename and examples we just looked at,
+
+84
+00:03:46.720 --> 00:03:48.754
+you need to define the implicit button
+
+00:03:48.755 --> 00:03:50.920
+using the macro, `defib`.
+
+85
+00:03:50.920 --> 00:03:53.280
+The downside of that is
+
+86
+00:03:53.280 --> 00:03:54.920
+you need to code at the elisp level.
+
+87
+00:03:54.920 --> 00:03:57.240
+However, if you are creating a new pattern
+
+88
+00:03:57.240 --> 00:03:59.120
+that has well-defined delimiters,
+
+89
+00:03:59.120 --> 00:04:01.360
+there is support for that in an easier way.
+
+90
+00:04:01.360 --> 00:04:03.800
+These support functions, or rather macros,
+
+91
+00:04:03.800 --> 00:04:06.240
+are `defil` and `defal`.
+
+92
+00:04:06.240 --> 00:04:08.440
+We will look at those macros soon,
+
+93
+00:04:08.440 --> 00:04:13.400
+but first, my definition of personal data.
+
+94
+00:04:13.400 --> 00:04:18.200
+I think of personal data as something
+
+95
+00:04:18.200 --> 00:04:19.680
+that you would like to link to,
+
+96
+00:04:19.680 --> 00:04:21.440
+but it's not necessarily in a form
+
+97
+00:04:21.440 --> 00:04:23.360
+supported by any known tool.
+
+98
+00:04:23.360 --> 00:04:26.920
+It might be stored on a web server, local storage,
+
+99
+00:04:26.920 --> 00:04:28.680
+or could even be some computation
+
+100
+00:04:28.680 --> 00:04:29.400
+rather than a link.
+
+101
+00:04:29.400 --> 00:04:32.200
+What all these cases have in common is that
+
+102
+00:04:32.200 --> 00:04:34.240
+you want to be able to reference it
+
+103
+00:04:34.240 --> 00:04:36.640
+in a short, and for you, descriptive way.
+
+104
+00:04:36.640 --> 00:04:38.960
+So when you write text, you can use
+
+105
+00:04:38.960 --> 00:04:44.480
+a new implicit type to create the connection.
+
+106
+00:04:44.480 --> 00:04:46.600
+This might be a bit abstract,
+
+107
+00:04:46.600 --> 00:04:48.080
+so let's look at an example.
+
+108
+00:04:48.080 --> 00:04:51.000
+Suppose you have a flat file structure
+
+109
+00:04:51.000 --> 00:04:52.760
+with some notes in each file.
+
+110
+00:04:52.760 --> 00:04:54.520
+It can look like this.
+
+111
+00:04:54.520 --> 00:04:57.400
+In the data folder, we have two files
+
+112
+00:04:57.400 --> 00:05:00.200
+that represents the notes we have taken.
+
+113
+00:05:00.200 --> 00:05:02.840
+We now want to be able to link to these notes
+
+114
+00:05:02.840 --> 00:05:07.120
+from outside of the data folder.
+
+115
+00:05:07.120 --> 00:05:08.960
+Let's make an implicit button type
+
+116
+00:05:08.960 --> 00:05:10.920
+that opens a file in this structure.
+
+117
+00:05:10.920 --> 00:05:13.520
+To make the pattern stand out in text,
+
+118
+00:05:13.520 --> 00:05:16.640
+we use double braces as start and stop delimiters.
+
+119
+00:05:16.640 --> 00:05:20.080
+An implicit button instance
+
+120
+00:05:20.080 --> 00:05:22.760
+would then look like this.
+
+121
+00:05:22.760 --> 00:05:27.680
+We can create that using the `defil` macro like this.
+
+122
+00:05:27.680 --> 00:05:31.840
+This invocation of the field
+
+123
+00:05:31.840 --> 00:05:34.480
+creates a button type "demo-link-to-file"
+
+124
+00:05:34.480 --> 00:05:37.280
+with the start delimiter of "{{"
+
+125
+00:05:37.280 --> 00:05:40.560
+and then delimiters of "}}",
+
+126
+00:05:40.560 --> 00:05:43.320
+the regular expression ".*" pattern
+
+127
+00:05:43.320 --> 00:05:45.640
+to match everything between the delimiters,
+
+128
+00:05:45.640 --> 00:05:48.800
+and finally, the action defined by the link expression.
+
+129
+00:05:48.800 --> 00:05:52.160
+Pattern substitution is performed
+
+130
+00:05:52.160 --> 00:05:54.440
+on the link expression before evaluation
+
+131
+00:05:54.440 --> 00:05:57.920
+so that the text that is in between the delimiters
+
+132
+00:05:57.920 --> 00:06:02.360
+is inserted where the "\\&" is in the link expression.
+
+134
+00:06:02.360 --> 00:06:07.560
+So all in all, implicit type instance will result in
+
+135
+00:06:07.560 --> 00:06:11.760
+the link expression of "~/data/FileA",
+
+136
+00:06:11.760 --> 00:06:14.520
+which we recognize as a file path.
+
+137
+00:06:14.520 --> 00:06:18.040
+With a single-line expression,
+
+138
+00:06:18.040 --> 00:06:21.040
+we have created our own hyperbutton syntax
+
+139
+00:06:21.040 --> 00:06:23.080
+that we can use in any Emacs buffer
+
+140
+00:06:23.080 --> 00:06:25.560
+to link to this custom set of data.
+
+141
+00:06:25.560 --> 00:06:30.960
+So let's evaluate the defil and use it.
+
+142
+00:06:30.960 --> 00:06:33.760
+I have prepared the files so that they already
+
+143
+00:06:33.760 --> 00:06:36.400
+contain some text and implicit links.
+
+144
+00:06:36.400 --> 00:06:43.760
+So from the presentation, we can go to FileA,
+
+145
+00:06:43.760 --> 00:06:48.720
+and from there to fileB.
+
+146
+00:06:48.720 --> 00:06:51.040
+Since the Hyperbole path expression
+
+147
+00:06:51.040 --> 00:06:53.640
+supports outline structures, we can,
+
+148
+00:06:53.640 --> 00:06:55.960
+as an extra bonus, reference directly
+
+149
+00:06:55.960 --> 00:06:57.560
+the headers in the files,
+
+150
+00:06:57.560 --> 00:07:00.160
+so we can, for example, link directly
+
+151
+00:07:00.160 --> 00:07:02.600
+to "More Notes" in FileB.
+
+152
+00:07:02.600 --> 00:07:10.720
+We have now created a simple info system.
+
+154
+00:07:10.720 --> 00:07:16.440
+Looking deeper at the link expression,
+
+155
+00:07:16.440 --> 00:07:19.840
+it can be of four different types:
+
+156
+00:07:19.840 --> 00:07:22.040
+A file path expression,
+
+157
+00:07:22.040 --> 00:07:23.520
+as we have already looked at;
+
+158
+00:07:23.520 --> 00:07:25.960
+a brace-delimited key series,
+
+159
+00:07:25.960 --> 00:07:27.960
+that is, a series of command keys
+
+160
+00:07:27.960 --> 00:07:29.480
+for performing some action,
+
+161
+00:07:29.480 --> 00:07:30.960
+much like a keyboard macro;
+
+162
+00:07:30.960 --> 00:07:36.240
+An URL; or a function that takes one argument,
+
+163
+00:07:36.240 --> 00:07:38.640
+which will be given the button text as input.
+
+164
+00:07:38.640 --> 00:07:42.880
+The URL link expression allows you
+
+165
+00:07:42.880 --> 00:07:44.480
+to link to web pages.
+
+166
+00:07:44.480 --> 00:07:46.560
+So if the data you want to link to
+
+167
+00:07:46.560 --> 00:07:48.640
+is accessible through the Web
+
+168
+00:07:48.640 --> 00:07:50.880
+and the URL can be constructed
+
+169
+00:07:50.880 --> 00:07:53.000
+from the button text in a meaningful way,
+
+170
+00:07:53.000 --> 00:07:54.520
+it is possible to do that.
+
+171
+00:07:54.520 --> 00:07:56.160
+Let's create the button type
+
+172
+00:07:56.160 --> 00:07:57.720
+that links to GNU software.
+
+173
+00:07:57.720 --> 00:08:01.088
+The URL to the GNU software catalog
+
+00:08:01.089 --> 00:08:04.680
+is www.gnu.org/software,
+
+174
+00:08:04.680 --> 00:08:07.440
+and with what we know about the field,
+
+175
+00:08:07.440 --> 00:08:09.640
+it is easy to create the button type for that.
+
+176
+00:08:09.640 --> 00:08:11.000
+It can look like this.
+
+177
+00:08:11.000 --> 00:08:16.200
+And here are two possible buttons
+
+178
+00:08:16.200 --> 00:08:19.320
+linking to Emacs and Hyperbole.
+
+179
+00:08:19.320 --> 00:08:24.200
+So let's again evaluate the defil and use it.
+
+180
+00:08:24.200 --> 00:08:28.120
+Please note that not all GNU software
+
+181
+00:08:28.120 --> 00:08:29.000
+is under that URL,
+
+182
+00:08:29.000 --> 00:08:31.000
+so this simple definition will not work
+
+183
+00:08:31.000 --> 00:08:32.200
+to link to everything.
+
+184
+00:08:32.200 --> 00:08:37.280
+To highlight the fact that the button action
+
+185
+00:08:37.280 --> 00:08:39.080
+does not have to be a link,
+
+186
+00:08:39.080 --> 00:08:40.600
+but can be any action,
+
+187
+00:08:40.600 --> 00:08:42.200
+let's look at a math example.
+
+188
+00:08:42.200 --> 00:08:44.800
+Here is the button type that does some math
+
+189
+00:08:44.800 --> 00:08:47.480
+and writes the result in the message area.
+
+190
+00:08:47.480 --> 00:08:57.160
+Let's evaluate and use it.
+
+191
+00:08:57.160 --> 00:08:59.760
+Before ending, I would like to mention
+
+192
+00:08:59.760 --> 00:09:00.760
+the defal macro.
+
+193
+00:09:00.760 --> 00:09:02.920
+It is similar to the defil macro,
+
+194
+00:09:02.920 --> 00:09:04.880
+but simpler, since it uses a form
+
+195
+00:09:04.880 --> 00:09:07.880
+of the implicit button type with no delimiters.
+
+196
+00:09:07.880 --> 00:09:14.800
+It is simply <TYPE LINK-EXPR>.
+
+197
+00:09:14.800 --> 00:09:17.920
+So the implicit button type contains the link type
+
+198
+00:09:17.920 --> 00:09:18.960
+in clear text.
+
+199
+00:09:18.960 --> 00:09:23.120
+Our recent FSF software button
+
+200
+00:09:23.120 --> 00:09:24.854
+would be created like this.
+
+00:09:24.855 --> 00:09:29.760
+And it would be instantiated in text like this.
+
+202
+00:09:29.760 --> 00:09:34.960
+I have shown how you,
+
+203
+00:09:34.960 --> 00:09:37.840
+with the help of the defil macro in Hyperbole,
+
+204
+00:09:37.840 --> 00:09:40.240
+quickly can create implicit buttons.
+
+205
+00:09:40.240 --> 00:09:41.480
+With those buttons, you can link
+
+206
+00:09:41.480 --> 00:09:43.160
+to your personal information
+
+207
+00:09:43.160 --> 00:09:44.160
+in the form it may have.
+
+208
+00:09:44.160 --> 00:09:47.200
+By the nature of the implicit buttons,
+
+209
+00:09:47.200 --> 00:09:49.880
+those can be used from any file in Emacs.
+
+210
+00:09:49.880 --> 00:09:52.640
+The button types can be
+
+211
+00:09:52.640 --> 00:09:54.640
+created to be used long term,
+
+212
+00:09:54.640 --> 00:09:57.680
+but even short term use within the session is possible,
+
+213
+00:09:57.680 --> 00:09:59.880
+since the creation is simple and quick.
+
+214
+00:09:59.880 --> 00:10:03.400
+Inspired by this, I hope you will find ways
+
+215
+00:10:03.400 --> 00:10:04.760
+to create implicit buttons
+
+216
+00:10:04.760 --> 00:10:07.360
+that will support you getting to your information.
+
+217
+00:10:07.360 --> 00:10:09.240
+For the simplest cases,
+
+218
+00:10:09.240 --> 00:10:11.400
+the field and the file macros might be enough.
+
+219
+00:10:11.400 --> 00:10:13.360
+For more complicated cases,
+
+220
+00:10:13.360 --> 00:10:15.760
+using a tailor-made function can be an option.
+
+221
+00:10:15.760 --> 00:10:19.480
+If you know Elisp, use the defib macro
+
+222
+00:10:19.480 --> 00:10:22.240
+which gives you full control over the button type.
+
+223
+00:10:22.240 --> 00:10:32.000
+Thank you.
diff --git a/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.vtt b/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.vtt
new file mode 100644
index 00000000..75b624a9
--- /dev/null
+++ b/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.vtt
@@ -0,0 +1,1691 @@
+WEBVTT
+
+00:00.000 --> 00:02.600
+the recording button here.
+
+00:02.600 --> 00:03.600
+OK.
+
+00:03.600 --> 00:05.180
+Thank you again for the great talk,
+
+00:05.180 --> 00:06.680
+even though I haven't been able to catch most of it
+
+00:06.680 --> 00:08.560
+because I've been running around behind the scenes.
+
+00:08.560 --> 00:11.360
+But very much interested in DBUS and Emacs.
+
+00:11.360 --> 00:13.240
+I'm very much looking forward to watching it
+
+00:13.240 --> 00:14.080
+after the conference.
+
+00:14.080 --> 00:18.360
+But for folks who were able to and did catch the talk,
+
+00:18.360 --> 00:21.680
+please, now it's time to send in your questions.
+
+00:21.680 --> 00:24.820
+You can either ask away on IRC or put them on the pad.
+
+00:24.820 --> 00:28.300
+And we'll also open up this PBB room in a little bit
+
+00:28.300 --> 00:31.960
+if you'd like to join here directly on asking questions.
+
+00:31.960 --> 00:34.520
+So, Ian, please take it away.
+
+00:34.520 --> 00:35.280
+Hey, thanks.
+
+00:35.280 --> 00:38.580
+Yeah, going to wait for some questions to come in.
+
+00:38.580 --> 00:41.320
+But there's a couple of points I wanted to make.
+
+00:41.320 --> 00:46.840
+So I'm going to share my screen here for a minute.
+
+00:46.840 --> 00:50.880
+If you're interested in exploring more about DBUS,
+
+00:50.880 --> 00:54.080
+there is a graphical client called dfeat.
+
+00:54.080 --> 00:56.200
+That's d-feat.
+
+00:56.200 --> 00:59.960
+I guess puns are strong when it comes to DBUS software.
+
+00:59.960 --> 01:03.400
+And this just gives you a graphical overview
+
+01:03.400 --> 01:06.160
+of what's going on with your bus.
+
+01:06.160 --> 01:09.920
+So in the case that I was looking at in Emacs,
+
+01:09.920 --> 01:11.600
+you can look.
+
+01:11.600 --> 01:13.280
+Here's the hostname1 service.
+
+01:13.280 --> 01:18.360
+And here's you can change the chassis of it or read.
+
+01:18.360 --> 01:20.240
+I'm on a desktop here.
+
+01:20.240 --> 01:23.940
+So I think this is a really great tool
+
+01:23.940 --> 01:30.720
+for just understanding what is available and what DBUS can do.
+
+01:30.720 --> 01:33.720
+I think I didn't do a great job of setting out a vision.
+
+01:33.720 --> 01:37.000
+So I want to try to reiterate that here.
+
+01:37.000 --> 01:41.320
+Ever since I started using X1 several years ago,
+
+01:41.320 --> 01:46.480
+and before that even, once I was learning about LISP machines,
+
+01:46.480 --> 01:48.920
+one of the things that I really want out of my computing
+
+01:48.920 --> 01:52.720
+experience is a full LISP environment,
+
+01:52.720 --> 01:54.400
+like a modern LISP machine.
+
+01:54.400 --> 01:59.440
+And I think Emacs and X1 are the closest thing to that
+
+01:59.440 --> 02:01.800
+that you can get on a modern machine.
+
+02:01.800 --> 02:03.760
+But if you're thinking about what
+
+02:03.760 --> 02:07.680
+are the gaps between that and a full blown desktop environment,
+
+02:07.680 --> 02:10.800
+there is many of them that make it inconvenient
+
+02:10.800 --> 02:12.760
+in a variety of different ways.
+
+02:12.760 --> 02:17.600
+And my vision is really to have an Emacs desktop environment.
+
+02:17.600 --> 02:21.080
+And I think DBUS is really key to making that work.
+
+02:21.080 --> 02:24.760
+And I would love, on the one to two year horizon,
+
+02:24.760 --> 02:29.080
+I would really like to see common system tasks be
+
+02:29.080 --> 02:32.680
+able to get done seamlessly from inside of Emacs.
+
+02:32.680 --> 02:34.640
+And what I mean by that is things
+
+02:34.640 --> 02:37.440
+like pairing with a Bluetooth device,
+
+02:37.440 --> 02:41.440
+connecting to a Wi-Fi network, rebooting your computer
+
+02:41.440 --> 02:44.440
+or putting it into suspend, or any of those things
+
+02:44.440 --> 02:47.800
+that you might think of doing in a full blown desktop
+
+02:47.800 --> 02:51.320
+environment, whether it's Mac OS, or Windows, or GNOME, or KDE,
+
+02:51.320 --> 02:53.920
+or whatever, you should be able to do all that from Emacs.
+
+02:53.920 --> 02:56.840
+You should be able to manage everything
+
+02:56.840 --> 02:59.200
+without having to leave that environment.
+
+02:59.200 --> 03:02.160
+Because I really prefer the Emacs environment.
+
+03:02.160 --> 03:05.520
+I would like to do all of that from inside Emacs.
+
+03:05.520 --> 03:07.380
+And when it comes to integrating with all
+
+03:07.380 --> 03:11.960
+those different things, DBUS is really key to making it work.
+
+03:11.960 --> 03:20.560
+But I do think that offering the ability of integrating Emacs
+
+03:20.560 --> 03:23.160
+into the desktop for people who don't
+
+03:23.160 --> 03:26.720
+want to go that route of having a full blown Emacs desktop
+
+03:26.720 --> 03:30.880
+environment, I think that's also a path to some really
+
+03:30.880 --> 03:35.200
+interesting feature opportunity that
+
+03:35.200 --> 03:39.760
+has been difficult to explore in Emacs in years past.
+
+03:39.760 --> 03:44.160
+So I really think it's just a great space to be exploring.
+
+03:44.160 --> 03:46.280
+And I'm really excited to see what kind of stuff
+
+03:46.280 --> 03:48.520
+I can build in there, and what things other people
+
+03:48.520 --> 03:49.600
+start building in there.
+
+03:53.400 --> 03:54.160
+Sounds great.
+
+03:54.160 --> 03:57.640
+Yeah, and I think DBUS is kind of, I guess,
+
+03:57.640 --> 04:00.680
+one of those essential key pieces of software
+
+04:00.680 --> 04:03.120
+on GNU Linux where, I mean, if it's working,
+
+04:03.120 --> 04:05.240
+and when it's working, it's pretty much,
+
+04:05.240 --> 04:06.800
+I mean, you don't even notice it.
+
+04:06.800 --> 04:07.760
+It's behind the scenes.
+
+04:07.760 --> 04:09.600
+Everything seems to be working hand in hand.
+
+04:09.600 --> 04:11.880
+So yeah, I remember, for example,
+
+04:11.880 --> 04:14.600
+when I first switched to using a custom window manager,
+
+04:14.600 --> 04:16.760
+you pretty much lose all of that sort
+
+04:16.760 --> 04:20.200
+of integration and togetherness right away
+
+04:20.200 --> 04:22.440
+if there is no DBUS.
+
+04:22.440 --> 04:24.560
+And yeah, a lot of beginners, like myself at the time
+
+04:24.560 --> 04:27.480
+at least, don't even know what they're missing out on.
+
+04:27.480 --> 04:33.200
+So kudos for taking this on and having this vision of essentially
+
+04:33.200 --> 04:35.840
+moving towards that direction of being able to use Emacs
+
+04:35.840 --> 04:38.840
+as a potentially fully featured desktop environment.
+
+04:38.840 --> 04:40.680
+I think that's awesome.
+
+04:40.680 --> 04:42.560
+Yeah, thank you.
+
+04:42.560 --> 04:44.880
+Looks like I have some questions in the pad,
+
+04:44.880 --> 04:47.160
+so I will cover some of those.
+
+04:47.160 --> 04:48.720
+No, it's not Web3.
+
+04:48.720 --> 04:49.320
+Not funny.
+
+04:52.440 --> 04:54.840
+I'm sorry, the question was, so is this a Web3 approach?
+
+04:54.840 --> 04:56.840
+No, it isn't.
+
+04:56.840 --> 04:58.160
+I have another question.
+
+04:58.160 --> 04:59.960
+This is such a great overview of DBUS.
+
+04:59.960 --> 05:01.800
+I haven't been paying attention to this space
+
+05:01.800 --> 05:05.120
+because it seems to be in flux 10 or 15 years ago.
+
+05:05.120 --> 05:07.040
+How long has DBUS been around, and what
+
+05:07.040 --> 05:09.160
+was in place before that?
+
+05:09.160 --> 05:11.960
+So I covered this real briefly in the beginning of the talk,
+
+05:11.960 --> 05:15.400
+but DBUS dates from 2002-ish.
+
+05:15.400 --> 05:21.760
+And I would say since 2010, 2012, that time frame,
+
+05:21.760 --> 05:26.080
+it has been pretty stable and has seen wide adoption
+
+05:26.080 --> 05:28.600
+in multiple desktop environments.
+
+05:28.600 --> 05:30.800
+Before DBUS, there wasn't anything like it.
+
+05:30.800 --> 05:33.120
+It didn't replace a similar feature.
+
+05:33.120 --> 05:35.320
+And if you wanted to do the sorts of things
+
+05:35.320 --> 05:40.160
+that DBUS does, you were pretty limited.
+
+05:40.160 --> 05:42.600
+Those of you who have been around for a while
+
+05:42.600 --> 05:45.600
+might remember that a lot of GUI software for Linux
+
+05:45.600 --> 05:49.840
+in the 90s was some variant of a shell,
+
+05:49.840 --> 05:53.720
+like a graphical shell program that just called out
+
+05:53.720 --> 05:57.160
+to an existing binary on the system.
+
+05:57.160 --> 05:59.200
+Like you might have a disk formatter,
+
+05:59.200 --> 06:01.320
+and it lets you has a dropdown for the file
+
+06:01.320 --> 06:03.400
+and lists your devices and whatever.
+
+06:03.400 --> 06:04.960
+But it was doing all the work.
+
+06:04.960 --> 06:06.200
+All it was was the interface.
+
+06:06.200 --> 06:09.480
+All the work was happening by delegating it to a program.
+
+06:09.480 --> 06:12.000
+And essentially, what that's doing
+
+06:12.000 --> 06:16.480
+is that's turning the text user interface, the command line
+
+06:16.480 --> 06:19.880
+user interface, into an API because you're using a program
+
+06:19.880 --> 06:22.680
+to talk to it, but it's not really meant for that.
+
+06:22.680 --> 06:27.400
+And there's a lot of details in that interface that
+
+06:27.400 --> 06:29.240
+are not stable.
+
+06:29.240 --> 06:33.480
+Like anyone who's used a Mac after using a Linux machine
+
+06:33.480 --> 06:37.240
+has probably been surprised that the find command didn't
+
+06:37.240 --> 06:38.960
+work how they expected.
+
+06:38.960 --> 06:40.480
+And there's a lot of that.
+
+06:40.480 --> 06:43.000
+In order to make that stuff really reliable,
+
+06:43.000 --> 06:47.600
+you end up having to build a lot of special cases into it,
+
+06:47.600 --> 06:49.680
+but you're doing it at the wrong layer.
+
+06:49.680 --> 06:51.440
+And what DBUS does is it really lets
+
+06:51.440 --> 06:55.320
+you have a separate architecture where the service is what
+
+06:55.320 --> 06:59.200
+encapsulates all of the differences between kernels,
+
+06:59.200 --> 07:02.280
+distributions, flavors of tooling,
+
+07:02.280 --> 07:05.440
+and just abstracts all of that and gives you a proper API
+
+07:05.440 --> 07:06.400
+that you can use.
+
+07:06.400 --> 07:07.860
+And I think that's great because that
+
+07:07.860 --> 07:12.600
+lets you build these high-level interactive components
+
+07:12.600 --> 07:15.320
+at an abstract level where you don't necessarily
+
+07:15.320 --> 07:17.280
+need to care about the implementation details.
+
+07:17.280 --> 07:19.480
+I think that's really great.
+
+07:19.480 --> 07:21.400
+So that's really what was happening there.
+
+07:21.400 --> 07:23.680
+And when it comes to two-way stuff,
+
+07:23.680 --> 07:26.480
+it was like a fancy version of Unix pipes.
+
+07:26.480 --> 07:29.760
+You would run your program, and maybe if you were lucky,
+
+07:29.760 --> 07:32.360
+it had some sort of machine-readable output
+
+07:32.360 --> 07:33.960
+switch you could turn on so that you
+
+07:33.960 --> 07:37.480
+could have a progress bar or something like that.
+
+07:37.480 --> 07:38.600
+That was the sort of thing.
+
+07:38.600 --> 07:40.720
+But there wasn't really anything exactly like DBUS.
+
+07:45.240 --> 07:46.480
+I have another question.
+
+07:46.480 --> 07:48.360
+Forgive me if this question is silly.
+
+07:48.360 --> 07:53.320
+Why is everything DBUS prefixed with org dot?
+
+07:53.320 --> 07:57.800
+Not everything is, but most things are.
+
+07:57.800 --> 08:00.800
+Those identifiers are reverse FQDN.
+
+08:00.800 --> 08:03.560
+So if you think about the Java namespaces,
+
+08:03.560 --> 08:05.960
+that's what they're ripping off there.
+
+08:05.960 --> 08:09.680
+And it's org because most of it is written by nonprofits.
+
+08:09.680 --> 08:12.320
+So in particular, Free Desktop is
+
+08:12.320 --> 08:15.040
+what it sponsors development of DBUS.
+
+08:15.040 --> 08:17.320
+And so there is an inordinate number
+
+08:17.320 --> 08:22.480
+of org dot Free Desktop dot whatever services on DBUS
+
+08:22.480 --> 08:28.480
+just because they build so many of them.
+
+08:28.480 --> 08:32.680
+In your investigations, do most OS desktop environment window
+
+08:32.680 --> 08:35.360
+manager interop well over DBUS?
+
+08:35.360 --> 08:38.160
+Which ones have proven more challenging, if any?
+
+08:40.960 --> 08:45.280
+I'm not sure I quite understand this question.
+
+08:45.280 --> 08:49.720
+DBUS is fairly abstract, and those graphical programs
+
+08:49.720 --> 08:53.360
+can choose to use it or not.
+
+08:53.360 --> 08:58.440
+But you're not interacting with the desktop environment
+
+08:58.440 --> 08:59.040
+too much.
+
+08:59.040 --> 09:01.200
+You're interacting with a service.
+
+09:01.200 --> 09:03.720
+So what you're doing is you're taking any program
+
+09:03.720 --> 09:06.520
+and you're breaking it into a client server model.
+
+09:06.520 --> 09:09.680
+The DBUS service does all of the work,
+
+09:09.680 --> 09:12.360
+and then there's a graphical environment on top of it.
+
+09:12.360 --> 09:14.640
+So they're communicating back and forth.
+
+09:14.640 --> 09:16.320
+And if you want to do those same things,
+
+09:16.320 --> 09:18.080
+you want to communicate with the service,
+
+09:18.080 --> 09:22.400
+you don't need to communicate with the actual GUI program
+
+09:22.400 --> 09:25.000
+unless you want to control the program.
+
+09:25.000 --> 09:27.240
+If you want to do the same thing the program is doing,
+
+09:27.240 --> 09:28.680
+you can use a DBUS service.
+
+09:28.680 --> 09:30.960
+I guess in the case of something like a word processor,
+
+09:30.960 --> 09:32.720
+you might want to have a DBUS API that
+
+09:32.720 --> 09:35.720
+lets you add a heading or something like that.
+
+09:35.720 --> 09:39.160
+That's not an area I've explored too much.
+
+09:39.160 --> 09:40.760
+So I'm not sure how that works.
+
+09:40.760 --> 09:42.760
+Work done.
+
+09:46.120 --> 09:49.080
+Regarding using XWIM as a desktop environment,
+
+09:49.080 --> 09:55.040
+does XWIM provide a session manager daemon?
+
+09:55.040 --> 09:57.200
+Whoever wrote that, if you could add some more context,
+
+09:57.200 --> 09:58.080
+I would appreciate it.
+
+09:58.080 --> 10:01.000
+I'm not sure I can answer that as it is written.
+
+10:04.120 --> 10:07.560
+No, I don't know.
+
+10:07.560 --> 10:08.720
+Next question.
+
+10:08.720 --> 10:11.600
+There is a lot of criticism against DBUS out there.
+
+10:11.600 --> 10:13.280
+Why do you think that might be?
+
+10:13.280 --> 10:15.200
+Well, it's because it's not very good.
+
+10:18.600 --> 10:21.960
+I mean, I love what it unlocks feature wise,
+
+10:21.960 --> 10:25.240
+but I do think it is not the best implementation
+
+10:25.240 --> 10:28.240
+for doing what it does.
+
+10:28.240 --> 10:31.640
+But when in Rome, you want to do those things,
+
+10:31.640 --> 10:32.760
+I want to do those things, I don't
+
+10:32.760 --> 10:34.480
+want to rewrite everything in the way
+
+10:34.480 --> 10:36.960
+I think it should have been to get it done because I'll never
+
+10:36.960 --> 10:37.760
+get it done.
+
+10:37.760 --> 10:39.880
+The whole point is you just shove it in a corner,
+
+10:39.880 --> 10:41.600
+you don't have to care about it, and you
+
+10:41.600 --> 10:43.440
+use high level bindings.
+
+10:43.440 --> 10:46.040
+I would say the specific criticisms I've seen
+
+10:46.040 --> 10:54.720
+are using XML is something that is not popular these days.
+
+10:54.720 --> 10:58.260
+And if I had to criticize a thing about it,
+
+10:58.260 --> 11:02.240
+I would say it doesn't have strong guidelines
+
+11:02.240 --> 11:03.680
+for how to make a good API.
+
+11:03.680 --> 11:06.120
+And so the quality of one service to another
+
+11:06.120 --> 11:09.120
+can be extremely variable.
+
+11:09.120 --> 11:12.360
+And different services have different ways
+
+11:12.360 --> 11:14.440
+of doing very similar tasks.
+
+11:14.440 --> 11:16.960
+So I would love to see, if anything, a little more
+
+11:16.960 --> 11:19.960
+uniformity in those APIs.
+
+11:19.960 --> 11:22.840
+I generally could care less that it's sending XML around
+
+11:22.840 --> 11:23.760
+or whatever.
+
+11:23.760 --> 11:30.920
+I think people who are offended that XML is being used
+
+11:30.920 --> 11:37.560
+don't have their hearts in the right place, basically.
+
+11:37.560 --> 11:45.320
+Which system services come to mind
+
+11:45.320 --> 11:47.000
+when thinking about applications,
+
+11:47.000 --> 11:49.760
+be it at the OS desktop environment, window manager
+
+11:49.760 --> 11:50.440
+level?
+
+11:50.440 --> 11:53.520
+So the stuff that I am interested in using this for
+
+11:53.520 --> 11:56.600
+is, like I was saying, connecting to wireless networks,
+
+11:56.600 --> 11:59.360
+pairing with Bluetooth devices, that kind of stuff.
+
+11:59.360 --> 12:04.520
+Things that don't have a streamlined way of accomplishing
+
+12:04.520 --> 12:07.960
+it without using D-Bus and some graphical client.
+
+12:07.960 --> 12:09.360
+And I would just like to not have
+
+12:09.360 --> 12:11.360
+to deal with the client end of it.
+
+12:11.360 --> 12:14.160
+I would like the UI to be in Emacs.
+
+12:19.720 --> 12:21.160
+When it comes to managing devices,
+
+12:21.160 --> 12:23.760
+how are D-Bus and U-Dev related?
+
+12:23.760 --> 12:25.760
+U-Dev is a D-Bus service.
+
+12:25.760 --> 12:30.520
+So it is a daemon that is running at some point
+
+12:30.520 --> 12:31.760
+in the background.
+
+12:31.760 --> 12:33.520
+If it's not running, D-Bus will start it
+
+12:33.520 --> 12:35.040
+when you send it a message.
+
+12:35.040 --> 12:42.120
+And I'm sorry, I'm mistaking U-Dev for U-Disks.
+
+12:42.120 --> 12:46.640
+U-Dev is unrelated to D-Bus.
+
+12:46.640 --> 12:53.400
+U-Dev is a way of dynamically populating your devices
+
+12:53.400 --> 12:56.520
+and having triggers that run when they are plugged in
+
+12:56.520 --> 12:57.600
+or unplugged.
+
+12:57.600 --> 12:59.840
+They're orthogonal.
+
+12:59.840 --> 13:02.120
+D-Bus and U-Dev don't interact.
+
+13:02.120 --> 13:08.520
+But D-Bus, I suspect some of the D-Bus services, like U-Disks,
+
+13:08.520 --> 13:11.720
+too, probably need to talk to U-Dev in order
+
+13:11.720 --> 13:13.080
+to do their job.
+
+13:13.080 --> 13:16.200
+But this is a service by service thing,
+
+13:16.200 --> 13:27.400
+rather than D-Bus is integrated with U-Dev sort of thing.
+
+13:27.400 --> 13:29.320
+Skip one of these.
+
+13:29.320 --> 13:32.200
+If you want to do the kinds of things that D-Bus does,
+
+13:32.200 --> 13:33.280
+you're limited.
+
+13:33.280 --> 13:35.880
+What is something D-Bus does that you couldn't do before?
+
+13:35.880 --> 13:37.520
+What is a really cool use of D-Bus
+
+13:37.520 --> 13:39.880
+in a modern desktop environment?
+
+13:39.880 --> 13:43.680
+So again, I think that the hardware and dynamic refresh
+
+13:43.680 --> 13:47.520
+is the use case that I keep coming back to.
+
+13:47.520 --> 13:50.760
+You walk somewhere where there's a new Wi-Fi network
+
+13:50.760 --> 13:52.960
+or there's an open Wi-Fi network to connect to,
+
+13:52.960 --> 13:55.240
+and maybe you get a notification somewhere.
+
+13:55.240 --> 13:57.360
+You plug in some hardware and it shows up
+
+13:57.360 --> 13:59.880
+in some list or some user interface
+
+13:59.880 --> 14:01.880
+to make it easy to use.
+
+14:01.880 --> 14:03.600
+You unplug it, it goes away.
+
+14:03.600 --> 14:05.960
+Those are the things that I think are really interesting
+
+14:05.960 --> 14:10.600
+because when you use a full blown desktop environment,
+
+14:10.600 --> 14:14.240
+you have come to expect that kind of interactivity
+
+14:14.240 --> 14:17.760
+and that kind of integration from the low level
+
+14:17.760 --> 14:21.760
+of the hardware up to whatever graphical layer you're using.
+
+14:21.760 --> 14:26.440
+And Emacs doesn't have that, and I want it to have that.
+
+14:26.440 --> 14:32.000
+So I think that's the thing that D-Bus really gives me.
+
+14:32.000 --> 14:34.240
+I would say in particular, you plug in hardware
+
+14:34.240 --> 14:37.240
+and it shows up in a list, that's pretty damn cool.
+
+14:37.240 --> 14:40.640
+That's a thing that I don't remember seeing done
+
+14:40.640 --> 14:43.400
+without D-Bus, or the way it was done
+
+14:43.400 --> 14:47.240
+was not portable and very complicated.
+
+14:47.240 --> 14:50.320
+D-Bus allows you to build those types of interfaces
+
+14:50.320 --> 14:53.280
+with a lot less work, and I think that's pretty great.
+
+14:58.640 --> 14:59.680
+Let's see.
+
+14:59.680 --> 15:02.040
+As an average GNU slash Linux user,
+
+15:02.040 --> 15:05.320
+I've used signals and methods before but not properties.
+
+15:05.320 --> 15:07.600
+You gave an example involving properties,
+
+15:07.600 --> 15:08.880
+but it kind of flew by.
+
+15:08.880 --> 15:11.640
+Can you explain briefly what clients and services
+
+15:11.640 --> 15:13.960
+can do with properties?
+
+15:13.960 --> 15:20.880
+Sure, so let me share this screen real quick.
+
+15:20.880 --> 15:26.000
+So just looking at hostname1 because this
+
+15:26.000 --> 15:28.480
+is a pretty simple and straightforward.
+
+15:28.480 --> 15:32.920
+Actually, let me look at U disks.
+
+15:32.920 --> 15:36.720
+So here's a whole mess of disks that are connected,
+
+15:36.720 --> 15:39.360
+and you can see here's a block device
+
+15:39.360 --> 15:41.960
+and it has all of these different properties to it.
+
+15:41.960 --> 15:46.600
+So hit system will say, is this a system device?
+
+15:46.600 --> 15:48.680
+Is this a fixed device, something
+
+15:48.680 --> 15:50.400
+that the system is in control of mounting,
+
+15:50.400 --> 15:53.000
+or is this something that a user might want to interact with?
+
+15:53.000 --> 15:55.160
+That property is how you're going to know
+
+15:55.160 --> 15:56.600
+which one of those things are, and I
+
+15:56.600 --> 15:58.880
+think that's really important when you're building a UI.
+
+15:58.880 --> 16:00.480
+Maybe you want to hide the system disks
+
+16:00.480 --> 16:04.280
+because you can see them, but there's not much you can do.
+
+16:04.280 --> 16:07.440
+I can't unmount my root device without turning the computer
+
+16:07.440 --> 16:07.960
+off.
+
+16:07.960 --> 16:11.760
+So the things you might want to do
+
+16:11.760 --> 16:15.800
+at a graphical interactive level are pretty limited,
+
+16:15.800 --> 16:19.440
+and that property lets you figure that out.
+
+16:19.440 --> 16:22.400
+Here's a crypto vacuum device that read only
+
+16:22.400 --> 16:24.240
+what drives it's associated with.
+
+16:24.240 --> 16:28.280
+They really bundle up just a lot of metadata about the thing,
+
+16:28.280 --> 16:31.400
+and they have a lot of links in between the different objects.
+
+16:31.400 --> 16:36.480
+So looking at one thing, you can connect it up
+
+16:36.480 --> 16:39.560
+to other parts of it at different levels.
+
+16:39.560 --> 16:43.440
+There's the notion of a drive, which contains a block device,
+
+16:43.440 --> 16:45.560
+which can have some partition tables, which
+
+16:45.560 --> 16:49.200
+can have file systems, or maybe an encryption container that
+
+16:49.200 --> 16:50.800
+has more of those things.
+
+16:50.800 --> 16:57.160
+So it's really a tree, but it's a strangely modeled tree
+
+16:57.160 --> 17:00.880
+where you have to walk the different leaves.
+
+17:00.880 --> 17:03.200
+It's not a single tree that encapsulates everything.
+
+17:03.200 --> 17:07.360
+It is a tree of links into other bits of the tree,
+
+17:07.360 --> 17:07.960
+essentially.
+
+17:07.960 --> 17:11.920
+So they're important to use for that sort of thing.
+
+17:16.320 --> 17:17.680
+The other thing that properties do
+
+17:17.680 --> 17:24.440
+is the signals let you know when a property has been updated.
+
+17:24.440 --> 17:28.640
+So if your hostname changes, you can
+
+17:28.640 --> 17:30.600
+get a signal that says, hey, my hostname changed,
+
+17:30.600 --> 17:32.840
+and maybe give a notice.
+
+17:32.840 --> 17:35.440
+Or if your active network connection changes
+
+17:35.440 --> 17:39.320
+or disconnects, a signal is going to be what tells you that,
+
+17:39.320 --> 17:43.200
+and the change in property is what will drive the signal.
+
+17:43.200 --> 17:44.840
+So it's kind of related to that.
+
+17:49.920 --> 17:53.120
+Naive question, me not knowing much about D-Bus.
+
+17:53.120 --> 17:56.400
+Is there such a thing as a D-Bus reflection browser,
+
+17:56.400 --> 17:58.280
+maybe Emacs-based, that lets you discover
+
+17:58.280 --> 18:02.160
+all the behavior different D-Bus app participants provide?
+
+18:02.160 --> 18:04.160
+And actually, wait, I think you're showing it.
+
+18:04.160 --> 18:06.320
+Defeat is that.
+
+18:06.320 --> 18:11.440
+Definitely a to-do item is to build an Emacs Lisp interface
+
+18:11.440 --> 18:16.520
+that is akin to Defeat, but I have not done that.
+
+18:16.520 --> 18:17.760
+So pull requests, welcome.
+
+18:17.760 --> 18:25.920
+Next question, D-Bus seems great for extensibility,
+
+18:25.920 --> 18:28.240
+but then Emacs has no such mechanism
+
+18:28.240 --> 18:30.680
+and is fantastically more extensible.
+
+18:30.680 --> 18:31.960
+Why do you think this is so?
+
+18:34.680 --> 18:37.840
+I don't think I agree with the premise.
+
+18:37.840 --> 18:42.400
+D-Bus is not really that extensible in the way
+
+18:42.400 --> 18:46.560
+that you might think in the same context as Emacs.
+
+18:46.560 --> 18:49.360
+You can add new functionality by adding a new service,
+
+18:49.360 --> 18:51.080
+but you can't add new functionality
+
+18:51.080 --> 18:54.000
+to an existing service without changing it.
+
+18:54.000 --> 18:57.120
+So I'm not sure I would say that's
+
+18:57.120 --> 19:01.080
+extensible in the same way, whereas Emacs is very malleable
+
+19:01.080 --> 19:06.120
+and you can change how it works even while it's running.
+
+19:06.120 --> 19:12.120
+So I think it's a different kind of extensibility, really.
+
+19:12.120 --> 19:15.840
+And Emacs can participate on D-Bus,
+
+19:15.840 --> 19:21.080
+so Emacs has a superset of what D-Bus can do, really.
+
+19:25.200 --> 19:27.120
+Do you have any other cool D-Bus ideas?
+
+19:27.120 --> 19:29.480
+I think I have dropped them all.
+
+19:29.480 --> 19:32.600
+Definitely remote org capture is a thing
+
+19:32.600 --> 19:34.840
+that I have wanted a couple of times
+
+19:34.840 --> 19:38.160
+because if I'm browsing around somewhere,
+
+19:38.160 --> 19:40.520
+I'd really love to have a simple flow that
+
+19:40.520 --> 19:44.720
+allows me to turn a web page into an org capture.
+
+19:44.720 --> 19:47.640
+And I think D-Bus could be a good way of accomplishing that,
+
+19:47.640 --> 19:49.920
+although I haven't messed with the browser integration
+
+19:49.920 --> 19:50.400
+end of it.
+
+19:54.640 --> 19:57.920
+Are there buses besides system and session?
+
+19:57.920 --> 19:59.920
+Is there anything more to a bus besides a way
+
+19:59.920 --> 20:03.920
+to group objects?
+
+20:03.920 --> 20:09.920
+There are always at least a system bus and a session bus.
+
+20:09.920 --> 20:12.760
+And actually, that's maybe not completely true.
+
+20:12.760 --> 20:15.640
+There's always at least a system bus, session bus
+
+20:15.640 --> 20:19.800
+as long as there is at least one logged in session.
+
+20:19.800 --> 20:22.720
+And there's really more than one session bus.
+
+20:22.720 --> 20:26.800
+There's one bus per session so that you're not leaking stuff
+
+20:26.800 --> 20:28.880
+across sessions on the same computer
+
+20:28.880 --> 20:32.960
+because despite this being 2022, Unix
+
+20:32.960 --> 20:34.840
+is still a multi-user operating system
+
+20:34.840 --> 20:38.280
+and you have to think about that stuff.
+
+20:38.280 --> 20:43.640
+There are an unlimited number of D-Bus buses.
+
+20:43.640 --> 20:47.040
+You can create ones that have limited sets of services.
+
+20:47.040 --> 20:51.760
+You can connect to ones over a TCP socket.
+
+20:51.760 --> 20:55.320
+There are always generally at least system and session.
+
+20:55.320 --> 20:58.360
+There can additionally be other ones.
+
+20:58.360 --> 21:02.800
+But it is uncommon to have any other bus.
+
+21:02.800 --> 21:06.080
+Generally, well-behaved D-Bus services
+
+21:06.080 --> 21:10.000
+will attach to one or the other of those two buses.
+
+21:10.000 --> 21:13.760
+And in fact, PulseAudio is, it has D-Bus support
+
+21:13.760 --> 21:16.440
+but it is not a good D-Bus citizen
+
+21:16.440 --> 21:18.960
+because it does not use the session bus.
+
+21:18.960 --> 21:22.000
+It has, it's very weird actually.
+
+21:22.000 --> 21:25.240
+It has a D-Bus plug-in that hooks into the session bus
+
+21:25.240 --> 21:28.640
+but all it has is a method that returns the path to the Unix
+
+21:28.640 --> 21:31.560
+socket of the real D-Bus which you then
+
+21:31.560 --> 21:34.640
+have to connect to separately which strikes me
+
+21:34.640 --> 21:37.840
+as not the best way of doing that.
+
+21:41.800 --> 21:43.680
+Cool.
+
+21:43.680 --> 21:46.840
+All right, I think that is all of the questions.
+
+21:50.000 --> 21:52.520
+Cool, I think we still have about like six and a half
+
+21:52.520 --> 21:55.160
+or seven more minutes of Q&A on the stream.
+
+21:55.160 --> 21:57.920
+So if there are any more questions, folks,
+
+21:57.920 --> 21:59.480
+please feel free to post them on the pad
+
+21:59.480 --> 22:03.120
+or come up here, join us on BBB.
+
+22:03.120 --> 22:06.240
+Yeah, we can hang out here for a little bit longer.
+
+22:06.240 --> 22:07.960
+The stream will move on at some point
+
+22:07.960 --> 22:10.960
+but Ian, of course, and anyone else who is interested
+
+22:10.960 --> 22:14.280
+is welcome to hang out if Ian is around.
+
+22:14.280 --> 22:15.560
+Yeah.
+
+22:15.560 --> 22:16.960
+I will be around for a bit.
+
+22:16.960 --> 22:20.280
+I am on IRC all the time but I'm not always
+
+22:20.280 --> 22:21.280
+paying attention to it.
+
+22:21.280 --> 22:23.080
+You're welcome to reach out to me there.
+
+22:26.680 --> 22:32.160
+This is with almost all of my Emacs packages and stuff.
+
+22:32.160 --> 22:36.400
+This is in my Emacs Weirdware project on Codeburg.
+
+22:36.400 --> 22:40.360
+So codeburg.org slash Emacs dash weirdware
+
+22:40.360 --> 22:45.200
+has everything that I demoed and some other wonderful goodies
+
+22:45.200 --> 22:49.040
+that maybe you already know about and maybe you don't.
+
+22:49.040 --> 22:52.280
+I saw one other question from the chat, which
+
+22:52.280 --> 22:56.720
+is what do you use this for?
+
+22:56.720 --> 23:01.760
+Well, I mean, the main thing I use it for
+
+23:01.760 --> 23:07.600
+is discomfort for managing external devices.
+
+23:07.600 --> 23:13.040
+But this has been a really great research project
+
+23:13.040 --> 23:20.000
+just to understand D-Bus better, see what it can offer,
+
+23:20.000 --> 23:26.240
+and write some interesting code because what I really like
+
+23:26.240 --> 23:31.480
+is writing code that unlocks new possibilities
+
+23:31.480 --> 23:33.680
+to where people can look at it and say,
+
+23:33.680 --> 23:35.200
+oh, that gives me a great idea.
+
+23:35.200 --> 23:36.680
+I want to do this with it.
+
+23:36.680 --> 23:41.560
+And I see D-Base and this talk as really just pushing
+
+23:41.560 --> 23:43.360
+mindshare on this stuff.
+
+23:43.360 --> 23:47.160
+And really, the best result of this talk
+
+23:47.160 --> 23:50.960
+is for people to come out of it and say, wow, that was awesome.
+
+23:50.960 --> 23:55.120
+I can't wait to build something with it and go build new stuff.
+
+23:55.120 --> 23:57.120
+And just kind of building those platforms
+
+23:57.120 --> 24:00.600
+that other people can use and find helpful
+
+24:00.600 --> 24:03.120
+in whatever their programming journey is.
+
+24:03.120 --> 24:05.040
+That's the thing that I really like.
+
+24:05.040 --> 24:06.040
+That means a lot to me.
+
+24:06.040 --> 24:09.000
+So I hope that someone watches this
+
+24:09.000 --> 24:32.360
+and comes away with a good idea and goes and hacks on it.
+
+24:32.360 --> 24:34.360
+Looks like there's one more question.
+
+24:34.360 --> 24:38.520
+I'm not sure if we have time.
+
+24:38.520 --> 24:44.160
+I'll follow up in the pad if we end up over time on that.
+
+24:44.160 --> 24:45.840
+Yeah, we still have a couple more minutes,
+
+24:45.840 --> 25:12.480
+so it should be good.
+
+25:12.480 --> 25:15.040
+OK, so the last question is, it looks
+
+25:15.040 --> 25:19.400
+like D-Bus is mostly useful for Emacs to do IPC.
+
+25:19.400 --> 25:20.880
+If I understand correctly, this is
+
+25:20.880 --> 25:24.440
+how SIGTEX works when working with LaTeX docs.
+
+25:24.440 --> 25:26.960
+How does it compare with other ways of doing IPC,
+
+25:26.960 --> 25:29.360
+for example, communicating over a socket with MPD?
+
+25:32.960 --> 25:36.000
+So the main way that it's different
+
+25:36.000 --> 25:40.320
+is that MPD has its own protocol that you
+
+25:40.320 --> 25:46.280
+have to build support for in whatever your client is.
+
+25:46.280 --> 25:49.800
+D-Bus gives you a single, uniform way
+
+25:49.800 --> 25:52.520
+of talking to any service.
+
+25:52.520 --> 25:55.720
+So instead of having to reinvent that socket code
+
+25:55.720 --> 25:59.080
+and write the protocol support for MPD or whatever else,
+
+25:59.080 --> 26:02.280
+where you're taking the concrete, what
+
+26:02.280 --> 26:04.280
+are the bytes over the wire, and building
+
+26:04.280 --> 26:07.840
+an abstract programming interface that wraps that
+
+26:07.840 --> 26:12.360
+and drives those things, D-Bus already provides all of that.
+
+26:12.360 --> 26:15.240
+So you can say, here's a description of everything
+
+26:15.240 --> 26:18.760
+that I already do, and you can code gen stuff
+
+26:18.760 --> 26:20.800
+to do all of it.
+
+26:20.800 --> 26:24.840
+So I think that's the main difference between them.
+
+26:24.840 --> 26:26.840
+But it is over a socket.
+
+26:26.840 --> 26:31.040
+It's over a Unix socket for local stuff, TCP for remote.
+
+26:31.040 --> 26:33.000
+It is very similar.
+
+26:33.000 --> 26:34.480
+The main difference is that it is
+
+26:34.480 --> 26:37.080
+a framework for multiple applications
+
+26:37.080 --> 26:39.960
+rather than an application-specific mechanism,
+
+26:39.960 --> 26:42.200
+which makes it very easy to reuse
+
+26:42.200 --> 26:43.880
+in a variety of different contexts.
+
+26:43.880 --> 26:46.520
+And I think that's been key to its popularity
+
+26:46.520 --> 26:49.240
+over the last 10 years or so is the fact
+
+26:49.240 --> 26:52.880
+that it provides just enough opinion about how stuff should
+
+26:52.880 --> 26:56.400
+work that you don't have to think too hard about what
+
+26:56.400 --> 26:57.600
+should the protocol be.
+
+26:57.600 --> 26:58.640
+Should it be binary?
+
+26:58.640 --> 26:59.560
+Should it be text?
+
+26:59.560 --> 27:01.520
+Should it be S expressions?
+
+27:01.520 --> 27:02.640
+Should it be JSON?
+
+27:02.640 --> 27:05.080
+It's already done for you, and you can just think about,
+
+27:05.080 --> 27:06.880
+how do I connect it up?
+
+27:06.880 --> 27:08.840
+And I think that provides a lot of value.
+
+27:12.280 --> 27:14.440
+Yeah, and I can second that.
+
+27:14.440 --> 27:16.520
+It's been adopted by all sorts of different software
+
+27:16.520 --> 27:19.040
+projects, one of which I worked on.
+
+27:19.040 --> 27:21.560
+Jammy, people might know, GNU package
+
+27:21.560 --> 27:23.760
+for basically universal communication.
+
+27:23.760 --> 27:27.280
+It's basically a text messaging and also audio video calling
+
+27:27.280 --> 27:28.680
+and conferencing application.
+
+27:28.680 --> 27:31.400
+And it's Daemon, which runs in the background.
+
+27:31.400 --> 27:34.800
+It also supports D-Bus, so you can do all sorts of things,
+
+27:34.800 --> 27:38.280
+write little Python scripts or whatever,
+
+27:38.280 --> 27:40.480
+talk with it through D-Bus, give it commands
+
+27:40.480 --> 27:43.560
+to take calls from a particular point
+
+27:43.560 --> 27:46.920
+or just hang up calls or just do all sorts of things
+
+27:46.920 --> 27:48.080
+over D-Bus.
+
+27:48.080 --> 27:51.640
+And it is all, like you said, sort of application agnostic.
+
+27:51.640 --> 27:53.920
+It's not specific to, oh, how would I
+
+27:53.920 --> 27:58.520
+do this in a different way for each individual application?
+
+27:58.520 --> 27:59.200
+Yeah, exactly.
+
+27:59.200 --> 28:02.080
+It's the de facto way of doing that sort of stuff
+
+28:02.080 --> 28:04.680
+on Linux machines these days.
+
+28:04.680 --> 28:09.920
+And you can look back to some of the other message passing
+
+28:09.920 --> 28:13.920
+stuff in Windows and see it's drawn some inspiration
+
+28:13.920 --> 28:18.480
+from a variety of different places and different ways
+
+28:18.480 --> 28:21.560
+of doing that kind of interactivity.
+
+28:21.560 --> 28:24.080
+But it is, I mean, I don't think there was ever
+
+28:24.080 --> 28:26.240
+really a serious competitor to it,
+
+28:26.240 --> 28:28.080
+but it is the de facto standard if you
+
+28:28.080 --> 28:31.960
+want to do any kind of graphical program that
+
+28:31.960 --> 28:36.960
+manipulates your system or a batch program that
+
+28:36.960 --> 28:41.120
+drives an otherwise purely interactive graphical program.
+
+28:41.120 --> 28:42.720
+That's the tool.
+
+28:42.720 --> 28:47.880
+And there is not really any competitive landscape or reason
+
+28:47.880 --> 28:50.720
+to go reinventing it at this time.
+
+28:50.720 --> 28:51.480
+Sounds good.
+
+28:51.480 --> 28:52.760
+And I think that's all the time that we
+
+28:52.760 --> 28:53.720
+have on the live stream.
+
+28:53.720 --> 28:55.840
+Folks, you are welcome to stick around on IRC
+
+28:55.840 --> 28:58.160
+or come here on BBB and continue talking to Ian.
+
+28:58.160 --> 28:59.560
+Thank you, Ian.
+
+28:59.560 --> 29:00.080
+Wonderful.
+
+29:00.080 --> 29:01.240
+Thank you so much.
+
+29:01.240 --> 29:02.240
+Cheers.
+
+29:11.560 --> 29:12.040
+All right.
+
+29:12.040 --> 29:13.880
+I think the stream has moved on.
+
+29:13.880 --> 29:15.960
+Yeah, you're welcome to stay here, Ian, if you like,
+
+29:15.960 --> 29:18.080
+or just continue catching up with folks in IRC.
+
+29:20.840 --> 29:21.320
+Great.
+
+29:21.320 --> 29:22.960
+I will hang out here for a little bit
+
+29:22.960 --> 29:28.360
+in case someone wants to jump in and just write
+
+29:28.360 --> 29:30.560
+some stuff in the pad.
+
+29:30.560 --> 29:31.360
+Sounds good.
+
+29:31.360 --> 29:31.880
+Thank you.
+
+29:31.880 --> 29:34.680
+And I do see people are still writing or posting on the pad,
+
+29:34.680 --> 29:35.600
+so that's awesome.
+
+29:35.600 --> 29:36.720
+Yeah, sure thing.
+
+29:36.720 --> 29:37.240
+Awesome.
+
+29:37.240 --> 29:38.120
+Thank you so much.
+
+29:38.120 --> 29:38.600
+All right.
+
+29:38.600 --> 29:38.960
+Cheers.
+
+29:38.960 --> 29:39.480
+Welcome.
+
+29:39.480 --> 29:41.480
+And yeah, see you around on IRC.
+
+29:41.480 --> 29:42.880
+All right.
+
+29:42.880 --> 30:11.440
+All right.
+
diff --git a/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main--chapters.vtt b/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main--chapters.vtt
new file mode 100644
index 00000000..cc47a738
--- /dev/null
+++ b/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main--chapters.vtt
@@ -0,0 +1,55 @@
+WEBVTT
+
+00:00:00.000 --> 00:01:07.879
+What is D-Bus?
+
+00:01:07.880 --> 00:01:45.359
+Why D-Bus?
+
+00:01:45.360 --> 00:02:55.359
+The D-Bus Model
+
+00:02:55.360 --> 00:03:19.999
+Well-known Busses
+
+00:03:20.000 --> 00:04:06.239
+Common interfaces
+
+00:04:06.240 --> 00:05:09.319
+Emacs Native D-Bus
+
+00:05:09.320 --> 00:05:23.879
+Debase
+
+00:05:23.880 --> 00:06:13.439
+Debase: Objects
+
+00:06:13.440 --> 00:06:51.079
+Debase: Retarget objects
+
+00:06:51.080 --> 00:07:12.479
+Debase: Object binding
+
+00:07:12.480 --> 00:07:29.399
+Debase: Raw binding
+
+00:07:29.400 --> 00:08:14.199
+Debase: Codegen
+
+00:08:14.200 --> 00:09:08.679
+Debase: Codegen example
+
+00:09:08.680 --> 00:09:44.479
+Debase: ObjectManager
+
+00:09:44.480 --> 00:11:01.479
+Demo: Discomfort
+
+00:11:01.480 --> 00:13:16.279
+Demo: Remote eval
+
+00:13:16.280 --> 00:14:11.879
+Demo: Remote Org capture
+
+00:14:11.880 --> 00:15:07.320
+Future directions
diff --git a/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.vtt b/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.vtt
new file mode 100644
index 00000000..c824d2db
--- /dev/null
+++ b/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.vtt
@@ -0,0 +1,1126 @@
+WEBVTT captioned by sachac
+
+NOTE What is D-Bus?
+
+00:00:00.000 --> 00:00:04.879
+Welcome to my EmacsConf 2022 talk, The Wheels on D-Bus.
+
+00:00:04.880 --> 00:00:07.439
+In this talk, we'll cover what D-Bus is,
+
+00:00:07.440 --> 00:00:10.759
+why you might want to use it, and how to use it with Emacs.
+
+00:00:10.760 --> 00:00:13.679
+D-Bus is fundamentally based on passing messages
+
+00:00:13.680 --> 00:00:16.999
+in between processes, using the bus as a mediator.
+
+00:00:17.000 --> 00:00:20.599
+On top of this is built an RPC system with method invocation
+
+00:00:20.600 --> 00:00:22.799
+that has argument lists and return values,
+
+00:00:22.800 --> 00:00:25.479
+like you might find in any programming language.
+
+00:00:25.480 --> 00:00:27.839
+These are commonly used for verb-type actions
+
+00:00:27.840 --> 00:00:29.999
+like "restart my computer."
+
+00:00:30.000 --> 00:00:32.639
+You can also associate a collection of attributes
+
+00:00:32.640 --> 00:00:35.839
+with objects on the bus, and these are called properties.
+
+00:00:35.840 --> 00:00:39.839
+The properties can be read-only, write-only, or read-write.
+
+00:00:39.840 --> 00:00:43.159
+Signals are a way of notifying participants on the bus
+
+00:00:43.160 --> 00:00:45.999
+of updated state, and are the basis
+
+00:00:46.000 --> 00:00:47.799
+for building dynamic user interfaces
+
+00:00:47.800 --> 00:00:50.479
+that react to changes in the system.
+
+00:00:50.480 --> 00:00:52.759
+It has a static and strong type system,
+
+00:00:52.760 --> 00:00:55.359
+so if you send a message with the wrong type signature,
+
+00:00:55.360 --> 00:00:57.839
+it simply gets rejected instead of going through
+
+00:00:57.840 --> 00:00:59.599
+to the remote service.
+
+00:00:59.600 --> 00:01:02.319
+It also manages service life cycles,
+
+00:01:02.320 --> 00:01:04.399
+so you're not running services at all times.
+
+00:01:04.400 --> 00:01:07.879
+They can be started and stopped by D-Bus on demand.
+
+NOTE Why D-Bus?
+
+00:01:07.880 --> 00:01:10.519
+D-Bus has two major use cases.
+
+00:01:10.520 --> 00:01:13.359
+The first is acting as a lower-level substrate
+
+00:01:13.360 --> 00:01:14.679
+for higher-level programs,
+
+00:01:14.680 --> 00:01:16.919
+like a graphical desktop environment.
+
+00:01:16.920 --> 00:01:19.599
+For example, if you want to manage your network connectivity
+
+00:01:19.600 --> 00:01:21.239
+from your graphical environment,
+
+00:01:21.240 --> 00:01:23.919
+instead of having to build all of that from the ground up,
+
+00:01:23.920 --> 00:01:26.239
+you can rely on the D-Bus service to do that
+
+00:01:26.240 --> 00:01:28.679
+and only build the graphical component of it.
+
+00:01:28.680 --> 00:01:31.319
+This gives you consistency between desktop environments
+
+00:01:31.320 --> 00:01:33.799
+and reduces code duplication.
+
+00:01:33.800 --> 00:01:37.319
+Another application is automating desktop programs.
+
+00:01:37.320 --> 00:01:39.279
+If your program offers a D-Bus service,
+
+00:01:39.280 --> 00:01:40.959
+then it can be remote-controlled,
+
+00:01:40.960 --> 00:01:42.759
+and if all of your programs offer D-Bus,
+
+00:01:42.760 --> 00:01:45.359
+you can control your entire desktop.
+
+NOTE The D-Bus Model
+
+00:01:45.360 --> 00:01:48.559
+Let's look at the abstractions that D-Bus provides.
+
+00:01:48.560 --> 00:01:51.239
+The top level object is called a bus,
+
+00:01:51.240 --> 00:01:52.359
+and it's like a partition
+
+00:01:52.360 --> 00:01:54.919
+that messages get exchanged inside of.
+
+00:01:54.920 --> 00:01:57.279
+Messages don't cross buses.
+
+00:01:57.280 --> 00:01:59.559
+Inside of a bus are services.
+
+00:01:59.560 --> 00:02:03.159
+Services are normally identified in reverse FQDN order,
+
+00:02:03.160 --> 00:02:06.159
+so org.foobar.FooService.
+
+00:02:06.160 --> 00:02:08.599
+Each service provides some set of features
+
+00:02:08.600 --> 00:02:11.759
+related to a particular area of functionality.
+
+00:02:11.760 --> 00:02:14.439
+Inside of each service are objects.
+
+00:02:14.440 --> 00:02:16.599
+Objects use a path notation,
+
+00:02:16.600 --> 00:02:19.759
+and usually follow the same reverse FQDN format
+
+00:02:19.760 --> 00:02:21.959
+as the service identifier.
+
+00:02:21.960 --> 00:02:24.879
+Each object has one or more interfaces.
+
+00:02:24.880 --> 00:02:27.279
+An interface is like a facet that you can use
+
+00:02:27.280 --> 00:02:29.479
+to interact with an object,
+
+00:02:29.480 --> 00:02:32.239
+and inside of the interface are properties, methods,
+
+00:02:32.240 --> 00:02:33.999
+and signals, which we covered before.
+
+00:02:34.000 --> 00:02:37.039
+Properties are attributes that can be read or written.
+
+00:02:37.040 --> 00:02:40.239
+Methods are verbs that you can call to invoke an action,
+
+00:02:40.240 --> 00:02:43.319
+and a signal is something that's used to move state
+
+00:02:43.320 --> 00:02:47.239
+in between a service and another participant on the bus.
+
+00:02:47.240 --> 00:02:49.599
+There can be any number of interfaces on an object,
+
+00:02:49.600 --> 00:02:51.479
+any number of objects in a service,
+
+00:02:51.480 --> 00:02:53.439
+and any number of services on a bus,
+
+00:02:53.440 --> 00:02:55.359
+and any number of buses on a system.
+
+NOTE Well-known Busses
+
+00:02:55.360 --> 00:03:00.039
+There are two well-known busses,
+
+00:03:00.040 --> 00:03:02.359
+and these roughly map to those two use cases
+
+00:03:02.360 --> 00:03:03.639
+I mentioned before.
+
+00:03:03.640 --> 00:03:06.479
+The system bus is for interfacing with hardware
+
+00:03:06.480 --> 00:03:08.439
+and operating-system-level concerns
+
+00:03:08.440 --> 00:03:11.679
+like disks, networks, and so forth.
+
+00:03:11.680 --> 00:03:14.319
+The session bus is tied to a user login,
+
+00:03:14.320 --> 00:03:19.999
+and is more in the desktop automation use case.
+
+NOTE Common interfaces
+
+00:03:20.000 --> 00:03:21.919
+There are some common interfaces you'll find
+
+00:03:21.920 --> 00:03:23.959
+if you go exploring D-Bus.
+
+00:03:23.960 --> 00:03:25.999
+The Introspectable interface is the basis
+
+00:03:26.000 --> 00:03:27.919
+of a lot of the reflection features.
+
+00:03:27.920 --> 00:03:30.119
+It has a single method called introspect
+
+00:03:30.120 --> 00:03:32.239
+that returns the XML interface description
+
+00:03:32.240 --> 00:03:33.399
+of whatever you call it on.
+
+00:03:33.400 --> 00:03:36.559
+Peer is used for lower level connectivity,
+
+00:03:36.560 --> 00:03:39.679
+for example, pinging a service to see if it's running.
+
+00:03:39.680 --> 00:03:41.759
+And the Properties interface is the basis
+
+00:03:41.760 --> 00:03:43.119
+of the read-write properties,
+
+00:03:43.120 --> 00:03:45.799
+which are secretly method calls under the cover.
+
+00:03:45.800 --> 00:03:48.519
+Just about every object you interact with on D-Bus
+
+00:03:48.520 --> 00:03:51.399
+will support all three of these interfaces.
+
+00:03:51.400 --> 00:03:54.759
+Additionally, ObjectManager is used for services
+
+00:03:54.760 --> 00:03:56.759
+that manage collections of objects.
+
+00:03:56.760 --> 00:03:59.839
+For example, the disk service has an object
+
+00:03:59.840 --> 00:04:01.279
+for each disk that's attached,
+
+00:04:01.280 --> 00:04:02.799
+and the object manager allows you
+
+00:04:02.800 --> 00:04:06.239
+to enumerate all of those.
+
+NOTE Emacs Native D-Bus
+
+00:04:06.240 --> 00:04:10.359
+Emacs supports D-Bus natively since version 23.1.
+
+00:04:10.360 --> 00:04:12.119
+It's a combination of native bindings
+
+00:04:12.120 --> 00:04:14.639
+with a C library and dbus.el.
+
+00:04:14.640 --> 00:04:17.559
+While there are some ports of D-Bus
+
+00:04:17.560 --> 00:04:19.479
+to non-Linux operating systems,
+
+00:04:19.480 --> 00:04:22.039
+it's probably only available on Linux
+
+00:04:22.040 --> 00:04:24.439
+and almost certainly only usable on Linux.
+
+00:04:24.440 --> 00:04:28.919
+If you want to interact with D-Bus from Emacs,
+
+00:04:28.920 --> 00:04:30.079
+it's fairly straightforward.
+
+00:04:30.080 --> 00:04:33.199
+There's a collection of functions like dbus-get-property
+
+00:04:33.200 --> 00:04:35.039
+or dbus-call-method, et cetera,
+
+00:04:35.040 --> 00:04:37.639
+and they almost all take this same set
+
+00:04:37.640 --> 00:04:39.319
+of four arguments at the beginning:
+
+00:04:39.320 --> 00:04:42.119
+bus, service, path, and interface.
+
+00:04:42.120 --> 00:04:45.439
+In this case, it takes a single additional property,
+
+00:04:45.440 --> 00:04:46.599
+which is the one to read.
+
+00:04:46.600 --> 00:04:49.679
+And what we're calling is the hostname1 service,
+
+00:04:49.680 --> 00:04:51.519
+which gives you just a little bit of information
+
+00:04:51.520 --> 00:04:54.759
+about the system, like its hostname or its chassis.
+
+00:04:54.760 --> 00:04:56.199
+And in this case, you can see I'm running
+
+00:04:56.200 --> 00:04:57.719
+this presentation off my laptop.
+
+00:04:57.720 --> 00:05:00.959
+The problem with this and what I don't like about it
+
+00:05:00.960 --> 00:05:04.599
+is that all of these identifiers are very verbose
+
+00:05:04.600 --> 00:05:05.719
+and very repetitive.
+
+00:05:05.720 --> 00:05:07.679
+And if you end up calling these a lot,
+
+00:05:07.680 --> 00:05:09.319
+it gets old really quickly.
+
+NOTE Debase
+
+00:05:09.320 --> 00:05:12.999
+So I wrote a wrapper called Debase,
+
+00:05:13.000 --> 00:05:15.839
+which is convenience on top of the built-in functions.
+
+00:05:15.840 --> 00:05:18.839
+Most of the stock functions have Debase versions
+
+00:05:18.840 --> 00:05:21.519
+just by replacing "dbus" with "debase".
+
+00:05:21.520 --> 00:05:23.879
+And let's look how that works.
+
+NOTE Debase: Objects
+
+00:05:23.880 --> 00:05:27.999
+The fundamental idea of Debase is that you can bind together
+
+00:05:28.000 --> 00:05:30.319
+all of those arguments into a single object
+
+00:05:30.320 --> 00:05:31.559
+that represents the endpoint.
+
+00:05:31.560 --> 00:05:35.599
+This is an EIEIO class, and it takes keyword arguments,
+
+00:05:35.600 --> 00:05:36.879
+so there's never any chance
+
+00:05:36.880 --> 00:05:38.559
+of mixing up which thing is what.
+
+00:05:38.560 --> 00:05:41.479
+So this sets the endpoint to that object,
+
+00:05:41.480 --> 00:05:43.119
+calls debase-get-property on it,
+
+00:05:43.120 --> 00:05:45.039
+and you can see it works exactly the same.
+
+00:05:45.040 --> 00:05:47.359
+The thing that's really nice about this, though,
+
+00:05:47.360 --> 00:05:50.199
+is it knows that so many of these arguments
+
+00:05:50.200 --> 00:05:52.919
+are very similar that it can compute most of them
+
+00:05:52.920 --> 00:05:54.279
+if you don't provide them all.
+
+00:05:54.280 --> 00:05:57.159
+So if you just say service, it will assume
+
+00:05:57.160 --> 00:05:59.159
+that you want the same object that matches
+
+00:05:59.160 --> 00:06:00.879
+and the same interface that matches,
+
+00:06:00.880 --> 00:06:02.319
+and it works just the same.
+
+00:06:02.320 --> 00:06:04.879
+I find this very, very convenient.
+
+00:06:04.880 --> 00:06:07.239
+You can also reuse the object
+
+00:06:07.240 --> 00:06:09.159
+instead of having to repeat every argument
+
+00:06:09.160 --> 00:06:10.399
+with every function call,
+
+00:06:10.400 --> 00:06:13.439
+which is a really great improvement in ergonomics.
+
+NOTE Debase: Retarget objects
+
+00:06:13.440 --> 00:06:18.119
+Because so many objects have multiple interfaces,
+
+00:06:18.120 --> 00:06:20.319
+you often find yourself needing to look
+
+00:06:20.320 --> 00:06:22.479
+at a different aspect of that object.
+
+00:06:22.480 --> 00:06:26.599
+This is supported with the built-in EIEIO clone method,
+
+00:06:26.600 --> 00:06:28.279
+which takes an object
+
+00:06:28.280 --> 00:06:30.439
+and a set of keyword arguments to replace.
+
+00:06:30.440 --> 00:06:32.599
+So in this case, we can see we're calling
+
+00:06:32.600 --> 00:06:33.479
+the Properties method,
+
+00:06:33.480 --> 00:06:35.799
+but everything else on that endpoint is the same.
+
+00:06:35.800 --> 00:06:38.079
+And then we're gonna call the method GetAll
+
+00:06:38.080 --> 00:06:39.359
+on that Properties interface,
+
+00:06:39.360 --> 00:06:41.119
+and it's going to return all the properties
+
+00:06:41.120 --> 00:06:43.919
+of the org.freedesktop.hostname1 interface
+
+00:06:43.920 --> 00:06:45.199
+inside of that object.
+
+00:06:45.200 --> 00:06:48.199
+And if we run that, we can see there's the hostname
+
+00:06:48.200 --> 00:06:50.159
+and some other information about the laptop
+
+00:06:50.160 --> 00:06:51.079
+that I'm running this on.
+
+NOTE Debase: Object binding
+
+00:06:51.080 --> 00:06:54.399
+Debase also supports object binding.
+
+00:06:54.400 --> 00:06:58.559
+This creates a lexical context in which the Debase object
+
+00:06:58.560 --> 00:07:01.119
+is the implicit target of any D-Bus function.
+
+00:07:01.120 --> 00:07:03.279
+This is really convenient if you need
+
+00:07:03.280 --> 00:07:06.479
+to fetch multiple properties or otherwise interact
+
+00:07:06.480 --> 00:07:09.319
+with the same endpoint in multiple different ways.
+
+00:07:09.320 --> 00:07:11.359
+And you can see I'm still on a laptop
+
+00:07:11.360 --> 00:07:12.479
+and it's still named meson.
+
+NOTE Debase: Raw binding
+
+00:07:12.480 --> 00:07:16.319
+You can also, if you don't want to use the object,
+
+00:07:16.320 --> 00:07:18.239
+you can provide the raw argument list.
+
+00:07:18.240 --> 00:07:20.919
+Under the covers, this is basically an flet
+
+00:07:20.920 --> 00:07:23.279
+where you're currying all of these functions
+
+00:07:23.280 --> 00:07:25.439
+so they start with those argument lists.
+
+00:07:25.440 --> 00:07:27.799
+And you can see I'm running on a Linux machine,
+
+00:07:27.800 --> 00:07:29.399
+which should not be surprising.
+
+NOTE Debase: Codegen
+
+00:07:29.400 --> 00:07:34.079
+Debase also has an experimental code generation feature.
+
+00:07:34.080 --> 00:07:38.359
+It outputs EIEIO code with one class per D-Bus interface.
+
+00:07:38.360 --> 00:07:41.079
+This includes accessors for all of its properties
+
+00:07:41.080 --> 00:07:44.159
+with an in-process cache, so if you read one property,
+
+00:07:44.160 --> 00:07:46.399
+you don't have to go back to the bus to read it again.
+
+00:07:46.400 --> 00:07:50.119
+It also outputs generic functions and method implementations
+
+00:07:50.120 --> 00:07:52.199
+for the D-Bus interface methods.
+
+00:07:52.200 --> 00:07:54.279
+It includes name-mangling options,
+
+00:07:54.280 --> 00:07:56.879
+so you can control how everything is named.
+
+00:07:56.880 --> 00:07:58.639
+And you can generate the code either
+
+00:07:58.640 --> 00:08:00.279
+via introspecting a live system
+
+00:08:00.280 --> 00:08:02.639
+or providing an XML interface description,
+
+00:08:02.640 --> 00:08:04.279
+which is handy if you want to use it
+
+00:08:04.280 --> 00:08:05.919
+as part of a non-interactive build.
+
+00:08:05.920 --> 00:08:08.159
+I think this has a lot of promise,
+
+00:08:08.160 --> 00:08:09.679
+but it doesn't feel quite right yet,
+
+00:08:09.680 --> 00:08:14.199
+so any feedback or contributions are very welcome.
+
+NOTE Debase: Codegen example
+
+00:08:14.200 --> 00:08:16.919
+Let's generate some Elisp code
+
+00:08:16.920 --> 00:08:19.639
+for that hostname1 service we were interacting with before.
+
+00:08:19.640 --> 00:08:23.119
+debase-gen-class is the generation class,
+
+00:08:23.120 --> 00:08:26.079
+and it says to create a class that matches this interface,
+
+00:08:26.080 --> 00:08:28.999
+named "hostname1", and then the rest of these arguments
+
+00:08:29.000 --> 00:08:30.999
+are the same ones to target the endpoint,
+
+00:08:31.000 --> 00:08:32.919
+just like with debase-object,
+
+00:08:32.920 --> 00:08:34.759
+because it extends debase-object.
+
+00:08:34.760 --> 00:08:37.679
+debase-gen-code is a generic function
+
+00:08:37.680 --> 00:08:40.119
+that takes any debase-gen class.
+
+00:08:40.120 --> 00:08:42.279
+There are different classes for functions,
+
+00:08:42.280 --> 00:08:43.359
+properties, et cetera,
+
+00:08:43.360 --> 00:08:45.479
+and it creates all of the code for it.
+
+00:08:45.480 --> 00:08:48.279
+If we evaluate it, we can see the results
+
+00:08:48.280 --> 00:08:49.959
+look about like we would expect:
+
+00:08:49.960 --> 00:08:52.159
+creates a defclass named "hostname1",
+
+00:08:52.160 --> 00:08:53.879
+which extends debase-object,
+
+00:08:53.880 --> 00:08:56.639
+has all of the slots and accessors defined,
+
+00:08:56.640 --> 00:08:59.319
+and then methods that define everything
+
+00:08:59.320 --> 00:09:01.839
+that you might want to do with it, including documentation.
+
+00:09:01.840 --> 00:09:04.759
+This is based on introspecting a running system,
+
+00:09:04.760 --> 00:09:05.479
+but as I mentioned,
+
+00:09:05.480 --> 00:09:08.039
+you can provide an XML interface description instead,
+
+00:09:08.040 --> 00:09:08.679
+if you like.
+
+NOTE Debase: ObjectManager
+
+00:09:08.680 --> 00:09:12.279
+Debase also comes with "debase-objectmanager",
+
+00:09:12.280 --> 00:09:15.399
+which is convenience for the D-Bus ObjectManager interface.
+
+00:09:15.400 --> 00:09:17.999
+This is used in a lot of places in D-Bus,
+
+00:09:18.000 --> 00:09:20.279
+where an object manages other objects.
+
+00:09:20.280 --> 00:09:22.719
+For example, the NetworkManager object
+
+00:09:22.720 --> 00:09:25.159
+manages network hardware objects,
+
+00:09:25.160 --> 00:09:26.879
+and using the ObjectManager interface,
+
+00:09:26.880 --> 00:09:28.879
+you can enumerate all of the network hardware,
+
+00:09:28.880 --> 00:09:31.039
+and by subscribing to the signals,
+
+00:09:31.040 --> 00:09:32.999
+you can be notified when they change.
+
+00:09:33.000 --> 00:09:35.999
+"debase-objectmanager" keeps a local cache,
+
+00:09:36.000 --> 00:09:38.119
+and will fire a callback on any change.
+
+00:09:38.120 --> 00:09:41.239
+So it's the building block for that dynamic user interface,
+
+00:09:41.240 --> 00:09:43.119
+like you would see in a desktop system,
+
+00:09:43.120 --> 00:09:44.479
+but inside of Emacs.
+
+NOTE Demo: Discomfort
+
+00:09:44.480 --> 00:09:47.759
+Let's do some demos.
+
+00:09:47.760 --> 00:09:51.039
+Discomfort is an interface I wrote for UDisks2,
+
+00:09:51.040 --> 00:09:53.719
+which is what manages all of the block device hardware.
+
+00:09:53.720 --> 00:09:57.679
+And again, it has that dynamic desktop-like interactivity,
+
+00:09:57.680 --> 00:10:00.279
+and mostly will just do what you mean.
+
+00:10:00.280 --> 00:10:03.519
+This is definitely alpha state.
+
+00:10:03.520 --> 00:10:04.839
+It doesn't have all the features,
+
+00:10:04.840 --> 00:10:06.559
+but it's good enough that I use it daily.
+
+00:10:06.560 --> 00:10:08.879
+So here's Discomfort,
+
+00:10:08.880 --> 00:10:11.679
+and you can see it has a list of all your hardware,
+
+00:10:11.680 --> 00:10:13.639
+what type it is, and where it's mounted.
+
+00:10:13.640 --> 00:10:16.199
+I have a little USB extension cable here,
+
+00:10:16.200 --> 00:10:17.679
+and I'm gonna plug in a disc,
+
+00:10:17.680 --> 00:10:19.319
+just to show you how this works.
+
+00:10:19.320 --> 00:10:21.079
+You can see when I plug it in,
+
+00:10:21.080 --> 00:10:22.399
+just a moment later,
+
+00:10:22.400 --> 00:10:24.439
+it shows up in that list, automatically.
+
+00:10:24.440 --> 00:10:25.719
+I don't have to press any key,
+
+00:10:25.720 --> 00:10:27.759
+I don't have to refresh it, it's just there.
+
+00:10:27.760 --> 00:10:29.519
+If I unplug it, it's gone.
+
+00:10:29.520 --> 00:10:30.719
+Plug it back in,
+
+00:10:30.720 --> 00:10:33.399
+and there it is.
+
+00:10:33.400 --> 00:10:35.239
+And you can see it's an encrypted volume.
+
+00:10:35.240 --> 00:10:37.279
+So in order to do anything with this,
+
+00:10:37.280 --> 00:10:38.679
+I'm going to have to supply a password.
+
+00:10:38.680 --> 00:10:41.759
+Just pressing Enter goes into the "do what I mean" mode,
+
+00:10:41.760 --> 00:10:43.519
+and it asks for the password.
+
+00:10:43.520 --> 00:10:46.599
+In this case, I've chosen the very secure password
+
+00:10:46.600 --> 00:10:47.559
+of "password".
+
+00:10:47.560 --> 00:10:51.199
+I hit Enter, and it unlocks it, and it mounts it,
+
+00:10:51.200 --> 00:10:53.319
+and it opens "dired" looking at it.
+
+00:10:53.320 --> 00:10:54.439
+And here's a little README.
+
+00:10:54.440 --> 00:10:55.559
+Let's see what it says.
+
+00:10:55.560 --> 00:10:58.559
+"Hello, EmacsConf."
+
+00:10:58.560 --> 00:11:01.479
+So that's my demo of discomfort.
+
+NOTE Demo: Remote eval
+
+00:11:01.480 --> 00:11:05.839
+In addition to acting as a client for D-Bus,
+
+00:11:05.840 --> 00:11:09.359
+Emacs can also offer services to other D-Bus clients.
+
+00:11:09.360 --> 00:11:11.959
+This is a really interesting opportunity
+
+00:11:11.960 --> 00:11:14.119
+because it allows many different programs
+
+00:11:14.120 --> 00:11:15.279
+to integrate with Emacs
+
+00:11:15.280 --> 00:11:17.679
+in ways that were previously very difficult.
+
+00:11:17.680 --> 00:11:20.239
+You can use this as an alternative to Emacs.
+
+00:11:20.240 --> 00:11:23.199
+The difference is D-Bus provides a full API,
+
+00:11:23.200 --> 00:11:24.999
+so instead of emacsclient being
+
+00:11:25.000 --> 00:11:26.679
+a sort of fire-and-forget system,
+
+00:11:26.680 --> 00:11:30.119
+you can actually get results back from the remote operation.
+
+00:11:30.120 --> 00:11:31.999
+So here's some code.
+
+00:11:32.000 --> 00:11:35.679
+Here's a dbus-eval function, which takes a string,
+
+00:11:35.680 --> 00:11:37.359
+reads it, and evaluates it,
+
+00:11:37.360 --> 00:11:39.359
+and returns whatever that value is.
+
+00:11:39.360 --> 00:11:41.839
+Then we have a debase-bind block
+
+00:11:41.840 --> 00:11:44.799
+that sets up an object on the session bus.
+
+00:11:44.800 --> 00:11:46.839
+Again, that's my user login bus.
+
+00:11:46.840 --> 00:11:49.559
+It offers this D-Bus service Emacs.
+
+00:11:49.560 --> 00:11:53.399
+This is a constant inside of the dbus.el package.
+
+00:11:53.400 --> 00:11:55.439
+And again, the path is a constant in there.
+
+00:11:55.440 --> 00:11:57.159
+And we're gonna create this interface,
+
+00:11:57.160 --> 00:12:02.519
+org.gnu.Emacs.Eval, and then register a method called Eval
+
+00:12:02.520 --> 00:12:04.759
+that calls that dbus-eval function.
+
+00:12:04.760 --> 00:12:08.119
+Pretty straightforward, only a handful of lines of code.
+
+00:12:08.120 --> 00:12:12.399
+To test this out, we're going to use the dbus-send utility.
+
+00:12:12.400 --> 00:12:15.399
+This is a command line program that interacts with D-Bus.
+
+00:12:15.400 --> 00:12:18.079
+We're going to tell it to wait for and print the reply,
+
+00:12:18.080 --> 00:12:20.999
+that the message should be sent to the session bus,
+
+00:12:21.000 --> 00:12:22.599
+that we're going to talk
+
+00:12:22.600 --> 00:12:25.639
+to the org.gnu.Emacs service on that bus,
+
+00:12:25.640 --> 00:12:30.879
+and the /org/gnu/Emacs object inside that service.
+
+00:12:30.880 --> 00:12:33.039
+On that object, we're gonna interact
+
+00:12:33.040 --> 00:12:35.999
+with the org.gnu.Emacs.Eval interface
+
+00:12:36.000 --> 00:12:37.639
+and call its Eval method.
+
+00:12:37.640 --> 00:12:40.639
+We're gonna call that method with a single string argument,
+
+00:12:40.640 --> 00:12:42.639
+which is indicated by the string prefix,
+
+00:12:42.640 --> 00:12:44.999
+and then a form to evaluate.
+
+00:12:45.000 --> 00:12:46.999
+I actually have to run this from a shell,
+
+00:12:47.000 --> 00:12:49.399
+because if I try using it in Org, it wedges.
+
+00:12:49.400 --> 00:12:51.959
+org-babel blocks waiting on completion,
+
+00:12:51.960 --> 00:12:54.519
+which blocks the D-Bus service from responding.
+
+00:12:54.520 --> 00:12:57.399
+I really wish Emacs was multi-threaded.
+
+00:12:57.400 --> 00:12:59.919
+But let's try it out.
+
+00:12:59.920 --> 00:13:02.719
+So if we run this, we can see that we get a return,
+
+00:13:02.720 --> 00:13:05.239
+and that's an unsigned integer of 32 bits
+
+00:13:05.240 --> 00:13:06.439
+with a value of 3.
+
+00:13:06.440 --> 00:13:09.959
+So like I was saying, this is really a two-way API
+
+00:13:09.960 --> 00:13:11.719
+where you can communicate back and forth
+
+00:13:11.720 --> 00:13:13.399
+between Emacs and another program.
+
+00:13:13.400 --> 00:13:14.959
+It's not just fire-and-forget.
+
+00:13:14.960 --> 00:13:16.279
+I think that's really cool.
+
+NOTE Demo: Remote Org capture
+
+00:13:16.280 --> 00:13:18.519
+Let's try another demo.
+
+00:13:18.520 --> 00:13:20.599
+What about a remote org-capture?
+
+00:13:20.600 --> 00:13:22.999
+What if you could trigger an org-capture
+
+00:13:23.000 --> 00:13:24.679
+from any program on your desktop?
+
+00:13:24.680 --> 00:13:26.239
+I think that would be pretty cool.
+
+00:13:26.240 --> 00:13:30.239
+And we can see, there it is.
+
+00:13:30.240 --> 00:13:38.919
+All right, I think I've got that one covered.
+
+00:13:38.920 --> 00:13:42.319
+So I do want to say that remote eval is probably a bad idea
+
+00:13:42.320 --> 00:13:43.479
+from a security perspective,
+
+00:13:43.480 --> 00:13:46.759
+but the point of this is some quick and dirty demonstrations
+
+00:13:46.760 --> 00:13:49.799
+of what can happen and to get people's imaginations flowing,
+
+00:13:49.800 --> 00:13:51.719
+because I think this is something
+
+00:13:51.720 --> 00:13:54.079
+that offers a lot of promise for Emacs.
+
+00:13:54.080 --> 00:13:57.799
+I think having a full-blown Emacs desktop environment
+
+00:13:57.800 --> 00:13:59.879
+where it can do all the things that a GNOME
+
+00:13:59.880 --> 00:14:02.759
+or a KDE environment can do is very exciting.
+
+00:14:02.760 --> 00:14:06.439
+And if you want to have a traditional GUI with Emacs
+
+00:14:06.440 --> 00:14:08.679
+as a more integrated participant of it,
+
+00:14:08.680 --> 00:14:11.879
+its service mechanism offers a lot of ability to do that.
+
+NOTE Future directions
+
+00:14:11.880 --> 00:14:15.999
+In the micro sense, I think there's a lot of improvements
+
+00:14:16.000 --> 00:14:19.279
+that can be made to either dbus.el or to dbase.
+
+00:14:19.280 --> 00:14:21.639
+The main one is handling of the type system.
+
+00:14:21.640 --> 00:14:25.839
+Lisp's dynamic type system doesn't mesh particularly well
+
+00:14:25.840 --> 00:14:28.799
+with the static strong type system that D-bus offers,
+
+00:14:28.800 --> 00:14:31.359
+and having some convenience to assist that
+
+00:14:31.360 --> 00:14:32.639
+would be very helpful.
+
+00:14:32.640 --> 00:14:35.319
+There's also some weird interfaces.
+
+00:14:35.320 --> 00:14:38.119
+For example, some things return identifiers
+
+00:14:38.120 --> 00:14:40.919
+as an array of integer code points instead of a string,
+
+00:14:40.920 --> 00:14:43.719
+and there should be a common way of handling that.
+
+00:14:43.720 --> 00:14:46.159
+I also think that the service support could be improved.
+
+00:14:46.160 --> 00:14:48.039
+Even though I gave the demo service,
+
+00:14:48.040 --> 00:14:50.479
+it's not really a great D-bus citizen
+
+00:14:50.480 --> 00:14:53.079
+because it doesn't offer that introspection mechanism,
+
+00:14:53.080 --> 00:14:55.919
+and so the actual methods are pretty much invisible
+
+00:14:55.920 --> 00:14:56.919
+to other participants,
+
+00:14:56.920 --> 00:15:00.079
+unless they already know that you're using Emacs.
+
+00:15:00.080 --> 00:15:01.799
+That's my talk.
+
+00:15:01.800 --> 00:15:02.559
+Thank you.
+
+00:15:02.560 --> 00:15:07.320
+You can find me on mastodon.social or on libera.chat.
diff --git a/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.vtt b/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.vtt
new file mode 100644
index 00000000..7d9c7920
--- /dev/null
+++ b/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.vtt
@@ -0,0 +1,1028 @@
+WEBVTT
+
+00:00.000 --> 00:02.360
+Thank you for the great talk, Niklas.
+
+00:02.360 --> 00:05.040
+And yes, the Q&A is now open.
+
+00:05.040 --> 00:09.320
+Folks, feel free to post your questions on the pattern IRC.
+
+00:09.320 --> 00:10.900
+And after a minute or two, we'll also
+
+00:10.900 --> 00:12.680
+open up this big blue button for people
+
+00:12.680 --> 00:15.820
+who might prefer to come join Niklas here directly
+
+00:15.820 --> 00:17.680
+and ask the questions here.
+
+00:17.680 --> 00:20.240
+Niklas, take it away.
+
+00:20.240 --> 00:21.000
+All right.
+
+00:21.000 --> 00:21.720
+Thank you.
+
+00:21.720 --> 00:25.040
+And thanks for having me.
+
+00:25.040 --> 00:28.720
+Yeah, maybe I'll go ahead and read some questions
+
+00:28.720 --> 00:32.880
+that have popped up in the formula here then.
+
+00:32.880 --> 00:37.440
+So the first question is, can it replace SSH plus TMAX
+
+00:37.440 --> 00:42.280
+for persistent sessions on remote hosts?
+
+00:42.280 --> 00:46.440
+So currently, I would say it does not
+
+00:46.440 --> 00:49.720
+support that because it is designed
+
+00:49.720 --> 00:53.440
+to only run a single command inside a session.
+
+00:53.440 --> 00:59.920
+And when that finishes, it reports back.
+
+00:59.920 --> 01:01.640
+But I have played with the idea.
+
+01:01.640 --> 01:04.480
+I think it should be possible to do.
+
+01:04.480 --> 01:08.640
+But I wanted to start off and polish the experience
+
+01:08.640 --> 01:12.720
+with a single command first.
+
+01:12.720 --> 01:16.880
+And secondly, there is a question.
+
+01:16.880 --> 01:20.880
+I see integration with projectile in the README.
+
+01:20.880 --> 01:23.960
+Does it also integrate with project.io?
+
+01:28.400 --> 01:30.200
+Yeah, good question.
+
+01:30.200 --> 01:31.840
+It doesn't.
+
+01:31.840 --> 01:37.920
+I haven't added any explicit support for it
+
+01:37.920 --> 01:43.880
+because I typically run detached compiling in the project
+
+01:43.880 --> 01:49.160
+root with my own command using project behind the scenes.
+
+01:49.160 --> 01:51.880
+But I guess project has a command for it now.
+
+01:51.880 --> 02:21.840
+So yeah, it should be very easy to add support for that.
+
+02:21.840 --> 02:28.000
+And I could also mention that could be one thing related
+
+02:28.000 --> 02:31.480
+to the first questionnaire of using kind of persistent
+
+02:31.480 --> 02:37.560
+sessions, that it would be interesting to see if,
+
+02:37.560 --> 02:44.000
+for example, I occasionally run Python REPL in Emacs.
+
+02:44.000 --> 02:48.000
+And if I could get that one to launch using detach,
+
+02:48.000 --> 02:52.960
+so I could restart Emacs and reattach to the REPL
+
+02:52.960 --> 02:57.920
+or also use it for situations where I have used the REPL
+
+02:57.920 --> 03:02.000
+to, let's say, experiment with, I don't know,
+
+03:02.000 --> 03:04.720
+some NumPy function, how that works.
+
+03:04.720 --> 03:10.400
+And if I use detach for that, it would automatically
+
+03:10.400 --> 03:12.920
+log then the whole session.
+
+03:12.920 --> 03:15.360
+And I would have it accessible.
+
+03:15.360 --> 03:19.560
+So I could search for it in retrospect
+
+03:19.560 --> 03:23.880
+and retrieve the log and see, OK, I ran this command.
+
+03:23.880 --> 03:26.760
+This happened, or basically.
+
+03:32.680 --> 03:35.320
+So then there is a question.
+
+03:35.320 --> 03:36.600
+Can you?
+
+03:36.600 --> 03:37.360
+Oh, OK.
+
+03:37.360 --> 03:38.800
+I'll read the other one.
+
+03:38.800 --> 03:43.400
+No, there is two in there.
+
+03:46.920 --> 03:48.040
+It's ongoing.
+
+03:48.040 --> 03:51.240
+I'll wait for them.
+
+03:51.240 --> 03:52.920
+So the first question is, can you
+
+03:52.920 --> 03:56.520
+detach a session from shell mode and reattach
+
+03:56.520 --> 04:01.920
+from eshell vterm mode or start a compile in a shell mode
+
+04:01.920 --> 04:09.120
+and attach it from compilation mode?
+
+04:09.120 --> 04:16.240
+Yeah, so you can attach at the moment
+
+04:16.240 --> 04:20.400
+or reattach in shell mode, eshell vterm.
+
+04:20.400 --> 04:25.680
+That is no problem.
+
+04:25.680 --> 04:33.880
+Currently, I don't have support for attaching in compilation
+
+04:33.880 --> 04:34.720
+mode.
+
+04:34.720 --> 04:39.040
+So the way the package is built is
+
+04:39.040 --> 04:44.280
+that when the session is started,
+
+04:44.280 --> 04:51.240
+there is a variable that gets inserted into the session.
+
+04:51.240 --> 04:56.280
+And it describes how the session would handle,
+
+04:56.280 --> 05:01.720
+for example, attaching to it or viewing the output, et cetera.
+
+05:04.480 --> 05:12.560
+But these are the things that I want to primarily focus
+
+05:12.560 --> 05:17.680
+in the near future, so making it easier to, for example,
+
+05:17.680 --> 05:21.040
+have a buffer up where you're attached to a session.
+
+05:21.040 --> 05:25.680
+You could run a key binding to switch
+
+05:25.680 --> 05:29.000
+to the view mode of that session.
+
+05:29.000 --> 05:32.800
+You get the full output, and then you could view it.
+
+05:32.800 --> 05:37.200
+You can switch back to the attached version, which
+
+05:37.200 --> 05:40.560
+just shows a brief context and then continues on
+
+05:40.560 --> 05:45.120
+with the current output from the session.
+
+05:45.120 --> 05:50.640
+Question number four here is, how do you talk to detach?
+
+05:50.640 --> 05:54.480
+Could it be feasible to run a child emacs instead
+
+05:54.480 --> 05:56.360
+of detach?
+
+05:56.360 --> 05:58.800
+Would it make sense?
+
+05:58.800 --> 06:02.520
+Better communication, maybe.
+
+06:02.520 --> 06:08.560
+So the way the talk with detach is done
+
+06:08.560 --> 06:11.680
+is, I would say, very simple.
+
+06:11.680 --> 06:19.480
+Detach the program supports basic instructions
+
+06:19.480 --> 06:25.320
+like detach dash a to attach, or yeah, that's basically it.
+
+06:28.080 --> 06:32.760
+And that is all that's being used under the hood.
+
+06:32.760 --> 06:37.280
+And of course, it uses its C flag
+
+06:37.280 --> 06:47.240
+to create and attach when a session is started, or the dash
+
+06:47.240 --> 06:52.440
+n to start the session in kind of detached mode.
+
+06:52.440 --> 06:55.440
+So it runs without emacs being attached to it.
+
+06:58.240 --> 07:05.720
+Currently, I don't think I've seen any need for a child emacs
+
+07:05.720 --> 07:08.920
+need for better communication.
+
+07:08.920 --> 07:15.400
+But if people have ideas about what could be done,
+
+07:15.400 --> 07:19.280
+if it was added, yeah, that would be great.
+
+07:19.280 --> 07:20.960
+So maybe that could be a follow up
+
+07:20.960 --> 07:24.640
+if you got ideas on how to improve it.
+
+07:24.640 --> 07:33.160
+Yeah, so I'm not sure if the emacs child, yeah,
+
+07:33.160 --> 07:36.360
+I think if I got a better idea about what
+
+07:36.360 --> 07:39.120
+the person would like to achieve with it,
+
+07:39.120 --> 07:43.000
+then maybe I could understand the question better there.
+
+07:45.880 --> 07:49.480
+So another question is, how does it handle processes
+
+07:49.480 --> 07:52.560
+that require you to do that?
+
+07:52.560 --> 07:55.440
+So processes that require user input,
+
+07:55.440 --> 07:59.080
+usually type yes, no, et cetera.
+
+07:59.080 --> 08:05.600
+MetaX compiles great, but can't handle user input.
+
+08:05.600 --> 08:16.600
+Yeah, so it's very simple behind the scenes.
+
+08:16.600 --> 08:21.320
+It depends on what interface you use for attaching emacs
+
+08:21.320 --> 08:23.160
+to that process.
+
+08:23.160 --> 08:27.680
+So as the person says, if it's MetaX compiled,
+
+08:27.680 --> 08:32.160
+then probably it doesn't handle it.
+
+08:32.160 --> 08:40.080
+So in that case, I guess I would have started it
+
+08:40.080 --> 08:42.680
+from the shell.
+
+08:42.680 --> 08:46.960
+If there is a question, you need to type yes or no,
+
+08:46.960 --> 08:53.000
+then you can just type it and maybe detach from it.
+
+08:53.000 --> 08:56.400
+Or if you end up in a situation where
+
+08:56.400 --> 09:00.080
+you started with MetaX compile, but then it has the question,
+
+09:00.080 --> 09:04.400
+I guess you could always pop up a shell attached
+
+09:04.400 --> 09:07.080
+to the session, and you will get the question there.
+
+09:07.080 --> 09:11.480
+You press whatever answer you'd like,
+
+09:11.480 --> 09:20.000
+and then detach from that user interface.
+
+09:20.000 --> 09:23.480
+So another question is, can you rerun a command session,
+
+09:23.480 --> 09:25.880
+but in another directory?
+
+09:28.560 --> 09:33.360
+Yeah, you can't do that at the moment.
+
+09:33.360 --> 09:38.120
+I haven't really found a need for it.
+
+09:38.120 --> 09:46.000
+So typically, as I have been using detach,
+
+09:46.000 --> 09:52.680
+now when it has a persistent storage of the sessions,
+
+09:52.680 --> 09:57.040
+it becomes rather natural that once I've run it once,
+
+09:57.040 --> 10:07.120
+I can just rerun it later in the same directory.
+
+10:07.120 --> 10:11.400
+But maybe this is a feature that should be added.
+
+10:11.400 --> 10:16.840
+It's maybe a common use case.
+
+10:16.840 --> 10:22.120
+One thing that I added on top of the rerun
+
+10:22.120 --> 10:25.280
+is like an edit and rerun for those situations
+
+10:25.280 --> 10:30.240
+where I maybe run some compilation,
+
+10:30.240 --> 10:34.960
+but with the compilation flag set to opt,
+
+10:34.960 --> 10:37.680
+and then I want to rerun the exact same command
+
+10:37.680 --> 10:43.600
+in the same directory, but with it set to dbg instead
+
+10:43.600 --> 10:44.520
+for debugging.
+
+10:44.520 --> 10:48.600
+And then instead of pressing R to rerun, I press E.
+
+10:48.600 --> 10:53.400
+Then I get a prompt with the current command,
+
+10:53.400 --> 10:57.640
+and then I can add it, and it will rerun that.
+
+10:57.640 --> 11:00.920
+So maybe something similar for another directory
+
+11:00.920 --> 11:05.320
+could be added.
+
+11:22.720 --> 11:23.200
+Cool.
+
+11:23.200 --> 11:27.200
+I think we still have about 13 or 14 more minutes of live Q&A
+
+11:27.200 --> 11:29.840
+time on stream, so if folks do have more questions
+
+11:29.840 --> 11:32.440
+about this talk from Nicolas, please
+
+11:32.440 --> 11:33.960
+feel free to put them on the pad,
+
+11:33.960 --> 11:36.560
+or come join here on the big blue button and ask here.
+
+11:40.400 --> 11:41.320
+Yeah.
+
+11:41.320 --> 11:47.600
+And I also want to mention that if you realize later
+
+11:47.600 --> 11:50.000
+you have a question or a suggestion,
+
+11:50.000 --> 11:57.200
+feel free to contact me or create a new post
+
+11:57.200 --> 12:00.960
+on the mailing list for the project.
+
+12:00.960 --> 12:02.720
+That's much appreciated.
+
+12:07.160 --> 12:09.720
+Sounds good.
+
+12:09.720 --> 12:10.240
+Yeah.
+
+12:10.240 --> 12:22.880
+So then there is a question incoming.
+
+12:22.880 --> 12:30.320
+So what are some other places where this might be useful?
+
+12:30.320 --> 12:32.760
+And you, for me, fetching that question
+
+12:32.760 --> 12:40.480
+is, what are some other places where this might be useful?
+
+12:40.480 --> 12:46.320
+And you, for me, fetching mail, get processes started by magic.
+
+12:46.320 --> 12:48.880
+What things would you like to see working
+
+12:48.880 --> 12:52.560
+in a one to two-year time frame?
+
+12:55.040 --> 12:58.520
+Yeah, that's a good question.
+
+12:58.520 --> 13:01.800
+I think there are these situations.
+
+13:01.800 --> 13:04.800
+One of the things that I ran into yesterday
+
+13:04.800 --> 13:11.320
+was that I was trying to use EMMS to connect
+
+13:11.320 --> 13:14.560
+to the stream for Emacs Conv.
+
+13:14.560 --> 13:17.640
+And that was working fine.
+
+13:17.640 --> 13:22.040
+It was using MPV in the background.
+
+13:22.040 --> 13:25.280
+But then I did some modifications to my Emacs
+
+13:25.280 --> 13:30.120
+and wanted to restart it, and then the stream died.
+
+13:30.120 --> 13:35.600
+Kind of those situations where I found it valuable,
+
+13:35.600 --> 13:41.800
+I added support for the D-RED R-Sync package,
+
+13:41.800 --> 13:44.440
+for example, that I use occasionally
+
+13:44.440 --> 13:51.480
+to copy things to a remote server
+
+13:51.480 --> 13:52.960
+or from a remote server.
+
+13:52.960 --> 13:56.280
+And yeah, that was always something
+
+13:56.280 --> 14:00.240
+that I thought could benefit from it.
+
+14:00.240 --> 14:08.000
+So I would ideally like to see if it
+
+14:08.000 --> 14:13.080
+can be used for more of these processes.
+
+14:15.680 --> 14:21.600
+I guess maybe I should get in contact
+
+14:21.600 --> 14:27.480
+with some of the devs to see if they have ideas on how this
+
+14:27.480 --> 14:33.360
+could be incorporated better with Emacs.
+
+14:33.360 --> 14:36.440
+Because so far, it was kind of straightforward
+
+14:36.440 --> 14:41.000
+to get it to work with Shell or Compile.
+
+14:41.000 --> 14:47.360
+But it hacks around the current implementation
+
+14:47.360 --> 14:48.760
+to make it use Detach.
+
+14:48.760 --> 14:55.360
+And if I wanted it to be used in many more places,
+
+14:55.360 --> 14:58.560
+it feels like it would be maybe not the best way
+
+14:58.560 --> 15:07.440
+to have a lot of advices being added to the various functions.
+
+15:07.440 --> 15:12.720
+But yeah, definitely, it would be really cool
+
+15:12.720 --> 15:17.760
+if that could be worked on properly
+
+15:17.760 --> 15:22.880
+so that once I've managed to get the workflow
+
+15:22.880 --> 15:27.080
+for its current implementation a little bit more polished,
+
+15:27.080 --> 15:38.600
+I will try to look into this and also see what is possible.
+
+15:38.600 --> 15:42.080
+I don't know if there are any limitations
+
+15:42.080 --> 15:49.360
+with my current approach that I need some more expertise on.
+
+16:12.080 --> 16:39.760
+Yeah, so if there is no other questions, I'll
+
+16:39.760 --> 16:53.960
+OK, there is another question.
+
+16:53.960 --> 16:59.720
+OK, a general topic here.
+
+16:59.720 --> 17:02.520
+What are you currently excited about in Emacs?
+
+17:02.520 --> 17:15.520
+Well, I'm really excited about the TreeSitter
+
+17:15.520 --> 17:21.120
+that was just added to Emacs 29.
+
+17:21.120 --> 17:27.240
+I haven't gotten around to use that yet.
+
+17:27.240 --> 17:29.640
+But I think it looks very promising.
+
+17:29.640 --> 17:37.440
+And I'm a big fan of structural editing
+
+17:37.440 --> 17:39.040
+that you can use in Lisp.
+
+17:39.040 --> 17:42.600
+So if this opens up the possibility
+
+17:42.600 --> 17:47.880
+to be able to use that more in other languages,
+
+17:47.880 --> 17:49.000
+that would be really cool.
+
+17:49.000 --> 17:56.880
+Otherwise, I'm generally excited about how
+
+17:56.880 --> 18:01.880
+the program is developing.
+
+18:01.880 --> 18:05.040
+I think there has been a lot of great additions
+
+18:05.040 --> 18:11.720
+in these last couple of versions of the program.
+
+18:11.720 --> 18:13.680
+So it's cool to see.
+
+18:13.680 --> 18:22.640
+And also how the Emacs Conf has been continuing
+
+18:22.640 --> 18:27.760
+and being an annual thing and also growing,
+
+18:27.760 --> 18:33.280
+adding this new layout with the general track
+
+18:33.280 --> 18:34.280
+and development track.
+
+18:34.280 --> 18:35.080
+I think it's great.
+
+18:39.080 --> 18:39.560
+Thanks.
+
+18:39.560 --> 18:41.040
+Yeah, it's been interesting.
+
+18:41.040 --> 18:46.800
+Emacs itself, I feel like the Emacs-Devel mailing list
+
+18:46.800 --> 18:50.520
+has been growing in traffic over the years.
+
+18:50.520 --> 18:52.280
+I've been subscribed for a couple of years.
+
+18:52.280 --> 18:56.200
+And more recently, I'm just seeing more and more
+
+18:56.200 --> 18:57.600
+incoming emails from Emacs-Devel,
+
+18:57.600 --> 19:00.000
+which is always cool.
+
+19:00.000 --> 19:02.680
+Yeah, and like you said with Emacs Conf,
+
+19:02.680 --> 19:05.800
+yeah, we've been growing, thankfully.
+
+19:05.800 --> 19:07.680
+And this year, we've experimented
+
+19:07.680 --> 19:09.280
+with having two tracks, which I think
+
+19:09.280 --> 19:12.280
+has turned out pretty well, pretty great.
+
+19:12.280 --> 19:15.600
+Because we don't have to try to squeeze in all the talks
+
+19:15.600 --> 19:19.080
+so tightly and be able to give proper Q&A time,
+
+19:19.080 --> 19:20.960
+like this one, I think, which is pretty great.
+
+19:20.960 --> 19:23.280
+So yeah, very glad to hear and see it.
+
+19:27.400 --> 19:33.400
+Yeah, and maybe I should mention now
+
+19:33.400 --> 19:41.320
+that I know that the E-Shell talk is coming up by Howard,
+
+19:41.320 --> 19:45.880
+that I discovered there is a kind of a bug
+
+19:45.880 --> 19:50.320
+in the detached implementation.
+
+19:50.320 --> 19:56.320
+So it doesn't handle properly the way E-Shell
+
+19:56.320 --> 20:07.040
+seems to communicate when you quote some text in a shell
+
+20:07.040 --> 20:07.920
+command.
+
+20:07.920 --> 20:11.480
+If you have been using quotes, it
+
+20:11.480 --> 20:14.840
+seems to be added as text properties that
+
+20:14.840 --> 20:16.240
+gets into detached.
+
+20:16.240 --> 20:20.040
+And I didn't know about that, but detached
+
+20:20.040 --> 20:22.080
+is not picking that up.
+
+20:22.080 --> 20:28.040
+So if you try to run something similar to Echo
+
+20:28.040 --> 20:33.960
+and quotation marks, Niklas, then yeah, it will not
+
+20:33.960 --> 20:35.360
+run it with quotation marks.
+
+20:35.360 --> 20:38.200
+So I guess for Echo, it might work,
+
+20:38.200 --> 20:42.280
+but other commands, it can fail.
+
+20:42.280 --> 20:45.760
+So just be aware about that.
+
+20:45.760 --> 20:49.360
+I guess that's on the priority list to fix.
+
+20:49.360 --> 20:50.280
+Interesting.
+
+20:50.280 --> 20:51.960
+Yeah, for sure.
+
+20:51.960 --> 20:54.720
+I guess folks can look forward to that getting hopefully fixed
+
+20:54.720 --> 20:59.080
+in the near future or at some point.
+
+20:59.080 --> 21:05.640
+Yeah, and I could add that maybe something
+
+21:05.640 --> 21:15.240
+that is in between this request for persistent sessions
+
+21:15.240 --> 21:20.040
+is that currently, you can use detached in a way
+
+21:20.040 --> 21:23.360
+so it creates like it runs the session.
+
+21:23.360 --> 21:28.400
+And once that finish, you use its callback
+
+21:28.400 --> 21:32.920
+to generate a new session, which runs some other command.
+
+21:32.920 --> 21:41.240
+So you can chain detached sessions that way.
+
+21:41.240 --> 21:47.680
+I wanted to improve on how that has been implemented
+
+21:47.680 --> 21:55.040
+so that you can more easily start these changed sessions
+
+21:55.040 --> 21:58.520
+and that they would show up in the user interface.
+
+21:58.520 --> 22:05.120
+And maybe if you rerun the top of the chain,
+
+22:05.120 --> 22:12.720
+it will actually start all these sessions that way.
+
+22:12.720 --> 22:16.680
+I have some use cases personally where
+
+22:16.680 --> 22:22.200
+for the time being, before running an executable,
+
+22:22.200 --> 22:24.920
+I actually need to run a different build command
+
+22:24.920 --> 22:27.160
+than I normally do.
+
+22:27.160 --> 22:32.880
+And I keep forgetting that, and then that fails.
+
+22:32.880 --> 22:35.960
+And it would be great to just be able to.
+
+22:35.960 --> 22:40.440
+I mean, you could always have that first command
+
+22:40.440 --> 22:48.240
+and then and and the other one, but it doesn't look as nice.
+
+22:48.240 --> 22:53.960
+And it would be nice to be able to see that, OK, this has been
+
+22:53.960 --> 22:57.720
+this is currently running, but in the next once that's
+
+22:57.720 --> 23:02.080
+finished, it will keep on running this one.
+
+23:02.080 --> 23:05.440
+So that's something I plan to add support for.
+
+23:05.440 --> 23:09.360
+It sounds good.
+
+23:09.360 --> 23:10.120
+That would be nice.
+
+23:14.080 --> 23:17.200
+Yeah, I would like that as well.
+
+23:17.200 --> 23:21.360
+So I have an incentive.
+
+23:21.360 --> 23:41.720
+Yeah, also not to completely derail this,
+
+23:41.720 --> 23:45.120
+but I mean, I don't think there are any questions as of now.
+
+23:45.120 --> 23:46.800
+So I can maybe mention this.
+
+23:46.800 --> 23:48.320
+Someone pinged me on IRC.
+
+23:48.320 --> 23:50.640
+Well, someone, Shoushin, good friend.
+
+23:50.640 --> 23:53.920
+And the creator, actually, of the musics
+
+23:53.920 --> 23:56.400
+that we've been using at Emacs Conf between for our lunch
+
+23:56.400 --> 23:58.880
+breaks and here and there, he mentioned
+
+23:58.880 --> 24:01.080
+that he likes this FSF shirt.
+
+24:03.960 --> 24:05.720
+Yeah, it's nice.
+
+24:05.720 --> 24:06.200
+Thanks.
+
+24:06.200 --> 24:10.120
+Yeah, it's I think from a year or so ago.
+
+24:10.120 --> 24:14.200
+It was put up for FSF's 35th birthday.
+
+24:14.200 --> 24:17.160
+And yeah, it's also what it says, FSF 35.
+
+24:17.160 --> 24:20.280
+Yeah, I'm not sure if it's still available on their shop,
+
+24:20.280 --> 24:22.360
+but yeah, you might be able to find it there.
+
+24:25.880 --> 24:27.160
+Nice.
+
+24:27.160 --> 24:31.080
+So they have their own shop?
+
+24:31.080 --> 24:32.000
+Yeah, so there is.
+
+24:32.000 --> 24:33.520
+You can buy merch or?
+
+24:33.520 --> 24:34.480
+Yeah, exactly.
+
+24:34.480 --> 24:37.080
+There is shop.fsf.org, and they have
+
+24:37.080 --> 24:41.880
+a bunch of different goodies and things, merchandise.
+
+24:41.880 --> 24:44.440
+They have shirts like this one, but they also
+
+24:44.440 --> 24:45.920
+have a lot of other stuff.
+
+24:45.920 --> 24:47.960
+They have this one, but they also
+
+24:47.960 --> 24:51.200
+sell things like printed versions of the Emacs user
+
+24:51.200 --> 24:54.840
+manual, which is particularly relevant for us.
+
+24:54.840 --> 24:57.680
+Yeah, and Emacs stickers.
+
+24:57.680 --> 24:59.280
+I think also sell pins and such.
+
+24:59.280 --> 25:02.280
+So yeah, I mean, if you are interested in Emacs
+
+25:02.280 --> 25:06.200
+or new on FSF, it might be worth checking out.
+
+25:06.200 --> 25:08.680
+Yeah, thanks for the tip.
+
+25:08.680 --> 25:11.360
+Yeah.
+
+25:11.360 --> 25:14.520
+Cool, and I think we have about one more minute of live Q&A
+
+25:14.520 --> 25:17.880
+time if folks have any questions,
+
+25:17.880 --> 25:23.520
+any last-minute ones, you're welcome to send it in.
+
+25:23.520 --> 25:26.880
+I guess there is, uh-huh.
+
+25:26.880 --> 25:32.240
+OK, yeah, this one got added from Karfik.
+
+25:32.240 --> 25:32.740
+Yeah.
+
+25:38.600 --> 25:41.560
+Yeah, otherwise, if there's no further questions,
+
+25:41.560 --> 25:44.200
+maybe we wrap it up.
+
+25:44.200 --> 25:45.320
+Sure, sounds good.
+
+25:45.320 --> 25:46.880
+Yeah, I don't see any new questions.
+
+25:46.880 --> 25:49.560
+So yeah, thanks again, Nicholas, for the great talk
+
+25:49.560 --> 25:52.640
+and for sticking around and doing the live Q&A.
+
+25:52.640 --> 25:54.360
+It's much appreciated, and look forward
+
+25:54.360 --> 26:01.080
+to seeing the upcoming developments in Detached.
+
+26:01.080 --> 26:03.400
+Thank you, and thanks for having me.
+
+26:03.400 --> 26:06.760
+Cheers, very glad to see you around.
+
+26:06.760 --> 26:15.840
+See ya.
+
diff --git a/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main--chapters.vtt b/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main--chapters.vtt
new file mode 100644
index 00000000..63f883ff
--- /dev/null
+++ b/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main--chapters.vtt
@@ -0,0 +1,34 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:27.120
+Intro
+
+00:00:27.120 --> 00:01:15.800
+The problem
+
+00:01:15.800 --> 00:02:30.840
+My solution: detached
+
+00:02:30.840 --> 00:03:30.800
+Shell
+
+00:03:30.800 --> 00:04:27.754
+Compile
+
+00:04:27.854 --> 00:05:21.440
+Detached list sessions
+
+00:05:21.440 --> 00:06:07.080
+Narrow criteria
+
+00:06:07.080 --> 00:06:34.040
+Diff sessions
+
+00:06:34.040 --> 00:07:04.421
+Rich interface with properties
+
+00:07:04.521 --> 00:07:44.988
+Annotation
+
+00:07:45.088 --> 00:10:10.760
+Searching through sessions
diff --git a/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.vtt b/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.vtt
new file mode 100644
index 00000000..09c4a9df
--- /dev/null
+++ b/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.vtt
@@ -0,0 +1,502 @@
+WEBVTT captioned by anush
+
+00:00:00.000 --> 00:00:04.354
+Hello, everyone! Welcome to my talk,
+
+00:00:04.454 --> 00:00:07.221
+"Getting detached from Emacs".
+
+00:00:07.321 --> 00:00:09.720
+When I started to use Emacs,
+
+00:00:09.720 --> 00:00:12.920
+I quickly gravitated towards using it
+
+00:00:12.920 --> 00:00:15.000
+as much as I could.
+
+00:00:15.000 --> 00:00:17.880
+Magit, Org, Dired,
+
+00:00:17.880 --> 00:00:21.360
+a lot of new possibilities opened up.
+
+00:00:21.360 --> 00:00:23.280
+However, there was a workflow
+
+00:00:23.280 --> 00:00:27.120
+that was difficult for me to replace.
+
+00:00:27.120 --> 00:00:30.120
+The problem for me was running shell commands
+
+00:00:30.120 --> 00:00:32.560
+in sub-processes of Emacs,
+
+00:00:32.560 --> 00:00:34.880
+which in some situations led me to stick to
+
+00:00:34.880 --> 00:00:38.000
+using an external terminal.
+
+00:00:38.000 --> 00:00:39.588
+These situations,
+
+00:00:39.688 --> 00:00:43.254
+often revolved around long-running shell commands,
+
+00:00:43.354 --> 00:00:46.054
+either on my local machine
+
+00:00:46.154 --> 00:00:48.600
+or on a remote host.
+
+00:00:48.600 --> 00:00:50.240
+When I was on a remote host,
+
+00:00:50.240 --> 00:00:52.800
+I would also rely on using the program tmux
+
+00:00:52.800 --> 00:00:57.280
+to be able to detach from the remote process.
+
+00:00:57.280 --> 00:00:59.521
+My main concern at the time
+
+00:00:59.621 --> 00:01:01.854
+was that I didn't want to having to avoid
+
+00:01:01.954 --> 00:01:03.440
+restarting Emacs,
+
+00:01:03.440 --> 00:01:07.800
+because I needed to wait for a process to complete.
+
+00:01:07.800 --> 00:01:11.200
+However, there was of course a lot of things
+
+00:01:11.200 --> 00:01:15.800
+I was missing out on by not using Emacs.
+
+00:01:15.800 --> 00:01:19.760
+Therefore, my solution to resolving
+
+00:01:19.760 --> 00:01:22.840
+the issue of occasionally having to leave Emacs
+
+00:01:22.840 --> 00:01:26.188
+led me down the path of developing the package
+
+00:01:26.188 --> 00:01:28.221
+Detached.
+
+00:01:28.321 --> 00:01:31.160
+The package allows Emacs to delegate
+
+00:01:31.160 --> 00:01:33.640
+the responsibility of creating processes
+
+00:01:33.640 --> 00:01:36.840
+to the program dtach.
+
+00:01:36.840 --> 00:01:39.021
+It also makes sure to write
+
+00:01:39.121 --> 00:01:44.321
+the output of the process to a file,
+
+00:01:44.421 --> 00:01:48.154
+which we will see later on how that is being used.
+
+00:01:48.254 --> 00:01:50.800
+The package makes Emacs capable of
+
+00:01:50.800 --> 00:01:53.120
+attaching to these processes
+
+00:01:53.120 --> 00:01:55.280
+as well as managing them.
+
+00:01:55.280 --> 00:01:58.880
+In the package, each process is called a session,
+
+00:01:58.880 --> 00:02:01.040
+and inside of Emacs that is just
+
+00:02:01.040 --> 00:02:02.560
+an object with properties
+
+00:02:02.560 --> 00:02:04.588
+such as what command is being run,
+
+00:02:04.688 --> 00:02:06.720
+what working directory is used,
+
+00:02:06.720 --> 00:02:10.240
+where the output is stored, etc.
+
+00:02:10.240 --> 00:02:12.480
+The important aspect is also that
+
+00:02:12.480 --> 00:02:16.840
+these objects are being persistent,
+
+00:02:16.840 --> 00:02:20.121
+so they are stored over time.
+
+00:02:20.221 --> 00:02:22.920
+Today, I'm going to walk you through
+
+00:02:22.920 --> 00:02:26.054
+how I use the package and what advantages
+
+00:02:26.154 --> 00:02:30.840
+there are of treating processes like text.
+
+00:02:30.840 --> 00:02:35.720
+I'm going to start by opening up M-x shell,
+
+00:02:35.720 --> 00:02:40.288
+and I will run a command
+
+00:02:40.388 --> 00:02:46.920
+to update my package manager.
+
+00:02:46.920 --> 00:02:48.254
+Instead of pressing return,
+
+00:02:48.354 --> 00:02:50.240
+I'll simply press shift return
+
+00:02:50.240 --> 00:02:52.600
+to let Emacs delegate the execution
+
+00:02:52.600 --> 00:02:54.920
+to the dtach program.
+
+00:02:54.920 --> 00:02:57.600
+Emacs will immediately attach itself to the process,
+
+00:02:57.600 --> 00:03:00.960
+and we therefore don't perceive any difference
+
+00:03:00.960 --> 00:03:04.480
+from when running the command as a subprocess.
+
+00:03:04.480 --> 00:03:06.488
+We now have the option though
+
+00:03:06.588 --> 00:03:09.800
+to detach from the session,
+
+00:03:09.800 --> 00:03:12.080
+and later on we can of course
+
+00:03:12.080 --> 00:03:17.054
+reattach Emacs to the session.
+
+00:03:17.154 --> 00:03:20.421
+For me, this addresses the core
+
+00:03:20.521 --> 00:03:23.800
+of the problem that I had.
+
+00:03:23.800 --> 00:03:25.040
+But let’s see what’s more
+
+00:03:25.040 --> 00:03:30.800
+the new workflow inside of Emacs can bring.
+
+00:03:30.800 --> 00:03:35.720
+The package supports multiple user interfaces
+
+00:03:35.720 --> 00:03:39.840
+such as Eshell and Compile.
+
+00:03:39.840 --> 00:03:43.360
+I will therefore switch to the Detached project,
+
+00:03:43.360 --> 00:03:49.440
+and I will run the build command that I use.
+
+00:03:49.440 --> 00:03:54.040
+I will run it with detached-compile
+
+00:03:54.040 --> 00:03:55.800
+with the difference that
+
+00:03:55.800 --> 00:03:59.800
+I can detach from the compilation.
+
+00:03:59.800 --> 00:04:05.000
+One benefit of this new workflow is that
+
+00:04:05.000 --> 00:04:08.680
+I can get a system notification shown up here
+
+00:04:08.680 --> 00:04:10.760
+once a session has finished.
+
+00:04:10.760 --> 00:04:15.520
+Previously, I was either forced to have
+
+00:04:15.520 --> 00:04:19.040
+the terminal open so I could see it or hiding it,
+
+00:04:19.040 --> 00:04:27.754
+but then risking having forgotten it.
+
+00:04:27.854 --> 00:04:32.560
+How do we then see the output of a session?
+
+00:04:32.560 --> 00:04:36.788
+Get the detached-list-sessions command,
+
+00:04:36.888 --> 00:04:42.854
+and here we see
+
+00:04:42.954 --> 00:04:45.600
+the command that we just built,
+
+00:04:45.600 --> 00:04:48.440
+and we see the guix pull with an asterisk
+
+00:04:48.440 --> 00:04:54.480
+indicating that it is continuously running.
+
+00:04:54.480 --> 00:05:01.421
+If I press enter,
+
+00:05:01.521 --> 00:05:04.440
+we will get the output of the session here.
+
+00:05:04.440 --> 00:05:07.200
+And since it was run using compile,
+
+00:05:07.200 --> 00:05:11.720
+we also have compilation mode enabled here,
+
+00:05:11.720 --> 00:05:14.188
+so we could navigate between
+
+00:05:14.288 --> 00:05:17.160
+potential warnings or errors.
+
+00:05:17.160 --> 00:05:21.440
+And we see that there is a warning here.
+
+00:05:21.440 --> 00:05:26.621
+One thing that
+
+00:05:26.721 --> 00:05:28.920
+I have prepared here is that
+
+00:05:28.920 --> 00:05:32.240
+if I open up the user interface,
+
+00:05:32.240 --> 00:05:35.760
+we only see two sessions,
+
+00:05:35.760 --> 00:05:38.988
+but that is because we applied a filter here.
+
+00:05:39.088 --> 00:05:43.160
+So, we have actually the only sessions
+
+00:05:43.160 --> 00:05:46.000
+that are created within the last 12 hours
+
+00:05:46.000 --> 00:05:47.360
+and that are considered unique.
+
+00:05:47.360 --> 00:05:50.600
+So, if I remove the uniqueness,
+
+00:05:50.600 --> 00:05:57.040
+we also see that we have a previous build
+
+00:05:57.040 --> 00:05:59.280
+running on the main branch.
+
+00:05:59.280 --> 00:06:02.760
+So, I think that's typically normal
+
+00:06:02.760 --> 00:06:07.080
+that you might have that.
+
+00:06:07.080 --> 00:06:10.920
+And since the sessions can be considered text,
+
+00:06:10.920 --> 00:06:14.760
+we can just mark these two and check,
+
+00:06:14.760 --> 00:06:18.880
+does this warning exist on the main branch or not?
+
+00:06:18.880 --> 00:06:22.720
+So, we can just diff these ones
+
+00:06:22.720 --> 00:06:27.454
+and we see that the warning is only present
+
+00:06:27.554 --> 00:06:34.040
+on the emacsconf branch.
+
+00:06:34.040 --> 00:06:37.520
+Now, another benefit, in my opinion,
+
+00:06:37.520 --> 00:06:41.840
+of the new way of working is that
+
+00:06:41.840 --> 00:06:43.240
+I have these properties being displayed
+
+00:06:43.240 --> 00:06:45.321
+in the user interface.
+
+00:06:45.421 --> 00:06:48.960
+I can quickly see which commands are still running,
+
+00:06:48.960 --> 00:06:51.360
+what hosts they are running on,
+
+00:06:51.360 --> 00:06:53.388
+where they are running,
+
+00:06:53.488 --> 00:06:58.121
+and for how long they have been running.
+
+00:06:58.221 --> 00:07:00.321
+And if they have run,
+
+00:07:00.421 --> 00:07:04.421
+how long did it take?
+
+00:07:04.521 --> 00:07:06.880
+Occasionally, though, there might be
+
+00:07:06.880 --> 00:07:16.880
+even more input needed to distinguish sessions.
+
+00:07:16.880 --> 00:07:19.600
+So, what I typically do then is
+
+00:07:19.600 --> 00:07:22.200
+press A to annotate the session,
+
+00:07:22.200 --> 00:07:28.988
+I would add a "Warning found at emacsconf"
+
+00:07:29.088 --> 00:07:32.854
+And then it will show up this annotation
+
+00:07:32.954 --> 00:07:44.988
+in the echo area when I select the session.
+
+00:07:45.088 --> 00:07:48.080
+Another great improvement of using these sessions
+
+00:07:48.080 --> 00:07:52.640
+and consider them being text is,
+
+00:07:52.640 --> 00:07:57.321
+now we also see the guix pull completed here.
+
+00:07:57.421 --> 00:08:00.921
+Then we can also select and see that, okay,
+
+00:08:01.021 --> 00:08:08.600
+there is a lot of updates in this command,
+
+00:08:08.600 --> 00:08:10.160
+but let's not look at it now.
+
+00:08:10.160 --> 00:08:17.554
+Let's instead remember that
+
+00:08:17.654 --> 00:08:19.840
+previously last week
+
+00:08:19.840 --> 00:08:21.640
+when I ran a guix pull,
+
+00:08:21.640 --> 00:08:27.680
+I saw an Emacs package that looks interesting.
+
+00:08:27.680 --> 00:08:30.040
+I rather don't remember its full name,
+
+00:08:30.040 --> 00:08:32.720
+but it has something to do with collection.
+
+00:08:32.720 --> 00:08:38.840
+So, what I then can do is
+
+00:08:38.840 --> 00:08:42.280
+remove the 12 hour narrowing criteria,
+
+00:08:42.280 --> 00:08:47.680
+and we can see here I got sessions ranging back
+
+00:08:47.680 --> 00:08:51.040
+even to 28th of October.
+
+00:08:51.040 --> 00:08:55.600
+Since these are just to be considered text,
+
+00:08:55.600 --> 00:08:58.654
+I can--
+
+00:08:58.754 --> 00:09:00.320
+now let's first narrow the sessions
+
+00:09:00.320 --> 00:09:05.188
+to only show the ones that run guix pull.
+
+00:09:05.288 --> 00:09:08.440
+Then I would narrow based on the output
+
+00:09:08.440 --> 00:09:11.280
+containing a regular expression.
+
+00:09:11.280 --> 00:09:14.400
+So, I remember it was something with collection.
+
+00:09:14.400 --> 00:09:19.988
+And we got one hit.
+
+00:09:20.088 --> 00:09:24.088
+Here it should be something with collection.
+
+00:09:24.188 --> 00:09:29.521
+It was emacs-flymake-collection.
+
+00:09:29.621 --> 00:09:34.721
+This is something that is a
+
+00:09:34.821 --> 00:09:38.400
+very nice feature to have.
+
+00:09:38.400 --> 00:09:42.160
+It doesn't create any overhead
+
+00:09:42.160 --> 00:09:45.280
+of having these old sessions lying around
+
+00:09:45.280 --> 00:09:47.400
+and occasionally, it can be interesting
+
+00:09:47.400 --> 00:09:49.680
+to search through them as well.
+
+00:09:49.680 --> 00:09:55.000
+So, for me, this is another example of
+
+00:09:55.000 --> 00:09:59.954
+when bringing workflows into Emacs,
+
+00:10:00.054 --> 00:10:05.021
+it often opens up new exciting possibilities.
+
+00:10:05.121 --> 00:10:10.760
+Thanks a lot for listening.
diff --git a/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main--chapters.vtt b/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main--chapters.vtt
new file mode 100644
index 00000000..be063a36
--- /dev/null
+++ b/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main--chapters.vtt
@@ -0,0 +1,53 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:00:19.320
+Introduction
+
+8
+00:00:19.320 --> 00:00:42.400
+Emacs 29 release cycle
+
+16
+00:00:42.400 --> 00:01:29.080
+Overlays
+
+36
+00:01:29.080 --> 00:01:46.480
+Eglot
+
+42
+00:01:46.480 --> 00:02:30.840
+Tree-sitter
+
+61
+00:02:30.840 --> 00:03:35.240
+Very long lines
+
+85
+00:03:35.240 --> 00:03:50.080
+SQLite
+
+90
+00:03:50.080 --> 00:04:11.320
+XInput
+
+97
+00:04:11.320 --> 00:04:24.640
+Pure GTK build
+
+101
+00:04:24.640 --> 00:04:31.400
+Drag and drop
+
+103
+00:04:31.400 --> 00:04:35.240
+Double-buffering on Microsoft Windows
+
+104
+00:04:35.240 --> 00:05:00.080
+Emoji input
+
+113
+00:05:00.080 --> 00:05:15.280
+End
diff --git a/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.vtt b/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.vtt
new file mode 100644
index 00000000..a55331b2
--- /dev/null
+++ b/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.vtt
@@ -0,0 +1,473 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:00:05.320
+Hello, it's time for another Emacs development update.
+
+2
+00:00:05.320 --> 00:00:07.800
+I want to thank the organizers of EmacsConf
+
+3
+00:00:07.800 --> 00:00:10.160
+for putting this together
+
+4
+00:00:10.160 --> 00:00:12.280
+and also the maintainers of Emacs
+
+5
+00:00:12.280 --> 00:00:14.240
+with a special thanks to Eli Zaretskii.
+
+6
+00:00:14.240 --> 00:00:16.560
+It's really he who gave me this information
+
+7
+00:00:16.560 --> 00:00:19.320
+so that I could pass it along to you.
+
+8
+00:00:19.320 --> 00:00:21.720
+The main thing to discuss this time
+
+9
+00:00:21.720 --> 00:00:25.880
+with regard to what's been going on with Emacs is Emacs 29.
+
+10
+00:00:25.880 --> 00:00:29.840
+The release cycle for Emacs 29 should begin in December
+
+11
+00:00:29.840 --> 00:00:32.720
+when a branch will be cut and the release work will start.
+
+12
+00:00:32.720 --> 00:00:36.640
+We should be seeing Emacs 29 coming out fairly soon.
+
+13
+00:00:36.640 --> 00:00:38.120
+Here's just a brief overview
+
+14
+00:00:38.120 --> 00:00:39.680
+of some of the things to look forward to
+
+15
+00:00:39.680 --> 00:00:42.400
+coming up in Emacs 29.
+
+16
+00:00:42.400 --> 00:00:45.680
+Overlays have been re-implemented.
+
+17
+00:00:45.680 --> 00:00:47.240
+If you haven't used them before,
+
+18
+00:00:47.240 --> 00:00:51.040
+overlays are a way to apply a set of properties
+
+19
+00:00:51.040 --> 00:00:53.680
+over a range of text so that
+
+20
+00:00:53.680 --> 00:00:55.840
+you can have things like mouse clicks
+
+21
+00:00:55.840 --> 00:00:57.920
+take on different behavior
+
+22
+00:00:57.920 --> 00:00:59.520
+depending on where it happens in the text.
+
+23
+00:00:59.520 --> 00:01:01.720
+This is different than text properties
+
+24
+00:01:01.720 --> 00:01:04.080
+which associate the properties with the text itself.
+
+25
+00:01:04.080 --> 00:01:07.200
+Overlays do not alter the text in any way
+
+26
+00:01:07.200 --> 00:01:09.320
+and they simply, as the name suggests,
+
+27
+00:01:09.320 --> 00:01:10.920
+overlay on the buffer.
+
+28
+00:01:10.920 --> 00:01:14.040
+Now previously, overlays were implemented as linear lists
+
+29
+00:01:14.040 --> 00:01:15.800
+which got very slow when there were
+
+30
+00:01:15.800 --> 00:01:17.840
+a lot of overlays in a buffer.
+
+31
+00:01:17.840 --> 00:01:19.880
+Now they're being re-implemented as trees,
+
+32
+00:01:19.880 --> 00:01:21.880
+so that searching should be very fast, and
+
+33
+00:01:21.880 --> 00:01:24.400
+in fact, comparable to text properties.
+
+34
+00:01:24.400 --> 00:01:26.520
+This is already on the master branch
+
+35
+00:01:26.520 --> 00:01:29.080
+and (more or less) is ready for release.
+
+36
+00:01:29.080 --> 00:01:32.200
+Eglot has been ported into Emacs.
+
+37
+00:01:32.200 --> 00:01:35.560
+Eglot is an LSP [Language Server Protocol] client for Emacs,
+
+38
+00:01:35.560 --> 00:01:38.480
+one of the two that are often used.
+
+39
+00:01:38.480 --> 00:01:40.840
+But now it's going to be included in core,
+
+40
+00:01:40.840 --> 00:01:42.800
+so it's considered official
+
+41
+00:01:42.800 --> 00:01:46.480
+and will be well integrated with other Emacs features.
+
+42
+00:01:46.480 --> 00:01:48.720
+There's going to be a Tree-sitter library.
+
+43
+00:01:48.720 --> 00:01:53.200
+Tree-sitter is a way of building fast incremental parsers.
+
+44
+00:01:53.200 --> 00:01:56.040
+There's a website on Tree-sitter if you Google for that.
+
+45
+00:01:56.040 --> 00:01:57.760
+This can be used for various features,
+
+46
+00:01:57.760 --> 00:01:59.760
+but first and foremost, it'll be used
+
+47
+00:01:59.760 --> 00:02:02.920
+for fontification and indentation in Emacs.
+
+48
+00:02:02.920 --> 00:02:05.600
+Instead of heuristics and regular expressions,
+
+49
+00:02:05.600 --> 00:02:07.400
+you can now build your fontifications
+
+50
+00:02:07.400 --> 00:02:08.720
+based on a parse tree.
+
+51
+00:02:08.720 --> 00:02:10.640
+There's a branch now that supports this
+
+52
+00:02:10.640 --> 00:02:13.600
+for several modes already, like Python, TypeScript,
+
+53
+00:02:13.600 --> 00:02:15.080
+and JavaScript.
+
+54
+00:02:15.080 --> 00:02:18.160
+We don't have anyone yet working on it for C mode
+
+55
+00:02:18.160 --> 00:02:20.480
+but Eli has challenged whether anyone
+
+56
+00:02:20.480 --> 00:02:21.960
+in the community is interested.
+
+57
+00:02:21.960 --> 00:02:25.960
+He would love to see Tree-sitter support added for C mode,
+
+58
+00:02:25.960 --> 00:02:27.880
+because this has been quite slow
+
+59
+00:02:27.880 --> 00:02:29.640
+when dealing with very, very large files
+
+60
+00:02:29.640 --> 00:02:30.840
+and Tree-sitter should help that.
+
+61
+00:02:30.840 --> 00:02:34.320
+There have been significant improvements
+
+62
+00:02:34.320 --> 00:02:36.560
+in dealing with very long lines.
+
+63
+00:02:36.560 --> 00:02:38.160
+This is something that has been
+
+64
+00:02:38.160 --> 00:02:40.480
+a long time frequent complaint.
+
+65
+00:02:40.480 --> 00:02:42.840
+Emacs becomes rather unusable
+
+66
+00:02:42.840 --> 00:02:45.560
+if you open a giant file that's a single long line.
+
+67
+00:02:45.560 --> 00:02:49.560
+Anyone who's ever tried to open a 30 megabyte JSON file
+
+68
+00:02:49.560 --> 00:02:52.200
+that's all on one line will know this pain.
+
+69
+00:02:52.200 --> 00:02:55.960
+Some modes, however, will have to adapt to this change,
+
+70
+00:02:55.960 --> 00:02:58.320
+because sometimes access to the whole buffer
+
+71
+00:02:58.320 --> 00:03:00.480
+is now forcefully restricted.
+
+72
+00:03:00.480 --> 00:03:04.400
+If the mode requires access to the entire buffer
+
+73
+00:03:04.400 --> 00:03:07.960
+at all times to work, then the developer of that mode
+
+74
+00:03:07.960 --> 00:03:10.240
+will need to devise some simplifications
+
+75
+00:03:10.240 --> 00:03:13.160
+so that they don't require that complete access.
+
+76
+00:03:13.160 --> 00:03:15.760
+For example, if a mode used to go way back
+
+77
+00:03:15.760 --> 00:03:16.880
+to the beginning of the buffer
+
+78
+00:03:16.880 --> 00:03:19.520
+in order to determine if there's an unbalanced parenthesis,
+
+79
+00:03:19.520 --> 00:03:23.160
+this won't work in the new long lines support mode,
+
+80
+00:03:23.160 --> 00:03:25.640
+because the entire buffer is not always available.
+
+81
+00:03:25.640 --> 00:03:27.680
+Emacs is sort of doing some
+
+82
+00:03:27.680 --> 00:03:29.920
+restricting of the buffer heuristically
+
+83
+00:03:29.920 --> 00:03:32.200
+in order to keep the visible range working
+
+84
+00:03:32.200 --> 00:03:35.240
+very, very quickly now.
+
+85
+00:03:35.240 --> 00:03:39.040
+Emacs can now build directly with SQLite.
+
+86
+00:03:39.040 --> 00:03:42.360
+This means that SQLite databases
+
+87
+00:03:42.360 --> 00:03:44.840
+can be directly accessible from Emacs.
+
+88
+00:03:44.840 --> 00:03:47.360
+Should be nice for anyone whose mode wants to
+
+89
+00:03:47.360 --> 00:03:50.080
+cache or store some queryable data.
+
+90
+00:03:50.080 --> 00:03:54.960
+The XInput extension is now up to version 2.
+
+91
+00:03:54.960 --> 00:03:58.160
+There are many extensions in this specification.
+
+92
+00:03:58.160 --> 00:03:59.600
+From the user's point of view,
+
+93
+00:03:59.600 --> 00:04:02.920
+it enables things like smooth scrolling and touch devices.
+
+94
+00:04:02.920 --> 00:04:06.320
+Emacs will now use this by default on all systems
+
+95
+00:04:06.320 --> 00:04:08.360
+where the library is installed.
+
+96
+00:04:08.360 --> 00:04:11.320
+It should be on every modern system that uses X.
+
+97
+00:04:11.320 --> 00:04:15.560
+There's also a pure GTK build in Emacs 29.
+
+98
+00:04:15.560 --> 00:04:17.560
+The purpose of this is to allow Emacs
+
+99
+00:04:17.560 --> 00:04:21.160
+on systems without X, such as Wayland or Broadway,
+
+100
+00:04:21.160 --> 00:04:24.640
+to be able to have a graphical build of Emacs.
+
+101
+00:04:24.640 --> 00:04:27.280
+There's also lots of improvements to drag and drop
+
+102
+00:04:27.280 --> 00:04:31.400
+on X systems, for people who like drag and drop.
+
+103
+00:04:31.400 --> 00:04:35.240
+And there's support for double buffering on Microsoft Windows.
+
+104
+00:04:35.240 --> 00:04:38.480
+The last of the headline features
+
+105
+00:04:38.480 --> 00:04:41.640
+coming for Emacs 29 is emoji input.
+
+106
+00:04:41.640 --> 00:04:43.520
+So there will now be a prefix key,
+
+107
+00:04:43.520 --> 00:04:47.320
+C-x 8 e for emoji input,
+
+108
+00:04:47.320 --> 00:04:50.240
+along with several new commands to insert emoji
+
+109
+00:04:50.240 --> 00:04:52.480
+by various forms of shorthand.
+
+110
+00:04:52.480 --> 00:04:54.360
+There will even be an input method
+
+111
+00:04:54.360 --> 00:04:57.600
+where you can write the plain English names of emojis
+
+112
+00:04:57.600 --> 00:05:00.080
+and have the symbol inserted.
+
+113
+00:05:00.080 --> 00:05:02.160
+So that rounds out some of the features
+
+114
+00:05:02.160 --> 00:05:03.680
+coming up for Emacs 29.
+
+115
+00:05:03.680 --> 00:05:05.680
+Sounds like an exciting release
+
+116
+00:05:05.680 --> 00:05:07.360
+and it should be headed your way soon.
+
+117
+00:05:07.360 --> 00:05:09.880
+I hope everybody has fun at the conference
+
+118
+00:05:09.880 --> 00:05:15.280
+and enjoy yourselves.
diff --git a/2022/captions/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.vtt b/2022/captions/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.vtt
new file mode 100644
index 00000000..1e7ab934
--- /dev/null
+++ b/2022/captions/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.vtt
@@ -0,0 +1,489 @@
+WEBVTT captioned by eduardo
+Kind: captions:
+Language: en-GB
+
+00:00:00.000 --> 00:00:04.000
+Hi! My name is Eduardo Ochs. I'm the author
+
+00:00:04.000 --> 00:00:06.000
+of an Emacs package called eev, and the name
+
+00:00:06.000 --> 00:00:09.000
+of this presentation is: "Bidirectional links
+
+00:00:09.000 --> 00:00:10.000
+in eev".
+
+00:00:10.000 --> 00:00:13.000
+Let me present things in a weird order,
+
+00:00:13.000 --> 00:00:16.000
+starting by the new feature, and then I'm
+
+00:00:16.000 --> 00:00:20.000
+going to explain the whole context.
+
+00:00:20.000 --> 00:00:22.000
+One of the main features that we are
+
+00:00:22.000 --> 00:00:24.000
+going to see here is this function here,
+
+00:00:24.000 --> 00:00:27.000
+M-x kla, and kla is a mnemonic for "kill
+
+00:00:27.000 --> 00:00:31.000
+Link to Anchor". Let me explain... let me
+
+00:00:31.000 --> 00:00:33.000
+demonstrate how it works. This thing here
+
+00:00:33.000 --> 00:00:36.000
+with the green angle brackets is an
+
+00:00:36.000 --> 00:00:40.000
+anchor, this thing between the green
+
+00:00:40.000 --> 00:00:42.000
+angle brackets is a tag of an
+
+00:00:42.000 --> 00:00:46.000
+anchor, and if I type M-x kla here
+
+00:00:46.000 --> 00:00:49.000
+it highlights this tag for a second and
+
+00:00:49.000 --> 00:00:52.000
+it says "Copied to the kill ring: blah
+
+00:00:52.000 --> 00:00:54.000
+blah blah..." and this thing here is a link.
+
+00:00:54.000 --> 00:00:57.000
+I can insert the link here, I
+
+00:00:57.000 --> 00:01:00.000
+can insert the link in my notes...
+
+00:01:00.000 --> 00:01:03.000
+and if I execute this thing this link
+
+00:01:03.000 --> 00:01:10.000
+here it goes to this anchor in this file.
+
+00:01:10.000 --> 00:01:12.000
+If you have a recent version of eev
+
+00:01:12.000 --> 00:01:13.000
+installed then trying this feature
+
+00:01:13.000 --> 00:01:15.000
+should be very easy...
+
+00:01:15.000 --> 00:01:18.000
+you just need to open the this file here,
+
+00:01:18.000 --> 00:01:21.000
+in which everything is defined, and then
+
+00:01:21.000 --> 00:01:23.000
+go to this section at the beginning of
+
+00:01:23.000 --> 00:01:26.000
+the file, and then run the three blocks
+
+00:01:26.000 --> 00:01:28.000
+of tests that are there.
+
+00:01:28.000 --> 00:01:31.000
+This block corresponds roughly to what
+
+00:01:31.000 --> 00:01:33.000
+we have just done...
+
+00:01:33.000 --> 00:01:36.000
+this other block
+
+00:01:36.000 --> 00:01:40.000
+is slightly different because it shows
+
+00:01:40.000 --> 00:01:44.000
+some variants of kla... one is with `f`
+
+00:01:44.000 --> 00:01:48.000
+instead of an `a` here, let me
+
+00:01:48.000 --> 00:01:51.000
+show how it works... if we type
+
+00:01:51.000 --> 00:01:57.000
+`M-x eeklf` or just `M-x klf`
+
+00:01:57.000 --> 00:02:00.000
+we get a link to this file that does not
+
+00:02:00.000 --> 00:02:03.000
+point to an anchor, and if we type
+
+00:02:03.000 --> 00:02:07.000
+`M-x klt` we get another kind of link that
+
+00:02:07.000 --> 00:02:09.000
+is a link to an anchor in the same
+
+00:02:09.000 --> 00:02:11.000
+file...
+
+00:02:11.000 --> 00:02:16.000
+and the third block
+
+00:02:16.000 --> 00:02:18.000
+is more interesting because it lets
+
+00:02:18.000 --> 00:02:20.000
+people create links to files that
+
+00:02:20.000 --> 00:02:23.000
+are elsewhere, and that do not have
+
+00:02:23.000 --> 00:02:25.000
+anchors in them...
+
+00:02:25.000 --> 00:02:29.000
+let me execute this... this will
+
+00:02:29.000 --> 00:02:32.000
+run this sexp here and display the
+
+00:02:32.000 --> 00:02:35.000
+target at the window at the right...
+
+00:02:35.000 --> 00:02:41.000
+this is one of the source files of Emacs.
+
+00:02:41.000 --> 00:02:43.000
+Let's imagine that I want to create a
+
+00:02:43.000 --> 00:02:46.000
+link to this string here... then I can
+
+00:02:46.000 --> 00:02:51.000
+type `M-x klfs`, and this will create a
+
+00:02:51.000 --> 00:02:53.000
+link to a file and to a string in that
+
+00:02:53.000 --> 00:02:56.000
+file. So if I type ENTER here
+
+00:02:56.000 --> 00:02:59.000
+it says: "Copied to the kill ring: ...\
+
+00:02:59.000 --> 00:03:02.000
+and this is a link to this file here,
+
+00:03:02.000 --> 00:03:04.000
+and to the first occurrence of this
+
+00:03:04.000 --> 00:03:10.000
+string in this file.
+
+00:03:10.000 --> 00:03:14.000
+So: how does this work (inside)?...
+
+00:03:14.000 --> 00:03:16.000
+when I was trying to write the documentation
+
+00:03:16.000 --> 00:03:19.000
+of this I tried to write a summary of
+
+00:03:19.000 --> 00:03:21.000
+how the algorithm works, and I failed and
+
+00:03:21.000 --> 00:03:23.000
+I tried again, and I failed again,
+
+00:03:23.000 --> 00:03:26.000
+several times... and then I gave up and I
+
+00:03:26.000 --> 00:03:29.000
+decided to write an intro - a tutorial,
+
+00:03:29.000 --> 00:03:31.000
+this one -
+
+00:03:31.000 --> 00:03:34.000
+that explains everything with lots of
+
+00:03:34.000 --> 00:03:35.000
+details, and with lots of sections
+
+00:03:35.000 --> 00:03:39.000
+with "Try it!"s, that
+
+00:03:39.000 --> 00:03:41.000
+have examples that you you can run to
+
+00:03:41.000 --> 00:03:44.000
+understand things, to examine how some
+
+00:03:44.000 --> 00:03:48.000
+functions work, how the data
+
+00:03:48.000 --> 00:03:51.000
+structures work, and so on...
+
+00:03:51.000 --> 00:03:54.000
+the problem is that sometimes we have
+
+00:03:54.000 --> 00:03:56.000
+several hyperlinks that point to the to
+
+00:03:56.000 --> 00:04:00.000
+the same file. Let me give an example.
+
+00:04:00.000 --> 00:04:04.000
+In the configuration in which I am now,
+
+00:04:04.000 --> 00:04:07.000
+in this file here... the old way of
+
+00:04:07.000 --> 00:04:08.000
+generating hyperlinks to this file
+
+00:04:08.000 --> 00:04:10.000
+with `find-here-links`
+
+00:04:10.000 --> 00:04:13.000
+will generate a temporary buffer
+
+00:04:13.000 --> 00:04:15.000
+like this, and then I would have to
+
+00:04:15.000 --> 00:04:18.000
+choose which one of these hyperlinks I
+
+00:04:18.000 --> 00:04:21.000
+find best, which one I prefer, and then
+
+00:04:21.000 --> 00:04:25.000
+copy it to my notes... so instead
+
+00:04:25.000 --> 00:04:27.000
+of choosing a hyperlink this thing here
+
+00:04:27.000 --> 00:04:30.000
+shows all the options.
+
+00:04:30.000 --> 00:04:34.000
+And in the new way, in `M-x kla`
+
+00:04:34.000 --> 00:04:37.000
+and friends, there's an algorithm that
+
+00:04:37.000 --> 00:04:39.000
+chooses the best short hyperlink by
+
+00:04:39.000 --> 00:04:43.000
+itself, and this algorithm is a bit hard
+
+00:04:43.000 --> 00:04:46.000
+to explain... let me demonstrate it here.
+
+00:04:46.000 --> 00:04:50.000
+Again, we have all these options here, of
+
+00:04:50.000 --> 00:04:51.000
+hyperlinks to this file...
+
+00:04:51.000 --> 00:04:56.000
+and if I type `M-x klf`
+
+00:04:56.000 --> 00:04:58.000
+it chooses one of them.
+
+00:04:58.000 --> 00:05:01.000
+And of course I can copy it to my notes,
+
+00:05:01.000 --> 00:05:02.000
+it's going to work, it's going to point
+
+00:05:02.000 --> 00:05:05.000
+to here... and so on.
+
+00:05:05.000 --> 00:05:08.000
+Well, the title of this presentation was
+
+00:05:08.000 --> 00:05:11.000
+"Bidirectional links with eev"... let me
+
+00:05:11.000 --> 00:05:13.000
+show what I mean by bi-directional
+
+00:05:13.000 --> 00:05:15.000
+hyperlinks, and how we can use this thing
+
+00:05:15.000 --> 00:05:17.000
+to create bidirectional hyperlinks
+
+00:05:17.000 --> 00:05:19.000
+very quickly.
+
+00:05:19.000 --> 00:05:22.000
+I will have to use a smaller font... let
+
+00:05:22.000 --> 00:05:25.000
+me open these two files here. This one at
+
+00:05:25.000 --> 00:05:27.000
+the left is a program in Haskell, and
+
+00:05:27.000 --> 00:05:30.000
+this one is a file with my notes on
+
+00:05:30.000 --> 00:05:31.000
+Haskell.
+
+00:05:31.000 --> 00:05:35.000
+How do I create a link from...
+
+00:05:35.000 --> 00:05:39.000
+to this file in Haskell
+
+00:05:39.000 --> 00:05:42.000
+to put it in this file here? I can put
+
+00:05:42.000 --> 00:05:45.000
+the cursor here, in any position
+
+00:05:45.000 --> 00:05:48.000
+after this anchor here, and type
+
+00:05:48.000 --> 00:05:49.000
+`M-x kla`...
+
+00:05:49.000 --> 00:05:51.000
+it copies this link here to the kill
+
+00:05:51.000 --> 00:05:54.000
+ring and then I can can go here and
+
+00:05:54.000 --> 00:05:59.000
+either insert it with C-y (yank), or
+
+00:05:59.000 --> 00:06:06.000
+insert it with `M-k kli`, that adds a
+
+00:06:06.000 --> 00:06:07.000
+comment prefix here.
+
+00:06:07.000 --> 00:06:11.000
+So this is a way to create a link from
+
+00:06:11.000 --> 00:06:15.000
+here to there in which every
+
+00:06:15.000 --> 00:06:18.000
+comment has to be given explicitly...
+
+00:06:18.000 --> 00:06:21.000
+but I also implemented a way to
+
+00:06:21.000 --> 00:06:23.000
+create the two links at the same time.
+
+00:06:23.000 --> 00:06:25.000
+I don't use it much, it's mostly for
+
+00:06:25.000 --> 00:06:27.000
+demos, because it's impressive, I wanted
+
+00:06:27.000 --> 00:06:29.000
+to show that in this presentation...
+
+00:06:29.000 --> 00:06:33.000
+Anyway, let me show it here. Note that
+
+00:06:33.000 --> 00:06:36.000
+that in this file here the point is
+
+00:06:36.000 --> 00:06:40.000
+here, in this file the point is here...
+
+00:06:40.000 --> 00:06:43.000
+My trick is going to create a link to
+
+00:06:43.000 --> 00:06:47.000
+this anchor and put it in this file, and
+
+00:06:47.000 --> 00:06:49.000
+it's going to create a link to this
+
+00:06:49.000 --> 00:06:52.000
+anchor and put it in this file...
+
+00:06:52.000 --> 00:06:57.000
+So, here it goes: `M-x kla2`... ta-da!
+
+00:06:57.000 --> 00:07:01.000
+it highlighted the true anchors for a
+
+00:07:01.000 --> 00:07:03.000
+second, and it created these things here
+
+00:07:03.000 --> 00:07:06.000
+and inserted them with the
+
+00:07:06.000 --> 00:07:09.000
+right prefixes, I mean, the right
+
+00:07:09.000 --> 00:07:10.000
+comment prefixes.
+
+00:07:10.000 --> 00:07:15.000
+And that's it!
+
+00:07:15.000 --> 00:07:18.000
+So... that's it. If you found this thing
+
+00:07:18.000 --> 00:07:22.000
+interesting just
+
+00:07:22.000 --> 00:07:25.000
+install a recent version of eev and run
+
+00:07:25.000 --> 00:07:28.000
+the tutorial, either with this thing here,
+
+00:07:28.000 --> 00:07:30.000
+`M-x find-kla-intro`, or by running
+
+00:07:30.000 --> 00:07:35.000
+this sexp, or open this file here in the
+
+00:07:35.000 --> 00:07:37.000
+eev directory, and follow the
+
+00:07:37.000 --> 00:07:39.000
+tutorials...
+
+00:07:39.000 --> 00:07:42.000
+most things that there are well
+
+00:07:42.000 --> 00:07:46.000
+documented, but the thing that I don't
+
+00:07:46.000 --> 00:07:47.000
+use much and that is mostly for demos,
+
+00:07:47.000 --> 00:07:50.000
+which is the the thing that creates
+
+00:07:50.000 --> 00:07:52.000
+bi-directional hyperlinks, is not yet
+
+00:07:52.000 --> 00:07:55.000
+well documented, but the rest is.
+
+00:07:55.000 --> 00:07:57.000
+So: that's it! Bye! Have fun! =)
diff --git a/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.vtt b/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.vtt
new file mode 100644
index 00000000..ab7a4207
--- /dev/null
+++ b/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.vtt
@@ -0,0 +1,1184 @@
+WEBVTT
+
+00:00.000 --> 00:03.580
+Thanks, Howard, for the great talk.
+
+00:03.580 --> 00:05.580
+We have the Q&A now open.
+
+00:05.580 --> 00:09.740
+Folks are welcome to put their questions on the pad on IRC, and we might also open up
+
+00:09.740 --> 00:14.500
+this room in a few minutes if you might prefer to join Big Blue Button directly and ask your
+
+00:14.500 --> 00:16.300
+questions to Howard that way.
+
+00:16.300 --> 00:19.960
+Yeah, so Howard, take it away.
+
+00:19.960 --> 00:20.960
+Thank you, thank you.
+
+00:20.960 --> 00:24.020
+Yeah, I wasn't expecting to have a Q&A.
+
+00:24.020 --> 00:28.180
+Tried to condense it so fast because this was supposed to be a lightning talk, but hey,
+
+00:28.180 --> 00:31.280
+it's good to talk to everybody.
+
+00:31.280 --> 00:37.080
+So question on the Etherpad here is, do I fall back to vterm only when needing terminal
+
+00:37.080 --> 00:39.120
+emulation?
+
+00:39.120 --> 00:46.160
+And yeah, I kind of know when I'm going to need that based on the use case.
+
+00:46.160 --> 00:50.000
+Like right now, I'm doing a lot of building with Docker, and Docker just makes a mess
+
+00:50.000 --> 00:51.060
+out of everything.
+
+00:51.060 --> 00:56.460
+And so I can sometimes will like start up a vterm for that.
+
+00:56.460 --> 00:59.920
+But I don't like actually typing a lot of stuff in there as much.
+
+00:59.920 --> 01:06.400
+So actually, I wrote a little program to, you know, the compile command, I just send
+
+01:06.400 --> 01:10.560
+the compile over into it that I could see the output and then I could just and it pops
+
+01:10.560 --> 01:12.080
+right back to where I'm at.
+
+01:12.080 --> 01:17.920
+So I don't know, I think you kind of need to use a little bit of both.
+
+01:17.920 --> 01:22.280
+But yeah, it would be nice to kind of flip a window back and forth because there's some
+
+01:22.280 --> 01:26.700
+things about Eshell that I actually do like a lot.
+
+01:26.700 --> 01:34.240
+Now my Tramp suggestion, okay, I'll admit Tramp is, it's kind of fickle.
+
+01:34.240 --> 01:39.920
+I think we all get sometimes better use cases out of it than others.
+
+01:39.920 --> 01:45.200
+Uh oh, my headphones are out of batteries here.
+
+01:45.200 --> 01:48.640
+So we might have to flip here.
+
+01:48.640 --> 01:51.280
+But yeah, so the Tramp, I don't know.
+
+01:51.280 --> 01:56.320
+I think we have to kind of play with it and see how it goes.
+
+01:56.320 --> 02:02.480
+See another question is, have we thought about adding the Eshell manual?
+
+02:02.480 --> 02:10.340
+You know, after doing this talk and I'm realizing a lot of the half baked or almost good stuff
+
+02:10.340 --> 02:15.120
+with Eshell that we could just kind of fix a little bit and some of the, especially some
+
+02:15.120 --> 02:21.520
+of the docs, yeah, I'm kind of thinking that maybe, maybe I should hook up with somebody
+
+02:21.520 --> 02:27.120
+and we could try to do a little bit of extensions there, you know, like fix up the manual a
+
+02:27.120 --> 02:31.840
+little bit more, make it more of a tutorial, I think would help as well as fixing some
+
+02:31.840 --> 02:34.560
+of the little problems like that.
+
+02:34.560 --> 02:43.200
+Trying to be able to cat a buffer into the shell, I think is pretty useful.
+
+02:43.200 --> 02:46.160
+Let's see, do I know if Eshell can be used from Elisp?
+
+02:46.160 --> 02:48.160
+Yeah, I use that quite a bit.
+
+02:48.160 --> 02:52.920
+I actually have functions that call an Eshell command.
+
+02:52.920 --> 02:59.440
+That way I get all of the, you know, the benefits that you can get from an Eshell, like with
+
+02:59.440 --> 03:02.000
+the predicates and all that kind of thing.
+
+03:02.000 --> 03:06.480
+I can't remember who's been doing it, but lately I've been seeing a lot of the do what
+
+03:06.480 --> 03:13.400
+I mean shell commands that they're, they're building up a bunch of functions that do very
+
+03:13.400 --> 03:16.360
+specific things, what they need.
+
+03:16.360 --> 03:23.120
+And it seems like there's a lot of like special commands they're adding into it to like get
+
+03:23.120 --> 03:24.960
+the file name and that sort of thing.
+
+03:24.960 --> 03:29.680
+And I was thinking, Hey, that's a great idea, but let's do it with Eshell.
+
+03:29.680 --> 03:33.880
+So I've been doing something similar, but just calling out to Eshell itself.
+
+03:33.880 --> 03:39.800
+Let's see, next question, how does that interplay with my literate dellop bop approach?
+
+03:39.800 --> 03:41.760
+Yeah, the two are different.
+
+03:41.760 --> 03:48.600
+You know, when I'm doing my literate work, you know, I'm in an org file and I'm just
+
+03:48.600 --> 03:56.720
+writing commands, but yeah, sometimes it's just a little bit, you know, I'm not planning
+
+03:56.720 --> 03:57.720
+on keeping it.
+
+03:57.720 --> 04:02.720
+I'm just kind of investigating things and that's what rebels are really good for.
+
+04:02.720 --> 04:06.840
+And in that case, yeah, I'll pop over into Eshell, write things.
+
+04:06.840 --> 04:11.640
+If I see something good, that's where I was talking about my little engineering notebook,
+
+04:11.640 --> 04:17.080
+sending it out to a capture and then, and capturing it out or writing it into a buffer
+
+04:17.080 --> 04:19.600
+where I can do more things to it.
+
+04:19.600 --> 04:23.960
+I guess it's the flexibility I think we all kind of need because you don't know exactly
+
+04:23.960 --> 04:25.920
+where you're going until you're halfway there.
+
+04:25.920 --> 04:29.100
+And it's like, Oh, I don't want to start up a new app.
+
+04:29.100 --> 04:32.200
+That's why we're an Emacs.
+
+04:32.200 --> 04:33.200
+So yeah.
+
+04:33.200 --> 04:34.200
+Oh yeah.
+
+04:34.200 --> 04:35.200
+Thank you.
+
+04:35.200 --> 04:36.200
+Yeah.
+
+04:36.200 --> 04:37.200
+Alvaro Ramineers.
+
+04:37.200 --> 04:38.200
+Yeah.
+
+04:38.200 --> 04:40.880
+That's the stuff I've been reading a lot about.
+
+04:40.880 --> 04:41.880
+Let's see.
+
+04:41.880 --> 04:42.880
+Another question.
+
+04:42.880 --> 04:47.340
+Do I have a strategy for getting around Eshell's lack of support for input redirection?
+
+04:47.340 --> 04:50.520
+You know, it is what it is.
+
+04:50.520 --> 04:54.900
+I don't have any ideas at the moment.
+
+04:54.900 --> 04:56.480
+It's a good idea.
+
+04:56.480 --> 05:03.160
+Whenever, you know, we're so used to doing pipes and whenever you start doing a pipe
+
+05:03.160 --> 05:08.040
+at all, Eshell just immediately throws it into the shell.
+
+05:08.040 --> 05:11.280
+But then pulling it back in is kind of difficult.
+
+05:11.280 --> 05:15.480
+So that's why I just started writing them out to buffers and then pulling them back
+
+05:15.480 --> 05:16.480
+in.
+
+05:16.480 --> 05:21.720
+And I find that just a little bit more useful situation for what I'm doing.
+
+05:21.720 --> 05:27.040
+I don't know if other people will find it as useful as I do.
+
+05:27.040 --> 05:31.440
+But yeah, I'm getting a little tired of trying to get just the right command of piping everything
+
+05:31.440 --> 05:32.440
+together.
+
+05:32.440 --> 05:38.200
+And two years ago when I was talking about my little piper idea, this is kind of what
+
+05:38.200 --> 05:44.040
+it's morphed into was just using Eshell, running the commands, editing the stuff and then pulling
+
+05:44.040 --> 05:47.400
+it back in to send it to some other app.
+
+05:47.400 --> 05:54.720
+Or not even pulling it back in, just using it at that point and sending it off into emails.
+
+05:54.720 --> 06:02.400
+Yes, you can call elist functions, the commands.
+
+06:02.400 --> 06:05.560
+I was hoping this could be kind of clarified a little bit.
+
+06:05.560 --> 06:12.520
+But if you have any function, any emacs list function that starts with Eshell slash, that
+
+06:12.520 --> 06:14.880
+gets called first before any command.
+
+06:14.880 --> 06:18.800
+So you can override just about every shell command.
+
+06:18.800 --> 06:20.240
+That many of them are.
+
+06:20.240 --> 06:22.400
+So there is an Eshell slash ls.
+
+06:22.400 --> 06:27.560
+So if you type ls into your Eshell, it's actually calling that function.
+
+06:27.560 --> 06:32.540
+Now most of those functions will, if it runs into too many options that it doesn't know
+
+06:32.540 --> 06:40.040
+about or something like that, call out to whatever ls program you've got installed.
+
+06:40.040 --> 06:44.600
+But that's how it goes.
+
+06:44.600 --> 06:48.120
+So yes, buffers are superior pipes.
+
+06:48.120 --> 06:50.880
+Whoever is typing that, I think that's a great idea.
+
+06:50.880 --> 06:55.840
+I think that's kind of the concept that I'm realizing this year.
+
+06:55.840 --> 07:06.320
+Hold on one second while I switch headphones here.
+
+07:06.320 --> 07:08.640
+I suppose you can still hear me, right?
+
+07:08.640 --> 07:11.960
+Yep, I can still hear you.
+
+07:11.960 --> 07:18.760
+Well, nobody's talking yet.
+
+07:18.760 --> 07:20.800
+I can still hear you.
+
+07:20.800 --> 07:22.720
+OK, perfect, perfect.
+
+07:22.720 --> 07:23.720
+And I can hear you too.
+
+07:23.720 --> 07:26.800
+So that works well.
+
+07:26.800 --> 07:28.260
+Let's see.
+
+07:28.260 --> 07:30.280
+Any other questions in the IRC?
+
+07:30.280 --> 07:35.040
+Not seeing them mostly in the etherpad here.
+
+07:35.040 --> 07:42.600
+Do I have a preferred method for getting argument completion for shell commands?
+
+07:42.600 --> 07:46.120
+OK, that's a really good question.
+
+07:46.120 --> 07:53.720
+There is a function that I found in Eshell for getting options.
+
+07:53.720 --> 07:57.620
+And it's like, great, that's what I was expecting, something like a get ops.
+
+07:57.620 --> 08:02.040
+So I start playing around with it, and it's like almost there.
+
+08:02.040 --> 08:05.160
+The problem is it's not really as flexible as I would think.
+
+08:05.160 --> 08:08.320
+It either takes command line arguments or it doesn't.
+
+08:08.320 --> 08:13.880
+And it's kind of made for very simple commands only.
+
+08:13.880 --> 08:18.200
+So well, I ended up writing my own.
+
+08:18.200 --> 08:22.480
+So I wrote kind of a get ops like function, kind of behaves like it, where you can give
+
+08:22.480 --> 08:28.240
+it a list of single commands, a list of those long commands, some that take options and
+
+08:28.240 --> 08:30.280
+some that don't.
+
+08:30.280 --> 08:36.920
+And you'll see that in my, where I've got it here in the etherpad up on the full code.
+
+08:36.920 --> 08:41.200
+I also posted it up on Mastodon as well earlier.
+
+08:41.200 --> 08:44.240
+But I have a link to my configuration file.
+
+08:44.240 --> 08:45.240
+It's all literate.
+
+08:45.240 --> 08:50.200
+So you can just scroll down, search for get ops, and you'll see my function.
+
+08:50.200 --> 08:53.720
+I haven't fully tested out everything yet.
+
+08:53.720 --> 08:57.720
+Most of the code was actually written for this talk, I found.
+
+08:57.720 --> 09:01.200
+And so there will be bugs.
+
+09:01.200 --> 09:07.340
+But you know, you might find it interesting to grab some of the stuff and play around
+
+09:07.340 --> 09:08.340
+with it.
+
+09:08.340 --> 09:10.440
+If you find some bugs, please send them back to me.
+
+09:10.440 --> 09:14.320
+I'll discover them soon enough.
+
+09:14.320 --> 09:19.720
+So is it possible to get L.base completion for elist calls and eshell?
+
+09:19.720 --> 09:20.720
+Good question.
+
+09:20.720 --> 09:23.920
+I don't know.
+
+09:23.920 --> 09:28.160
+I have been switching from company mode to Corfu.
+
+09:28.160 --> 09:30.120
+Just try it all out.
+
+09:30.120 --> 09:37.080
+I'm getting some pretty good completions, but the EL doc based would be, that would
+
+09:37.080 --> 09:43.120
+be very lovely.
+
+09:43.120 --> 09:45.040
+A plan nine smart shell.
+
+09:45.040 --> 09:46.400
+Sorry, sorry.
+
+09:46.400 --> 09:47.400
+Oh, yes.
+
+09:47.400 --> 09:58.160
+I do remember reading Mickey Peterson's article on eshell and his plan nine idea.
+
+09:58.160 --> 10:04.240
+I was playing around with it for a little bit, but I don't know.
+
+10:04.240 --> 10:05.240
+Yeah.
+
+10:05.240 --> 10:11.720
+I couldn't get it quite working the way I thought I would want it to, so I didn't follow
+
+10:11.720 --> 10:12.720
+through.
+
+10:12.720 --> 10:18.600
+But I just got some good ideas there.
+
+10:18.600 --> 10:21.080
+Any other questions?
+
+10:21.080 --> 10:27.680
+But yes, I should, yeah, I should revisit Mickey Peterson's ideas.
+
+10:27.680 --> 10:28.680
+Say it again.
+
+10:28.680 --> 10:29.680
+Cool.
+
+10:29.680 --> 10:30.680
+Yeah, sorry.
+
+10:30.680 --> 10:32.720
+I guess I was just going to ask a question on the fly here.
+
+10:32.720 --> 10:33.720
+Sure.
+
+10:33.720 --> 10:38.040
+Yeah, which is, so you mentioned this sort of get up function or get up like function
+
+10:38.040 --> 10:39.040
+that you implemented.
+
+10:39.040 --> 10:43.840
+Would you consider maybe having that integrated in Emacs core itself so that it's available
+
+10:43.840 --> 10:46.880
+to all other eshell users?
+
+10:46.880 --> 10:54.040
+I think that'd be a great idea and I'm kind of thinking I need to kind of see what should
+
+10:54.040 --> 11:00.760
+go into eshell and what should maybe be like a side package like eshell ext kind of thing
+
+11:00.760 --> 11:07.200
+for getting some extra stuff because I don't know if everybody wants all of it.
+
+11:07.200 --> 11:13.800
+So having a side package might be a really good idea and then seeing, yeah.
+
+11:13.800 --> 11:15.760
+So yes, if you want to work on it with me.
+
+11:15.760 --> 11:16.760
+Yeah, sure.
+
+11:16.760 --> 11:17.760
+Sounds good.
+
+11:17.760 --> 11:18.760
+Why not?
+
+11:18.760 --> 11:19.760
+Sure.
+
+11:19.760 --> 11:20.760
+Sure.
+
+11:20.760 --> 11:23.840
+All right.
+
+11:23.840 --> 11:30.200
+Any other questions or good?
+
+11:30.200 --> 11:32.360
+I think we still have about, sorry.
+
+11:32.360 --> 11:33.360
+Go ahead.
+
+11:33.360 --> 11:36.760
+Oh, I was going to say I think we're out of questions.
+
+11:36.760 --> 11:37.760
+Right?
+
+11:37.760 --> 11:38.760
+Yeah.
+
+11:38.760 --> 11:39.760
+But we still are not out of time yet.
+
+11:39.760 --> 11:49.400
+So I think I've got more time for Q&A than I thought I had for the actual talk.
+
+11:49.400 --> 11:52.280
+Yeah, it's been interesting.
+
+11:52.280 --> 11:57.360
+So we were kind of debating on switching to two tracks like we have done this year or
+
+11:57.360 --> 12:01.240
+keeping or maintaining the same setup as the previous years, which was one track.
+
+12:01.240 --> 12:06.280
+But sort of all the talks were very like squeezing together and it was a last minute decision
+
+12:06.280 --> 12:07.280
+kind of.
+
+12:07.280 --> 12:10.000
+And we almost did end up going back to one track.
+
+12:10.000 --> 12:11.000
+But we're here.
+
+12:11.000 --> 12:14.760
+And I think that's the reason why some of the Q&As are sometimes longer than the talks
+
+12:14.760 --> 12:15.760
+themselves.
+
+12:15.760 --> 12:18.080
+Well, okay.
+
+12:18.080 --> 12:22.340
+So personally, I love the two track idea and I love all the breaks.
+
+12:22.340 --> 12:27.200
+It's made it a lot easier because last year it's like, oh, I can't even get up.
+
+12:27.200 --> 12:29.860
+Yeah, I feel you.
+
+12:29.860 --> 12:30.860
+And I feel the same too.
+
+12:30.860 --> 12:34.940
+Both, I mean, as someone who's been a little bit watching, but also as organizers, I mean,
+
+12:34.940 --> 12:39.360
+you couldn't catch a breath with like that one track rapid fire of talks one after another.
+
+12:39.360 --> 12:41.760
+So this is much better, I feel like.
+
+12:41.760 --> 12:42.760
+Yeah.
+
+12:42.760 --> 12:43.760
+Yeah.
+
+12:43.760 --> 12:44.760
+So let's keep it.
+
+12:44.760 --> 12:45.760
+Let's keep it going.
+
+12:45.760 --> 12:46.760
+Yeah.
+
+12:46.760 --> 12:48.760
+And next year, maybe I can do 15 minutes.
+
+12:48.760 --> 12:49.760
+Yes.
+
+12:49.760 --> 12:50.760
+Mal?
+
+12:50.760 --> 12:51.760
+Yes.
+
+12:51.760 --> 12:54.560
+Are you the maintainer of Eshell now?
+
+12:54.560 --> 12:56.560
+No, I'm not.
+
+12:56.560 --> 12:59.680
+Just an interested bystander.
+
+12:59.680 --> 13:03.200
+I think Eshell is still just part of Core.
+
+13:03.200 --> 13:09.260
+John Wiggly wrote it originally, but I think it's just part of the core.
+
+13:09.260 --> 13:13.540
+So I don't think anyone is maintaining it per se.
+
+13:13.540 --> 13:18.160
+It certainly is getting a little long in the tooth and we probably need to do some updatings
+
+13:18.160 --> 13:19.160
+on it.
+
+13:19.160 --> 13:21.720
+So maybe that's what we should do for version 30.
+
+13:21.720 --> 13:27.400
+Yeah, I've started to use it a little bit more just because of all the chatter on the
+
+13:27.400 --> 13:29.100
+various blogs, right?
+
+13:29.100 --> 13:31.240
+There is a lot of chatter lately.
+
+13:31.240 --> 13:38.080
+But it burned me recently for like half an hour because I was trying to SSH into a machine
+
+13:38.080 --> 13:39.080
+from Eshell.
+
+13:39.080 --> 13:45.240
+And usually, I use just regular shell mode.
+
+13:45.240 --> 13:53.160
+And for some reason, it just didn't connect up to the SSH agent or whatever.
+
+13:53.160 --> 13:57.840
+So I was thinking that everything's broken and stuff.
+
+13:57.840 --> 13:59.800
+I'm like running around trying to do stuff.
+
+13:59.800 --> 14:03.600
+Oh, it's just because I'm in Eshell trying to do this.
+
+14:03.600 --> 14:04.600
+Yes, yes.
+
+14:04.600 --> 14:07.600
+And if I know I'm going to be SSHing into a box, I don't.
+
+14:07.600 --> 14:10.280
+I just start up vterm and go.
+
+14:10.280 --> 14:12.280
+Then I know it's going to be pretty good.
+
+14:12.280 --> 14:16.240
+I've had a lot of good success in that regard with vterm.
+
+14:16.240 --> 14:21.360
+However, the problem is it's hard to pull that kind of stuff back.
+
+14:21.360 --> 14:25.040
+Like I'll find something interesting and it's like, oh, crap.
+
+14:25.040 --> 14:31.400
+Now I have to control C, control T, and then go up and collect it as opposed to shooting
+
+14:31.400 --> 14:37.040
+it out over into an org file with a redirection.
+
+14:37.040 --> 14:41.480
+That's why I've been kind of playing around with just using Tramp in Eshell as opposed
+
+14:41.480 --> 14:44.040
+to SSHing in.
+
+14:44.040 --> 14:46.040
+My knowledge may vary.
+
+14:46.040 --> 14:51.400
+I thought in the command interpreter, there's some stuff like...
+
+14:51.400 --> 14:52.400
+There is.
+
+14:52.400 --> 14:57.760
+It's supposed to be the visual commands.
+
+14:57.760 --> 15:02.200
+I think there's a list of them, and SSH is one of those.
+
+15:02.200 --> 15:11.920
+It's supposed to then start off as a shell mode, detached little process and feed stuff,
+
+15:11.920 --> 15:13.560
+but I don't know.
+
+15:13.560 --> 15:16.680
+I haven't had as much luck with it, so I haven't really bothered.
+
+15:16.680 --> 15:18.320
+I just jump.
+
+15:18.320 --> 15:21.400
+If I know I'm going to SSH, I'll just start a vterm and go.
+
+15:21.400 --> 15:29.240
+Well, I mean, aside from doing SSH, just using...
+
+15:29.240 --> 15:31.320
+I think there are a couple commands for...
+
+15:31.320 --> 15:38.720
+There's one for taking the command on the command line and putting it into the kill
+
+15:38.720 --> 15:44.880
+ring, and there's another one for flushing the buffer, flushing the last output of your
+
+15:44.880 --> 15:55.080
+buffer, and it works in many different shell or repl-type environments inside Emacs, but
+
+15:55.080 --> 16:00.520
+it doesn't put it into the kill ring, which was sort of confusing to me, so I'll have
+
+16:00.520 --> 16:07.000
+to dive into the Elisp at some point and figure out how to get what I want.
+
+16:07.000 --> 16:09.680
+I think that's the problem with this Eshell.
+
+16:09.680 --> 16:19.860
+There's a lot of interesting ideas, but there's a lot that's not quite baked yet.
+
+16:19.860 --> 16:26.280
+It's a combination of what we expect, because it's not a terminal emulator shell.
+
+16:26.280 --> 16:32.760
+It's not like Bash, it's different, but it's got some cool stuff, so there's expectation,
+
+16:32.760 --> 16:38.560
+and then there are just bugs and things that haven't been finished.
+
+16:38.560 --> 16:41.080
+I can't remember who started...
+
+16:41.080 --> 16:48.400
+I've got a link in my configuration file, but somebody was writing on how to get the
+
+16:48.400 --> 16:55.320
+output from the last command in shell, shell mode, and I thought, that's a great idea.
+
+16:55.320 --> 17:01.640
+I want that in Eshell, and then I found the source code that there's a double dollar sign
+
+17:01.640 --> 17:02.640
+that's already there.
+
+17:02.640 --> 17:03.640
+Great.
+
+17:03.640 --> 17:04.640
+Wait a minute.
+
+17:04.640 --> 17:05.640
+It doesn't work all the time?
+
+17:05.640 --> 17:10.640
+What the hell?
+
+17:10.640 --> 17:15.720
+When I saw that in your talk, I was like, oh, that's one of the things I've been looking
+
+17:15.720 --> 17:16.720
+for.
+
+17:16.720 --> 17:17.720
+It is, exactly.
+
+17:17.720 --> 17:22.640
+Now, I'll admit, the underpinnings are really good.
+
+17:22.640 --> 17:28.520
+It didn't take long to actually make that and fix it, and then make it even better.
+
+17:28.520 --> 17:32.800
+Like putting in a kill ring, it's like, now that is nice, so that I could just grab it
+
+17:32.800 --> 17:34.120
+as an array and go.
+
+17:34.120 --> 17:35.120
+That's really good.
+
+17:35.120 --> 17:37.600
+So, I think there's a lot of good stuff there.
+
+17:37.600 --> 17:42.200
+I think, yeah, let's just make some features.
+
+17:42.200 --> 17:48.000
+Let's make an extension, and let's assign the copyright to the BFSS.
+
+17:48.000 --> 17:53.080
+Yeah, maybe I'll start looking at Eshell after.
+
+17:53.080 --> 17:58.440
+I'm playing around with org-node right now, trying to catch up to some of the forks, but
+
+17:58.440 --> 18:02.840
+maybe Eshell is another, the next thing to sort of poke at.
+
+18:02.840 --> 18:05.840
+Aren't there so many fun things to do?
+
+18:05.840 --> 18:08.840
+It's terrible.
+
+18:08.840 --> 18:13.880
+Great, great, great.
+
+18:13.880 --> 18:17.960
+I got another question over here in the IRC, do you ever fall back to terminals and shells
+
+18:17.960 --> 18:20.160
+outside of Emacs?
+
+18:20.160 --> 18:32.260
+Okay, that, all right, confession time, yes, I sometimes use iterm.
+
+18:32.260 --> 18:37.920
+So when I, so when I first boot up, I do have to use a terminal before I start up Emacs
+
+18:37.920 --> 18:39.840
+because it's got to mount everything.
+
+18:39.840 --> 18:46.040
+So I do use iterm, and yeah, sometimes if it happens to be there, I'll type the command
+
+18:46.040 --> 18:51.040
+in there instead of running into Emacs.
+
+18:51.040 --> 18:56.440
+But I just find running those terminals to be pretty frustrating because most of them,
+
+18:56.440 --> 19:04.480
+you have to use a mouse to copy and select stuff.
+
+19:04.480 --> 19:08.480
+Yeah and actually I could maybe chime in here and say that yeah, exactly, not only for terminals
+
+19:08.480 --> 19:15.960
+but also for IRC clients, I feel like I've tried using a bunch of different ones, yeah,
+
+19:15.960 --> 19:20.880
+but it ultimately comes down to I can't just put the cursor up, you know, quickly grab
+
+19:20.880 --> 19:23.920
+something, kill it and paste it somewhere else or just use it.
+
+19:23.920 --> 19:28.040
+And yeah, that's, I feel like one of the killer features of Emacs or anything that's built
+
+19:28.040 --> 19:29.040
+into Emacs.
+
+19:29.040 --> 19:30.040
+Mm-hmm.
+
+19:30.040 --> 19:31.040
+Mm-hmm.
+
+19:31.040 --> 19:32.040
+Agreed.
+
+19:32.040 --> 19:39.320
+Lounge679 says, what are the less well oiled parts of Eshell and the edge cases?
+
+19:39.320 --> 19:45.960
+Yeah, that's a great phrasing, less well oiled parts.
+
+19:45.960 --> 19:51.760
+There's just a little friction and I think we need to figure out how to fix those things
+
+19:51.760 --> 19:54.360
+when we encounter them.
+
+19:54.360 --> 20:01.440
+Yeah, I should make a list of the things I found and hey, Mal, you give me a list too.
+
+20:01.440 --> 20:02.440
+And yeah.
+
+20:02.440 --> 20:09.040
+I think one of the problems with Eshell is that it's not based on comment, like shell
+
+20:09.040 --> 20:10.040
+and- It isn't.
+
+20:10.040 --> 20:17.400
+Yeah, and as a result, the other shells have like a uniform interface and uniform key bindings
+
+20:17.400 --> 20:19.040
+for doing things.
+
+20:19.040 --> 20:25.360
+And Eshell does things slightly differently, different enough that-
+
+20:25.360 --> 20:26.360
+That's right.
+
+20:26.360 --> 20:27.360
+Yeah.
+
+20:27.360 --> 20:28.360
+Yeah, exactly.
+
+20:28.360 --> 20:29.360
+And that's good and bad.
+
+20:29.360 --> 20:30.480
+It's doing something totally different.
+
+20:30.480 --> 20:35.280
+And if you know that it's just gonna be different and you'll treat it differently, at least that's
+
+20:35.280 --> 20:36.280
+how I found.
+
+20:36.280 --> 20:42.280
+So that's why I'm jumping between the vterm and Eshell, depending on what I'm trying to
+
+20:42.280 --> 20:43.340
+do.
+
+20:43.340 --> 20:48.760
+But I'm just finding there's a lot of interesting stuff in Eshell, but it changes how we run
+
+20:48.760 --> 20:49.760
+things.
+
+20:49.760 --> 20:56.240
+I think it's very similar to, well, I mean, if, okay, I'm not blaming names, but if you're
+
+20:56.240 --> 21:01.080
+a VI user, you're starting with a terminal and you're running commands.
+
+21:01.080 --> 21:04.400
+And then when you need to edit a file, you edit, you come back, but the shell is kind
+
+21:04.400 --> 21:05.400
+of your main focus.
+
+21:05.400 --> 21:10.160
+Well, we're all over here in Emacs and we just run commands from Emacs, right?
+
+21:10.160 --> 21:12.280
+That's just how we behave.
+
+21:12.280 --> 21:19.680
+And using Eshell is this way where don't go all the way, don't try to, but you can kind
+
+21:19.680 --> 21:22.300
+of pretend and do different things.
+
+21:22.300 --> 21:30.320
+So yeah, so that's why I say it kind of changes our behavior because it's doing things differently.
+
+21:30.320 --> 21:34.560
+So you can't look at it as another common.
+
+21:34.560 --> 21:43.600
+Wait, so when you say you're using vterm, does that mean you're using, that's a separate
+
+21:43.600 --> 21:49.920
+application outside of Emacs or is there a, oh, oh, yeah.
+
+21:49.920 --> 21:55.960
+So vterm is, I don't know when it came out, a couple of years ago, I don't know the details
+
+21:55.960 --> 22:02.960
+of it, but it's using a module library to do all the heavy lifting.
+
+22:02.960 --> 22:07.720
+So it's just a little better comment and I've just found it to be a lot, very reliable and
+
+22:07.720 --> 22:08.840
+pretty fast.
+
+22:08.840 --> 22:16.480
+So especially when I'm SSHing into another machine in my data centers and especially
+
+22:16.480 --> 22:21.200
+building all the Docker and some of the weird terminal stuff that I need to do in those
+
+22:21.200 --> 22:28.280
+shell environments using SSH, I just find vterm to be really good for what that does.
+
+22:28.280 --> 22:29.280
+Oh, okay.
+
+22:29.280 --> 22:30.280
+I see it now.
+
+22:30.280 --> 22:31.280
+It's on an alpha.
+
+22:31.280 --> 22:32.280
+All right.
+
+22:32.280 --> 22:33.280
+Yeah.
+
+22:33.280 --> 22:39.880
+It is in the, you're still in Emacs, but the key bindings are pretty good, but you do,
+
+22:39.880 --> 22:47.280
+you know, it has two modes, one for selecting text and then one for being a terminal.
+
+22:47.280 --> 22:50.280
+Maybe I'll try that out instead of metax-gel.
+
+22:50.280 --> 22:54.240
+Yes, I would, if you can.
+
+22:54.240 --> 22:59.200
+The problem that I think most people have is building that vterm library.
+
+22:59.200 --> 23:02.960
+I haven't had any problems on my work Mac.
+
+23:02.960 --> 23:04.480
+So it's been pretty good for me.
+
+23:04.480 --> 23:05.480
+Okay.
+
+23:05.480 --> 23:06.480
+All right.
+
+23:06.480 --> 23:12.240
+That's good to know about too, but that'll keep me from you like adopting Eshell.
+
+23:12.240 --> 23:13.240
+Sure.
+
+23:13.240 --> 23:17.720
+You know, that's a nice thing about choices.
+
+23:17.720 --> 23:18.720
+Yeah.
+
+23:18.720 --> 23:29.160
+You'll just find that vterm, I think behaves exactly like you expect a terminal to act.
+
+23:29.160 --> 23:31.560
+And so you won't have, you won't have to do much.
+
+23:31.560 --> 23:35.060
+I don't have much in the way of customizations.
+
+23:35.060 --> 23:41.160
+It's mostly my customizations is just starting a vterm running SSH automatically.
+
+23:41.160 --> 23:44.600
+So it's mostly about working with my external hosts.
+
+23:44.600 --> 23:51.600
+And if I may quickly jump in here, I think we have about another minute or so of live
+
+23:51.600 --> 23:55.760
+Q&A on the stream at which point then the stream will move on, but you folks are welcome
+
+23:55.760 --> 24:01.440
+to stay here or like continue the Q&A on the pad or whatever works best.
+
+24:01.440 --> 24:02.440
+Just staying in this room.
+
+24:02.440 --> 24:03.440
+Yeah.
+
+24:03.440 --> 24:04.440
+And continue talking.
+
+24:04.440 --> 24:05.440
+Lovely.
+
+24:05.440 --> 24:06.440
+Yeah.
+
+24:06.440 --> 24:12.120
+As Karthik has said vterm isn't distracting.
+
+24:12.120 --> 24:18.600
+It doesn't, you know, it's, it's just exactly what you expect.
+
+24:18.600 --> 24:20.480
+So it's not interesting either.
+
+24:20.480 --> 24:34.320
+No, I'm just, yeah, and so there's some good comments on the IRC.
+
+24:34.320 --> 24:35.320
+So yeah.
+
+24:35.320 --> 24:36.320
+Thanks everybody.
+
+24:36.320 --> 24:37.320
+It's been fun.
+
+24:37.320 --> 24:38.320
+All right.
+
+24:38.320 --> 24:39.320
+I'm going to jump off now.
+
+24:39.320 --> 24:40.320
+Nice talking to you, Howard.
+
+24:40.320 --> 24:41.320
+You too.
+
+24:41.320 --> 24:42.320
+All right.
+
+24:42.320 --> 24:43.320
+Thank you all.
+
+24:43.320 --> 24:46.800
+I think I'll drop off as well.
+
+24:46.800 --> 24:48.800
+All right.
+
+24:48.800 --> 24:50.800
+Thank you.
+
diff --git a/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt b/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt
new file mode 100644
index 00000000..e2ead1cc
--- /dev/null
+++ b/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt
@@ -0,0 +1,38 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:28.999
+Introduction
+
+00:00:29.000 --> 00:00:48.599
+1. It’s an Emacs REPL
+
+00:00:48.600 --> 00:01:10.119
+2. It’s also a shell
+
+00:01:10.120 --> 00:03:27.559
+3. You can mix these two modes
+
+00:03:27.560 --> 00:04:36.079
+4. Emacs is better than shell
+
+00:04:36.080 --> 00:06:13.479
+5. Better regular expressions
+
+00:06:13.480 --> 00:07:39.639
+6. Loops are better with predicates
+
+00:07:39.640 --> 00:09:08.519
+7. Output of last command
+
+00:09:08.520 --> 00:10:26.879
+8. Redirection back to Emacs
+
+00:10:26.880 --> 00:12:28.399
+9. Using Emacs buffers
+
+00:12:28.400 --> 00:12:59.359
+10. cd to remote systems
+
+00:12:59.360 --> 00:14:01.920
+Summary
diff --git a/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt b/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt
new file mode 100644
index 00000000..62b813f3
--- /dev/null
+++ b/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt
@@ -0,0 +1,739 @@
+WEBVTT captioned by howard
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:04.999
+I have 10 minutes to talk you into
+
+00:00:05.000 --> 00:00:07.879
+giving Eshell a second chance.
+
+00:00:07.880 --> 00:00:10.119
+Have the right perspective and expectation,
+
+00:00:10.120 --> 00:00:12.919
+and I think you’ll really enjoy it.
+
+00:00:12.920 --> 00:00:15.679
+Just remember eshell is a shell,
+
+00:00:15.680 --> 00:00:17.839
+not a terminal emulator.
+
+00:00:17.840 --> 00:00:20.279
+I use both Eshell and vterm.
+
+00:00:20.280 --> 00:00:23.479
+I’m going to talk and type fast,
+
+00:00:23.480 --> 00:00:28.999
+as I have 10 reasons for you to try Eshell again.
+
+NOTE 1. It’s an Emacs REPL
+
+00:00:29.000 --> 00:00:32.599
+1. It’s an Emacs REPL.
+
+00:00:32.600 --> 00:00:33.999
+I mean, check this out.
+
+00:00:34.000 --> 00:00:36.999
+Let’s start up Eshell here.
+
+00:00:37.000 --> 00:00:41.399
+Let’s just type a Lisp expression.
+
+00:00:41.400 --> 00:00:43.919
+It works.
+
+00:00:43.920 --> 00:00:48.599
+As a shell, the parens are kinda optional.
+
+NOTE 2. It’s also a shell
+
+00:00:48.600 --> 00:00:52.519
+2. It’s also a shell.
+
+00:00:52.520 --> 00:00:56.479
+While eshell may look like a shell, like Bash
+
+00:00:56.480 --> 00:00:58.559
+you should view it as a REPL
+
+00:00:58.560 --> 00:01:02.399
+with parenthesis-less s-expressions.
+
+00:01:02.400 --> 00:01:05.559
+This makes sense, because a shell command with options,
+
+00:01:05.560 --> 00:01:07.999
+like this ls command,
+
+00:01:08.000 --> 00:01:10.119
+looks like an s-expression.
+
+NOTE 3. You can mix these two modes
+
+00:01:10.120 --> 00:01:12.879
+3. You can mix these two modes.
+
+00:01:12.880 --> 00:01:14.959
+Shells can call subshells
+
+00:01:14.960 --> 00:01:17.919
+which return their output like a function call,
+
+00:01:17.920 --> 00:01:20.799
+like this Bash command.
+
+00:01:20.800 --> 00:01:22.759
+In this Eshell example,
+
+00:01:22.760 --> 00:01:24.639
+I use the output of a text file
+
+00:01:24.640 --> 00:01:27.959
+as command line arguments to ripgrep.
+
+00:01:27.960 --> 00:01:29.639
+Notice how I use braces
+
+00:01:29.640 --> 00:01:34.759
+to state that it is a call to an eshell expression.
+
+00:01:34.760 --> 00:01:40.039
+We can mix Lisp-expressions and Shell-expressions.
+
+00:01:40.040 --> 00:01:45.599
+Allow me a contrived example.
+
+00:01:45.600 --> 00:01:50.079
+Notice I use good ol' setq to create a variable.
+
+00:01:50.080 --> 00:01:54.919
+Yes, those are global Emacs variables available everywhere.
+
+00:01:54.920 --> 00:01:59.599
+In Eshell, the wildcard actually creates a list.
+
+00:01:59.600 --> 00:02:04.479
+This variable assignment doesn’t work as you might expect,
+
+00:02:04.480 --> 00:02:07.559
+as setq in Eshell is still setq,
+
+00:02:07.560 --> 00:02:10.319
+and it assigns variables in pairs.
+
+00:02:10.320 --> 00:02:17.119
+To make a list in Eshell, we use listify:
+
+00:02:17.120 --> 00:02:21.239
+Without parens, Eshell is in “shell mode”,
+
+00:02:21.240 --> 00:02:23.799
+which means that words are strings,
+
+00:02:23.800 --> 00:02:26.879
+and variables need to be prefixed with dollar signs.
+
+00:02:26.880 --> 00:02:32.399
+A command can have both Eshell and Lisp expressions.
+
+00:02:32.400 --> 00:02:34.559
+As you can see here,
+
+00:02:34.560 --> 00:02:37.119
+I have a call to ripgrep,
+
+00:02:37.120 --> 00:02:40.319
+but part of it is an s-expression.
+
+00:02:40.320 --> 00:02:42.239
+Remember the differences:
+
+00:02:42.240 --> 00:02:46.159
+With parens, eshell treats it as Lisp,
+
+00:02:46.160 --> 00:02:49.199
+like the last line in my example.
+
+00:02:49.200 --> 00:02:53.919
+With braces, eshell follows these shell-like rules:
+
+00:02:53.920 --> 00:02:57.159
+First, if it looks like a number, it's a number.
+
+00:02:57.160 --> 00:02:59.439
+Otherwise, eshell converts it to a string
+
+00:02:59.440 --> 00:03:03.679
+(quotes, like a shell, groups words).
+
+00:03:03.680 --> 00:03:07.519
+What about this mix between functions and executables
+
+00:03:07.520 --> 00:03:10.839
+for the first word?
+
+00:03:10.840 --> 00:03:15.439
+Functions that begin with eshell are called first.
+
+00:03:15.440 --> 00:03:19.079
+Next in priority are executables on your $PATH,
+
+00:03:19.080 --> 00:03:22.159
+then matching Lisp functions.
+
+00:03:22.160 --> 00:03:23.940
+You can actually switch this order
+
+00:03:23.941 --> 00:03:27.559
+with the `eshell-prefer-lisp-functions` variable.
+
+NOTE 4. Emacs is better than shell
+
+00:03:27.560 --> 00:03:31.759
+4. Emacs is actually better than shell.
+
+00:03:31.760 --> 00:03:35.199
+If the following works, why would you call
+
+00:03:35.200 --> 00:03:40.039
+expr or bc or dc, or any of those other calculators?
+
+00:03:40.040 --> 00:03:43.639
+You can just call a Lisp expression.
+
+00:03:43.640 --> 00:03:47.999
+Why call less or more when you could call view-file?
+
+00:03:48.000 --> 00:03:52.839
+Here, I’ve aliased less to view-file.
+
+00:03:52.840 --> 00:03:57.559
+Load it up, and it shows up in an Emacs mode.
+
+00:03:57.560 --> 00:04:01.519
+Just like with less, if you hit q,
+
+00:04:01.520 --> 00:04:05.759
+you go back to your Eshell terminal.
+
+00:04:05.760 --> 00:04:08.439
+I do have an improvement, though.
+
+00:04:08.440 --> 00:04:10.479
+The problem with view-file is
+
+00:04:10.480 --> 00:04:13.399
+it takes a single file as an argument.
+
+00:04:13.400 --> 00:04:15.719
+In a shell, we might want to view more than one.
+
+00:04:15.720 --> 00:04:18.719
+So let’s make a solution to that.
+
+00:04:18.720 --> 00:04:20.999
+This function will call the first function
+
+00:04:21.000 --> 00:04:22.159
+with the first argument,
+
+00:04:22.160 --> 00:04:26.679
+and the second function with each of the rest.
+
+00:04:26.680 --> 00:04:29.559
+This allows me to make a version of less
+
+00:04:29.560 --> 00:04:33.159
+that calls view-file on the first [argument] given,
+
+00:04:33.160 --> 00:04:36.079
+but open in another window for each additional file.
+
+NOTE 5. Better regular expressions
+
+00:04:36.080 --> 00:04:41.239
+5. Better regular expressions.
+
+00:04:41.240 --> 00:04:44.799
+Can’t remember regular expressions when calling
+
+00:04:44.800 --> 00:04:48.639
+grep or some other search function? Use the rx macro.
+
+00:04:48.640 --> 00:04:55.919
+Here I call ripgrep again, but this time,
+
+00:04:55.920 --> 00:05:00.679
+I’m using a Lisp expression calling the rx macro
+
+00:05:00.680 --> 00:05:04.719
+to look for UUIDs in the files in my current directory.
+
+00:05:04.720 --> 00:05:08.159
+But I have another improvement for this.
+
+00:05:08.160 --> 00:05:13.479
+While the rx macro is freaking cool for Emacs Lisp,
+
+00:05:13.480 --> 00:05:15.919
+it doesn’t always translate to regular expressions
+
+00:05:15.920 --> 00:05:20.079
+accepted by most commands.
+
+00:05:20.080 --> 00:05:25.199
+The (I have no idea how to pronounce this) pcre2el project
+
+00:05:25.200 --> 00:05:28.519
+can convert from a Lisp regular expression
+
+00:05:28.520 --> 00:05:31.359
+to Perl-compatible regular expressions (PCRE)
+
+00:05:31.360 --> 00:05:33.519
+acceptable by most search commands.
+
+00:05:33.520 --> 00:05:37.879
+I’ve created a new macro here, prx,
+
+00:05:37.880 --> 00:05:41.319
+that translates the output of the rx macro.
+
+00:05:41.320 --> 00:05:46.519
+This allows me to type something much more readable,
+
+00:05:46.520 --> 00:05:48.519
+and probably easier to remember.
+
+00:05:48.520 --> 00:05:54.679
+Certainly easier than this freaking regular expression.
+
+00:05:54.680 --> 00:05:59.439
+I’ve got an even better improvement.
+
+00:05:59.440 --> 00:06:03.559
+The rx macro with regular expression snippets
+
+00:06:03.560 --> 00:06:05.759
+can be assigned to key words
+
+00:06:05.760 --> 00:06:08.679
+that I can then take advantage of.
+
+00:06:08.680 --> 00:06:13.479
+Now our command would be much simpler to type.
+
+NOTE 6. Loops are better with predicates
+
+00:06:13.480 --> 00:06:16.159
+6. Loops are better with predicates.
+
+00:06:16.160 --> 00:06:18.759
+Let’s say you want to remove the execute bit
+
+00:06:18.760 --> 00:06:20.479
+from files that have it.
+
+00:06:20.480 --> 00:06:24.399
+In a shell like bash, you need both a for loop and an if,
+
+00:06:24.400 --> 00:06:26.599
+as you can see in this example.
+
+00:06:26.600 --> 00:06:31.559
+With eshell, use a predicate to combine into a simple loop.
+
+00:06:31.560 --> 00:06:34.359
+The paren x after a file glob
+
+00:06:34.360 --> 00:06:36.879
+filters for only files marked as executable.
+
+00:06:36.880 --> 00:06:43.559
+Now here is another improvement.
+
+00:06:43.560 --> 00:06:47.959
+Since we often type loops to execute on one command,
+
+00:06:47.960 --> 00:06:49.519
+what about creating a function
+
+00:06:49.520 --> 00:06:50.999
+that can do this all in one go?
+
+00:06:51.000 --> 00:06:57.599
+This do function splits the arguments on that double colon,
+
+00:06:57.600 --> 00:07:00.079
+where the left side is a single statement to run,
+
+00:07:00.080 --> 00:07:02.599
+and the right side is a list of files.
+
+00:07:02.600 --> 00:07:05.839
+I have to append and flatten it
+
+00:07:05.840 --> 00:07:07.639
+in order for it to work.
+
+00:07:07.640 --> 00:07:09.399
+It loops through each file,
+
+00:07:09.400 --> 00:07:12.079
+creating an eshell command with the file appended.
+
+00:07:12.080 --> 00:07:15.759
+With this, I can remove the execute bit
+
+00:07:15.760 --> 00:07:20.759
+on all CSV files that have it.
+
+00:07:20.760 --> 00:07:24.319
+I see that my example wasn’t too good, as most commands
+
+00:07:24.320 --> 00:07:29.039
+like chmod accept multiple files, but you get the idea.
+
+00:07:29.040 --> 00:07:33.159
+In my final, larger form on my website,
+
+00:07:33.160 --> 00:07:35.279
+I don’t assume the command expression accepts
+
+00:07:35.280 --> 00:07:36.719
+a file as a final argument,
+
+00:07:36.720 --> 00:07:39.639
+as I can also replace underscores with the filename.
+
+NOTE 7. Output of last command
+
+00:07:39.640 --> 00:07:45.399
+7. Output of last command.
+
+00:07:45.400 --> 00:07:48.799
+Most shells have a special variable
+
+00:07:48.800 --> 00:07:52.839
+like $? for the exit code of the last command.
+
+00:07:52.840 --> 00:07:55.919
+While reading through the source code,
+
+00:07:55.920 --> 00:07:58.799
+I noticed that the $$ refers to
+
+00:07:58.800 --> 00:08:00.599
+the output of the last command.
+
+00:08:00.600 --> 00:08:05.799
+This seems pretty cool.
+
+00:08:05.800 --> 00:08:10.759
+However, Eshell returns true or nil
+
+00:08:10.760 --> 00:08:12.719
+when running external commands,
+
+00:08:12.720 --> 00:08:15.879
+so accessing the output from a call to ls
+
+00:08:15.880 --> 00:08:19.479
+doesn’t work as expected.
+
+00:08:19.480 --> 00:08:21.119
+But this is Emacs.
+
+00:08:21.120 --> 00:08:23.159
+We can fix that.
+
+00:08:23.160 --> 00:08:28.119
+After running any command, eshell sets these four variables.
+
+00:08:28.120 --> 00:08:33.519
+I can hook a function call after every Eshell command.
+
+00:08:33.520 --> 00:08:36.759
+Using buffer-substring,
+
+00:08:36.760 --> 00:08:39.279
+I store the output into a global variable,
+
+00:08:39.280 --> 00:08:43.599
+and extend Eshell’s special variables list.
+
+00:08:43.600 --> 00:08:46.519
+In my Emacs configuration,
+
+00:08:46.520 --> 00:08:48.479
+I turned this variable into a ring,
+
+00:08:48.480 --> 00:08:51.439
+so while $$ works,
+
+00:08:51.440 --> 00:08:54.399
+so does array sub-scripting on that variable.
+
+00:08:54.400 --> 00:08:58.399
+This allows me to run a command
+
+00:08:58.400 --> 00:09:02.279
+and use the output from that command more than once.
+
+00:09:02.280 --> 00:09:05.279
+The code for this is a bit longer,
+
+00:09:05.280 --> 00:09:08.519
+so you’ll need to see my Emacs configuration for details.
+
+NOTE 8. Redirection back to Emacs
+
+00:09:08.520 --> 00:09:13.439
+8. Redirection back to Emacs.
+
+00:09:13.440 --> 00:09:14.879
+Output of any command
+
+00:09:14.880 --> 00:09:18.519
+can go to kill-ring (or the clipboard).
+
+00:09:18.520 --> 00:09:21.079
+Think of the implications.
+
+00:09:21.080 --> 00:09:23.839
+You don’t have to go into text selection mode.
+
+00:09:23.840 --> 00:09:26.239
+Just grab the output.
+
+00:09:26.240 --> 00:09:30.279
+In fact, with our $$ improvement,
+
+00:09:30.280 --> 00:09:33.239
+we can always copy the output from the last command
+
+00:09:33.240 --> 00:09:34.079
+to the clipboard.
+
+00:09:34.080 --> 00:09:37.999
+Better yet, let’s write the output
+
+00:09:38.000 --> 00:09:39.399
+to our engineering notebook.
+
+00:09:39.400 --> 00:09:41.679
+Here’s my idea.
+
+00:09:41.680 --> 00:09:46.079
+First, create a capture template that takes a string,
+
+00:09:46.080 --> 00:09:48.199
+or if called interactively, the region,
+
+00:09:48.200 --> 00:09:51.879
+and that does an immediate-finish after inserting
+
+00:09:51.880 --> 00:09:53.879
+that string to the default notes file.
+
+00:09:53.880 --> 00:09:57.679
+Next, create a wrapper function
+
+00:09:57.680 --> 00:10:01.559
+to call org-capture-string to run that template.
+
+00:10:01.560 --> 00:10:07.639
+Finally, we add our new function to eshell-virtual-targets.
+
+00:10:07.640 --> 00:10:08.759
+Let’s see this in action.
+
+00:10:08.760 --> 00:10:15.707
+I have a CSV file of user information.
+
+00:10:15.708 --> 00:10:19.719
+I can use grep and cut to extract some of that
+
+00:10:19.720 --> 00:10:26.879
+and write it out to this month’s engineering notebook.
+
+NOTE 9. Using Emacs buffers
+
+00:10:26.880 --> 00:10:35.279
+9. Using Emacs buffers.
+
+00:10:35.280 --> 00:10:39.159
+Why leave the results of eshell commands
+
+00:10:39.160 --> 00:10:40.279
+in the *eshell* buffer?
+
+00:10:40.280 --> 00:10:44.119
+Send the output into a buffer where you can use it.
+
+00:10:44.120 --> 00:10:47.999
+Here’s a call to ripgrep
+
+00:10:48.000 --> 00:10:50.759
+that searches for lines with email addresses
+
+00:10:50.760 --> 00:10:53.519
+using a complicated regular expression
+
+00:10:53.520 --> 00:10:56.079
+that I added to my prx macro.
+
+00:10:56.080 --> 00:11:01.079
+When I switch to this almost-grep buffer,
+
+00:11:01.080 --> 00:11:03.319
+I can turn on grep-mode.
+
+00:11:03.320 --> 00:11:09.039
+Now I can jump around as if I just called grep directly.
+
+00:11:09.040 --> 00:11:14.759
+Perhaps I’m proficient with my prx macro
+
+00:11:14.760 --> 00:11:16.639
+to filter out entries,
+
+00:11:16.640 --> 00:11:19.279
+but not good with shell commands
+
+00:11:19.280 --> 00:11:23.999
+that I can use in pipes to extract just one…
+
+00:11:24.000 --> 00:11:26.039
+the address column, for instance?
+
+00:11:26.040 --> 00:11:28.959
+Let’s just extract it,
+
+00:11:28.960 --> 00:11:33.279
+send it to a buffer called email-list,
+
+00:11:33.280 --> 00:11:38.479
+and now I can use Emacs commands that I know and love
+
+00:11:38.480 --> 00:11:39.799
+to edit the data directly.
+
+00:11:39.800 --> 00:11:55.799
+We currently have an over-sight
+
+00:11:55.800 --> 00:11:58.839
+that the Eshell’s built-in cat command
+
+00:11:58.840 --> 00:12:02.719
+doesn’t pipe buffer contents as standard in.
+
+00:12:02.720 --> 00:12:07.919
+So I created a bcat, a buffer cat, function to do this.
+
+00:12:07.920 --> 00:12:09.879
+So this command works
+
+00:12:09.880 --> 00:12:14.599
+to grab my email addresses I just extracted
+
+00:12:14.600 --> 00:12:16.319
+and send them to another program.
+
+00:12:16.320 --> 00:12:20.959
+If you’re interested, I have a more elaborate
+
+00:12:20.960 --> 00:12:25.759
+and yet simpler workflow surrounding sending data
+
+00:12:25.760 --> 00:12:28.399
+back and forth from Eshell to Emacs buffers.
+
+NOTE 10. cd to remote systems
+
+00:12:28.400 --> 00:12:35.679
+10. Did I mention that you can cd to remote systems?
+
+00:12:35.680 --> 00:12:39.879
+This command uses SSH to jump to my host, goblin,
+
+00:12:39.880 --> 00:12:44.039
+start a root session, and jump to the etc directory.
+
+00:12:44.040 --> 00:12:47.719
+Remember that Tramp can be finicky
+
+00:12:47.720 --> 00:12:52.839
+if you start blinging your remote hosts with oh-my-zshell,
+
+00:12:52.840 --> 00:12:57.790
+and funky prompts and things like that,
+
+00:12:57.791 --> 00:12:59.359
+so your mileage may vary.
+
+NOTE Summary
+
+00:12:59.360 --> 00:13:03.959
+In summary: Use eshell if you want
+
+00:13:03.960 --> 00:13:07.319
+a quick way to run commands and Emacs functions as a REPL,
+
+00:13:07.320 --> 00:13:11.479
+or to run an OS program but process the output with Emacs.
+
+00:13:11.480 --> 00:13:15.919
+Keep in mind that Eshell has two types of subshells,
+
+00:13:15.920 --> 00:13:19.599
+and you can mix and match during a command call.
+
+00:13:19.600 --> 00:13:22.639
+The rx macro is really cool.
+
+00:13:22.640 --> 00:13:26.599
+Eshell loops are better with filters and predicates …
+
+00:13:26.600 --> 00:13:28.239
+if you can remember them.
+
+00:13:28.240 --> 00:13:30.959
+Take advantage of Emacs buffers
+
+00:13:30.960 --> 00:13:32.879
+to really enhance your shell experience.
+
+00:13:32.880 --> 00:13:36.039
+You’ve now seen that just like Emacs,
+
+00:13:36.040 --> 00:13:39.519
+I’ve crafted Eshell to be my own shell creation,
+
+00:13:39.520 --> 00:13:41.039
+tailored to my workflow.
+
+00:13:41.040 --> 00:13:44.799
+So, steal my spells, cast your own magic,
+
+00:13:44.800 --> 00:13:48.759
+but feel free to share your incantations back to me.
+
+00:13:48.760 --> 00:13:51.359
+I’ve gone over my time allotment, so we’ll have to
+
+00:13:51.360 --> 00:13:53.679
+continue this discussion on the intertubes.
+
+00:13:53.680 --> 00:13:57.159
+Why yes, I have joined the birdless diaspora,
+
+00:13:57.160 --> 00:13:59.199
+so toot me over there.
+
+00:13:59.200 --> 00:14:01.920
+Thanks.
diff --git a/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.vtt b/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.vtt
new file mode 100644
index 00000000..dbebe238
--- /dev/null
+++ b/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.vtt
@@ -0,0 +1,6638 @@
+WEBVTT
+
+00:00.000 --> 00:10.040
+Okay, hi, we seem to be back. Sorry for the little interruption. John, you might not have
+
+00:10.040 --> 00:14.640
+realized, but I was supposed to send a broadcast message to the dev track and I submitted it
+
+00:14.640 --> 00:20.840
+to the gen track instead, so I spoke over you for 20 seconds. I apologize humbly, deeply,
+
+00:20.840 --> 00:26.440
+and sincerely. But John, I have to apologize now. I will say hi to you. How are you doing?
+
+00:26.440 --> 00:30.120
+Hello, I'm doing good. I know I'm saying you harmonized with me. You didn't talk over me,
+
+00:30.120 --> 00:31.120
+you talked with me.
+
+00:31.120 --> 00:36.280
+You know, as much as I would like to say yes, that is possible, the fact that I did not
+
+00:36.280 --> 00:40.200
+have the sounds on your talk makes it very difficult for me to harmonize. You know, it's
+
+00:40.200 --> 00:48.200
+like try to have a barbershop quartet and they cannot hear one another. Try to tell
+
+00:48.200 --> 00:50.320
+them to harmonize. I'm not sure if it's going to work.
+
+00:50.320 --> 00:54.840
+I sang, actually sang in a barbershop chorus for a while and I know the pain that you're
+
+00:54.840 --> 00:59.400
+talking about. But anyway, it's water under the bridge.
+
+00:59.400 --> 01:04.640
+Yes, what a serendipitous discussion. I wasn't expecting this. Okay, you have the pad open
+
+01:04.640 --> 01:07.600
+in front of you. Do you want me to read the question or do you want to take them on your
+
+01:07.600 --> 01:08.600
+own?
+
+01:08.600 --> 01:09.600
+I'd be glad to do it.
+
+01:09.600 --> 01:10.600
+Right.
+
+01:10.600 --> 01:14.760
+All right, I'm just going to go start from the top here. I have not only one config,
+
+01:14.760 --> 01:20.200
+but multiple configs in different locations..emacs.init.el and.emacs.init.el and different
+
+01:20.200 --> 01:23.520
+Python installs in different places. This is something I should take care of earlier
+
+01:23.520 --> 01:27.880
+rather than later. I need to pay someone to consult on my config. Is this an existing
+
+01:27.880 --> 01:32.440
+business? Is there a place to barter a screen share for something else, a value in exchange?
+
+01:32.440 --> 01:36.720
+In any case, thank you for giving permission to have fun without the need for too much
+
+01:36.720 --> 01:37.720
+structure.
+
+01:37.720 --> 01:45.960
+That's, and that's, yeah, I feel humbled being asked this. I don't know how much insightful
+
+01:45.960 --> 01:51.240
+answers I can give here other than the fact that I did notice one of the talks that I
+
+01:51.240 --> 01:56.360
+really wanted to catch and resonate with was the Emacs buddy initiative. That was actually
+
+01:56.360 --> 02:00.680
+one of the points that I wanted to include in my talk, but it turns out that 10 minutes
+
+02:00.680 --> 02:07.260
+goes by incredibly fast when you, when the ideas are flowing. And I think that that's,
+
+02:07.260 --> 02:13.600
+that's probably one of the best advice that it, to sources is to find some kind of buddy
+
+02:13.600 --> 02:17.800
+who probably would be a great, especially someone who is, who is maybe at a similar
+
+02:17.800 --> 02:24.320
+or, or even a different experience or comfort level may be able to, you know, be a good
+
+02:24.320 --> 02:29.400
+exchange of value there. But yeah, I mean, that's, and again, it's something I'll think
+
+02:29.400 --> 02:33.760
+about more. I might not come up with the most interesting answers live.
+
+02:33.760 --> 02:38.120
+Oh, it's fine. Don't worry. You know, you don't have to worry about making the most
+
+02:38.120 --> 02:42.000
+exhaustive answer. You know, the whole point of, sorry, let me move myself to the left.
+
+02:42.000 --> 02:47.760
+Okay. Nevermind. I'm trying my best to composite the shot live. Yeah. You don't have to worry
+
+02:47.760 --> 02:52.680
+about making very exhaustive answer right now. Also, we have about 11 minutes. We might
+
+02:52.680 --> 02:56.040
+open up the chat. So you have a lot of questions. So I think a lot of people are very interested.
+
+02:56.040 --> 03:01.560
+I think, you know, when you have the arguments that you're trying to valorize the box standard
+
+03:01.560 --> 03:05.720
+user of Emacs, I think everyone is feeling very invested into the talk and might want
+
+03:05.720 --> 03:10.120
+to ask questions. So I'm giving you a heads up people. If you now is the last chance you
+
+03:10.120 --> 03:14.920
+have, we are the last talk of the day, barring the closing remarks. If you have questions
+
+03:14.920 --> 03:18.800
+to ask, now is the time to join DBB. We'll be opening it in two minutes. And in the meantime,
+
+03:18.800 --> 03:22.120
+John, feel free to go back to the question and answer as many as you can.
+
+03:22.120 --> 03:26.480
+Thank you. And I would love to talk about this with people in the community forever.
+
+03:26.480 --> 03:31.760
+So this is not the last chance to talk about it. All right. How would you suggest Emacs
+
+03:31.760 --> 03:35.400
+developers, including package developers, interface with non-developer users and get
+
+03:35.400 --> 03:43.680
+their insights to help in shaping future Emacs functionality?
+
+03:43.680 --> 03:50.680
+You know, I think I've seen a lot of discussion on the mailing lists where this kind of exchange
+
+03:50.680 --> 03:55.880
+is wanted. You know, I think this is one of those things that may, it may always be difficult
+
+03:55.880 --> 04:00.960
+because I've, you know, I have some participation on both sides of this, if there are sides
+
+04:00.960 --> 04:06.860
+to it. And I think that most people agree that there's maybe could be a more tighter
+
+04:06.860 --> 04:13.800
+communication. So I don't think there's anybody out there who thinks that there's work to
+
+04:13.800 --> 04:18.040
+be done here. There's definitely effort that should be dedicated here. It seems to me like
+
+04:18.040 --> 04:22.320
+it's happening. I mean, this, you know, the Emacs survey was developed pretty closely
+
+04:22.320 --> 04:28.800
+from what I could see with the core maintainers. So I think that it's out there. I mean, perhaps
+
+04:28.800 --> 04:33.280
+the mailing list is a good place to start, the several ones of them. I think that you'll
+
+04:33.280 --> 04:38.480
+certainly get an answer and hopefully it will start a dialogue that can continue.
+
+04:38.480 --> 04:44.600
+All right. Next one. My impression that many common Emacs users are migrating to other
+
+04:44.600 --> 04:49.080
+editors in past years. The reasons cited are configurations growing out of control, general
+
+04:49.080 --> 04:53.240
+rough around the edges feel of Emacs, they've been putting up with for a while and maybe
+
+04:53.240 --> 04:59.960
+this isn't new. As a result, Emacs is becoming a smaller set of people. More invested, do
+
+04:59.960 --> 05:04.520
+you share this observation? So what do I think of the trend? And I'm sorry that I was talking
+
+05:04.520 --> 05:09.360
+over your editing there. I hope I didn't pressure you into stopping. I mean, my, my impression
+
+05:09.360 --> 05:13.680
+has been that that that's a thing of the past that was happening. My impression, I've been
+
+05:13.680 --> 05:19.480
+using Emacs for something like 25 to 14 to 15 years, depending on exactly when you start
+
+05:19.480 --> 05:24.160
+counting the time. It's been a long time for me and I haven't been very aware of things
+
+05:24.160 --> 05:28.440
+that whole time and become more and more aware and conscientious of the scene over the years
+
+05:28.440 --> 05:37.160
+recently. But those impressions are that it was getting less, less usage in past years,
+
+05:37.160 --> 05:43.260
+but it's, it's got, I think it's been increasing pretty quickly in recent years and increasing
+
+05:43.260 --> 05:52.120
+at a pretty high rate. So I don't, I don't necessarily disagree that there are different
+
+05:52.120 --> 05:56.640
+sets of people within the Emacs community who may, whose usages may be changing and
+
+05:56.640 --> 06:01.160
+maybe certain sets of within the community are shrinking and their investment levels
+
+06:01.160 --> 06:06.360
+are changing. But my, my, up until now, if you had asked me, it would have, I would have
+
+06:06.360 --> 06:14.080
+said that the Emacs user base was growing, changing and the usage of what they were,
+
+06:14.080 --> 06:18.080
+what they were counting on was, would, would have becoming, you know, more towards the
+
+06:18.080 --> 06:25.820
+popular, maybe away from what the core user base would have, would have focused on previous
+
+06:25.820 --> 06:32.020
+to that. But yeah, overall it seems to me like it's growing. And I think that where
+
+06:32.020 --> 06:38.120
+we are here and everyone who's gathered here today is, is evidence of that.
+
+06:38.120 --> 06:47.480
+And what do I think of that trend? I mean, I, I'm happy about it. I think, I mean, I,
+
+06:47.480 --> 06:53.240
+one of the things that I didn't have a chance to focus too much on in the talk was, was
+
+06:53.240 --> 07:00.120
+the power of that vanilla out of the box experience. I am a Viper, happy Viper user. I don't think
+
+07:00.120 --> 07:04.200
+there really are many others that I, at least ones that I know about and they may, they
+
+07:04.200 --> 07:08.520
+just may be the people that I was describing in my talk. They may be out there using Viper
+
+07:08.520 --> 07:13.760
+happily and they're, and they're dark matter. They're there and they make up maybe a huge
+
+07:13.760 --> 07:21.120
+amount of the universe, but you just maybe can't, it can't feel their effect. But, you
+
+07:21.120 --> 07:27.280
+know, I think that the, I'm glad that that usage is growing, if it is. But I also would
+
+07:27.280 --> 07:32.960
+hope that people continue to value that out of the box vanilla experience. Because I think
+
+07:32.960 --> 07:38.640
+that it gets, it's easy to overlook and I think it probably does get overlooked. And
+
+07:38.640 --> 07:41.840
+that may just be a necessary consequence of the fact that when things become popular,
+
+07:41.840 --> 07:47.720
+when things grow in popularity, they are, what gets focus and what gets coverage is
+
+07:47.720 --> 07:55.040
+those things that are more receptive and lend themselves better to, to popularity. And that's
+
+07:55.040 --> 08:00.760
+not necessarily the same as the things that are the most, it's not everything is really
+
+08:00.760 --> 08:05.480
+all I can say. There's more, there's always more to it than that. So I hope that as popularity
+
+08:05.480 --> 08:14.000
+grows, people won't forget those things and those things will stay, stay useful for everyone.
+
+08:14.000 --> 08:19.200
+Should I do the last one or should I stop? Oh, yeah, I might have some comments on this
+
+08:19.200 --> 08:22.720
+if no one shows up afterwards, but for now, yes, feel free to answer the last question.
+
+08:22.720 --> 08:28.080
+Okay. Do you consider that using one of the starter packages, do me max, space max, etc.
+
+08:28.080 --> 08:31.820
+affect that learning process that you mentioned? Or is it a good thing from your perspective?
+
+08:31.820 --> 08:35.000
+You know, that was another thing I wanted to mention in a talk that I didn't, that my
+
+08:35.000 --> 08:39.240
+10 minutes didn't allow, or maybe just the way that I talk in those 10 minutes didn't
+
+08:39.240 --> 08:44.920
+allow. I wanted to just acknowledge the fact that I don't have experience with them. I've
+
+08:44.920 --> 08:52.560
+been using GNU Emacs since, since I started using Emacs. I think they solve a problem
+
+08:52.560 --> 08:59.480
+for people. I think they have a place. But, you know, I think, I think some of the thoughts
+
+08:59.480 --> 09:04.560
+that I had been forming that I wasn't able to put in there about these was that you need
+
+09:04.560 --> 09:10.220
+to start wherever gets comfortable for you. And I think that no matter what you use, whatever
+
+09:10.220 --> 09:17.900
+you start with, I think you, you always get to the point where you feel like you've entrenched
+
+09:17.900 --> 09:25.920
+yourself in mindset or a set of habits that you use and you think it's, you want to change,
+
+09:25.920 --> 09:29.960
+you know that you should be able to change and grow, but you've just become accustomed
+
+09:29.960 --> 09:41.520
+to what you do. And I think that if, if using a starter package, if using a starter package
+
+09:41.520 --> 09:46.680
+gets you over that initial, you know, gets you into the things, if you feel like it's,
+
+09:46.680 --> 09:49.720
+it's going to limit your growth later on, I don't think it's necessarily because of
+
+09:49.720 --> 09:53.000
+what you chose. It's just, that's, that's just the feeling that everybody's going to
+
+09:53.000 --> 10:01.080
+feel eventually. Yeah.
+
+10:01.080 --> 10:05.080
+So sorry, John, I was talking with production. Are we, are you finished with the questions?
+
+10:05.080 --> 10:07.080
+It seems that you are, yeah.
+
+10:07.080 --> 10:11.760
+Yes, I believe I am. And I will, again, I will add better thoughts to these later on
+
+10:11.760 --> 10:12.760
+the pad.
+
+10:12.760 --> 10:18.040
+Yeah, but that's fine. I think you did a bang up. I'm French. I don't know if a bang up
+
+10:18.040 --> 10:20.200
+job is a good job. Can you confirm it for me?
+
+10:20.200 --> 10:22.040
+Yes, thank you. I appreciate that.
+
+10:22.040 --> 10:27.000
+Cool. Thank you. So it seems like we have Bob on for a question. So Bob was the speaker
+
+10:27.000 --> 10:31.600
+for the HyperOrc talk earlier today. So Bob, can you hear us?
+
+10:31.600 --> 10:34.120
+Yes, I can hear you great.
+
+10:34.120 --> 10:36.520
+And we can hear you as well.
+
+10:36.520 --> 10:39.040
+Can you see me? Let's see if...
+
+10:39.040 --> 10:41.040
+We cannot see you yet though.
+
+10:41.040 --> 10:47.880
+Okay. Yeah. I just started, start sharing. So I wanted to ask you, I mean, one of the
+
+10:47.880 --> 10:58.960
+things we really suffer from hyperbole, we have this issue that we try to make things
+
+10:58.960 --> 11:06.560
+as easy to use as possible, right? Just point and click, press this button and the magic
+
+11:06.560 --> 11:12.700
+happens. But because we are dealing with a domain that has a lot of complexity to it,
+
+11:12.700 --> 11:20.480
+we find, like you're saying, people have always done something a certain way. They bring whatever
+
+11:20.480 --> 11:28.440
+processes with them that they've used before. So it feels like there's a much heavier barrier
+
+11:28.440 --> 11:34.440
+to get regular users on board than there really should be from what we think we're producing
+
+11:34.440 --> 11:41.920
+in the software. So I wanted to get your perspective about what you think that might be and, you
+
+11:41.920 --> 11:47.080
+know, ways we could pursue tackling that.
+
+11:47.080 --> 11:51.640
+And by regular users, you mean ones who have already had a lot of time and...
+
+11:51.640 --> 11:57.760
+Emacs users who are not developers, not just not Emacs developers, but maybe they're non-technical
+
+11:57.760 --> 12:06.280
+at all. But they have to manage everyday information. They do emails, they do memos and whatever
+
+12:06.280 --> 12:10.720
+else they're processing.
+
+12:10.720 --> 12:20.840
+I'm not sure if... I don't know. This might not answer things to your satisfaction, but
+
+12:20.840 --> 12:28.760
+I'll, you know, be glad to keep the conversation going. But I wonder if... One of the things
+
+12:28.760 --> 12:33.680
+I was thinking of is that it's very easy to generate, I think, a lot of psychic baggage
+
+12:33.680 --> 12:40.040
+with Emacs as you use it over time because you get... I think I mentioned this in the
+
+12:40.040 --> 12:46.600
+talk. It's very... It's hard to use it and not be aware of all the different cool functionalities
+
+12:46.600 --> 12:49.960
+that it's built on and the things that you can take advantage of. And part of that is
+
+12:49.960 --> 12:57.400
+that as you develop your own workflows, you are not only developing them, but you're,
+
+12:57.400 --> 13:02.000
+for pragmatic reasons, rejecting other things. But you don't, you know, you're still aware
+
+13:02.000 --> 13:05.280
+that you've done that and you're aware of all the different possibilities that you've
+
+13:05.280 --> 13:08.880
+kind of left behind, at least temporarily.
+
+13:08.880 --> 13:15.320
+I wonder... I think at some point that baggage can impede you. Definitely can. It can make
+
+13:15.320 --> 13:24.680
+you less open and feel less safe to try new things out. Especially if those things are...
+
+13:24.680 --> 13:30.320
+I think sometimes it scales with the more useful and exciting and maybe even... Oh,
+
+13:30.320 --> 13:34.920
+that's pretty... If it's going to be exciting and useful and significantly change things,
+
+13:34.920 --> 13:40.520
+you could maybe feel extra resistant to try them out because you're not sure that you
+
+13:40.520 --> 13:46.280
+want to deal with all that excitement. And sometimes, again, the more useful it is, maybe
+
+13:46.280 --> 13:49.200
+the more resistant you are.
+
+13:49.200 --> 13:55.000
+In the programming environment, you might consider the difference between Smalltalk
+
+13:55.000 --> 14:03.400
+and C. And Smalltalk has all this, like Lisp, all this great interactive capability, but
+
+14:03.400 --> 14:07.840
+you have the baggage of carrying this big image around that people didn't want many
+
+14:07.840 --> 14:14.280
+years ago when it was popular. And C had nothing and still largely has nothing, right? Except
+
+14:14.280 --> 14:22.040
+you've got Unix there. And so people stare at a blank screen. They have no dynamic support.
+
+14:22.040 --> 14:29.960
+Maybe they have tags, but very little tooling. And yet, C dominates over Smalltalk. So I
+
+14:29.960 --> 14:36.280
+think we're talking about a similar kind of problem that maybe the leap is so far for
+
+14:36.280 --> 14:42.400
+people that you need to give them a series in between to transition them from their very
+
+14:42.400 --> 14:48.480
+weak initial environment to something much, much stronger.
+
+14:48.480 --> 14:55.240
+Yeah, that's a good point. And that's actually something that I think of for myself and thus
+
+14:55.240 --> 15:01.480
+something I was thinking about in regards to my talk. When you know that you want to...
+
+15:01.480 --> 15:05.480
+Let's consider the kind of user that you're talking about and hyperbole. And by the way,
+
+15:05.480 --> 15:10.160
+I enjoyed your hyperbole talk, your hyper-org talk, but up until now I hadn't been familiar
+
+15:10.160 --> 15:14.720
+with it. So I may say things that don't make any sense. But let's say this user that you're
+
+15:14.720 --> 15:20.520
+talking about who you want to become more comfortable with hyperbole. I'll start from
+
+15:20.520 --> 15:26.280
+the perspective of let's say they know they want to become more comfortable with it, but
+
+15:26.280 --> 15:34.520
+they also are having trouble getting comfortable with that process. And so that's certainly
+
+15:34.520 --> 15:40.720
+something I thought about building for myself and suggesting in this talk of when you know
+
+15:40.720 --> 15:43.560
+that you want to accomplish something, when you know that you want to change some of your
+
+15:43.560 --> 15:54.400
+habits to call them out and really put your habits on display for yourself. And rather
+
+15:54.400 --> 15:58.680
+than trying to remember them and ingrain them into your finger muscle memory and all that
+
+15:58.680 --> 16:04.560
+is to make some space to have your habits be public, not public necessarily, but just
+
+16:04.560 --> 16:10.280
+explicit in your environment and allow yourself to be uncomfortable with new habits for a
+
+16:10.280 --> 16:18.760
+while and that break out of the habitual space, give yourself some kind of mnemonic structure
+
+16:18.760 --> 16:25.900
+that lets you do these things habitually that will eventually kind of become that mold into
+
+16:25.900 --> 16:30.760
+which the habits will grow on top of rather than just trying to go from one set of habits
+
+16:30.760 --> 16:37.080
+to a new set of habits. And I think Emacs is one of those things that is great for that
+
+16:37.080 --> 16:43.120
+because it's the text, and especially what you demonstrated in hyperbole in that it seems
+
+16:43.120 --> 16:50.040
+like it's very easy to just write some text up that can generate for you a cheat sheet
+
+16:50.040 --> 16:54.480
+and say I've been using this on the left side, instead I want to use this on the right side
+
+16:54.480 --> 16:59.120
+and maybe two buffers or something. And you don't have to worry about what it's called,
+
+16:59.120 --> 17:04.080
+you don't have to worry about how to execute it or the key sequence or the function. When
+
+17:04.080 --> 17:08.240
+you find one day you find yourself using something on the left side, I'd rather use this on the
+
+17:08.240 --> 17:19.000
+right. And maybe over time you can move away from that and try to make it be more automatic.
+
+17:19.000 --> 17:22.440
+But at least I think maybe the key there is just acknowledging that the things that are
+
+17:22.440 --> 17:34.520
+habitual or that you want to become habitual can start to give yourself training wheels.
+
+17:34.520 --> 17:40.880
+Right Jens, I'm very sorry I'm going to have to pause the conversation now. But don't leave
+
+17:40.880 --> 17:45.040
+quite yet, this was a very interesting discussion and I would love to participate a little more
+
+17:45.040 --> 17:48.440
+but we are actually preparing for the closing remarks in the background. But what I'm going
+
+17:48.440 --> 17:52.880
+to suggest, because I don't want you both to lose steam and the closing remarks, you
+
+17:52.880 --> 17:56.440
+can watch them in your own time, I'm just going to thank everyone really. So by all
+
+17:56.440 --> 18:00.400
+means if you want to continue the discussion, you can stay in the room, we are still going
+
+18:00.400 --> 18:04.360
+to be recording and if you want to continue the discussion for as long as you want, it's
+
+18:04.360 --> 18:08.800
+going to be all good for us. It just won't be streamed now but it will eventually be
+
+18:08.800 --> 18:29.760
+available. So if you want to join the discussion now,
+
+18:29.760 --> 18:34.640
+you only have to go to the talk page and you will be able to join there. I'm really sorry
+
+18:34.640 --> 18:38.720
+Bob, I'm going to have to end it off in 30 seconds because we need to move to the next
+
+18:38.720 --> 18:43.680
+room. So I'll leave you to say bye Bob if you want to.
+
+18:43.680 --> 18:48.680
+Okay, I will stay here and talk to whoever wants to talk.
+
+18:48.680 --> 18:54.120
+Great and Bob do you want to say bye? Bye, thanks John, I appreciate it.
+
+18:54.120 --> 19:01.120
+Okay see you in a bit, we'll be closing remarks in about one minute. Okay, really sorry for
+
+19:01.120 --> 19:04.720
+recording short, we are now off stream and you can keep talking and we are recording
+
+19:04.720 --> 19:07.960
+everything. Okay, see you in a bit, I have to rush.
+
+19:07.960 --> 19:10.720
+So yeah, again, I don't want to keep you from the closing remarks.
+
+19:10.720 --> 19:15.680
+No, I'm happy to talk to you. I think Leo just kept saying, well you can stay but I
+
+19:15.680 --> 19:21.360
+have to cut it off. So I guess he was just saying the recording. I don't care.
+
+19:21.360 --> 19:25.080
+Let me jump over to, there's another question that someone posted, I just want to make sure
+
+19:25.080 --> 19:28.240
+I don't ignore that and then I'll.
+
+19:28.240 --> 19:32.440
+The tip of the day package or some elaboration on that idea and Emacs help discovery for
+
+19:32.440 --> 19:36.160
+lay users, does that already exist?
+
+19:36.160 --> 19:40.960
+You know, I'm not, I can pretty, I don't know if the person who wrote this is, if it's
+
+19:40.960 --> 19:47.960
+plasma strike, but hopefully they'll see the recording later. I'm confident in saying that
+
+19:47.960 --> 19:52.840
+this does exist. I don't know what it is because I've never used it, I've never seen it, but
+
+19:52.840 --> 19:56.960
+I know that something like this must exist, so I'm confident in saying that it does.
+
+19:56.960 --> 20:01.280
+Yeah, I haven't seen it either.
+
+20:01.280 --> 20:07.000
+If not, I mean, it probably would be something that would be relatively easy to make. Not
+
+20:07.000 --> 20:12.480
+necessarily the person who wants this, but yeah, it's something that I could.
+
+20:12.480 --> 20:19.640
+That's kind of interesting. If you put an org or a high rollo file together of all these
+
+20:19.640 --> 20:27.440
+tips, it would be very easy to, yeah, have something on a timer that would just pop one
+
+20:27.440 --> 20:34.920
+up every so often or based on some action, but that's kind of an interesting learning
+
+20:34.920 --> 20:42.300
+technique. I certainly use that in some other packages where a lot of times you just X out
+
+20:42.300 --> 20:49.400
+of it right away, but for things that actually provide useful tips, you tend to read them
+
+20:49.400 --> 20:56.320
+and linger for a bit, right, before you move on, and that's a great way because, I mean,
+
+20:56.320 --> 21:04.000
+after decades of using Emacs, there's definitely packages in Emacs, libraries that I've never
+
+21:04.000 --> 21:11.040
+seen before, I didn't know were there, and that I sometimes find useful, so there's always
+
+21:11.040 --> 21:20.880
+a lot to discover, and that feature discovery is a difficult thing, because that's why we
+
+21:20.880 --> 21:26.220
+spend a lot of time documenting things, because like with the reference manual, hyperbole
+
+21:26.220 --> 21:34.080
+about 170 pages, I don't expect people to read the manual, but to use it in info and
+
+21:34.080 --> 21:39.380
+say I'm interested in the action button, okay, I'll just read that action button section,
+
+21:39.380 --> 21:47.020
+and that's really what it's intended for, and why we provide quick access. In fact,
+
+21:47.020 --> 21:55.800
+if you look at the menu structure, the pull-down menus for hyperbole, there's just one pull-down
+
+21:55.800 --> 22:05.660
+menu, but the submenus under there, each one has an about or a doc item, and when you click
+
+22:05.660 --> 22:10.600
+on that, it takes you exactly to the place in the manual, discussing the concept that's
+
+22:10.600 --> 22:18.120
+covered by that menu, so it makes it very easy for people, but I was wondering, you
+
+22:18.120 --> 22:26.200
+know, if you, I think you have a lot of good process-oriented thoughts, and I'll say, you
+
+22:26.200 --> 22:33.740
+know, if you know who Doug Engelbart is or was, I worked with him a bit, and he was always
+
+22:33.740 --> 22:40.560
+focused on you have to evolve your process while you evolve your technology, and clearly,
+
+22:40.560 --> 22:48.280
+a lot of the people in the Emacs developer community are sort of focused on the technology,
+
+22:48.280 --> 22:53.720
+which is common, right, even in corporations, and it's always sort of a struggle to get
+
+22:53.720 --> 23:00.160
+people to try to evolve both at the same time, so I'd be interested in sort of conversing
+
+23:00.160 --> 23:06.920
+along those lines about, you know, we've built, so we've built two levels, I think, in hyperbole,
+
+23:06.920 --> 23:12.280
+we've built the toolkit of primitives that you can build from, and customize to your
+
+23:12.280 --> 23:19.200
+own needs, but we haven't done a lot about, and people are always asking, well, what's
+
+23:19.200 --> 23:24.920
+the workflow that I should use to integrate it with, and we're like, you know, well, what's
+
+23:24.920 --> 23:30.280
+your knowledge workflow, you know, what sort of tasks do you have to do, and then we can
+
+23:30.280 --> 23:35.800
+tell you something, but it is one of those general kinds of things, you know, like I
+
+23:35.800 --> 23:43.240
+say, I use the K-outliner to capture requirements, because I want, when I share those requirements
+
+23:43.240 --> 23:49.360
+with people, I want them to say, you know, well, item 9a, let's edit this this way, because
+
+23:49.360 --> 23:53.760
+a lot of times, right, they can't interact with the document that directly, or they want
+
+23:53.760 --> 24:03.120
+me to maintain it, so I find that everything is numbered that way, in any sort of structured
+
+24:03.120 --> 24:14.560
+ideation process, to be extremely valuable, and so, but I think, you know, maybe, obviously,
+
+24:14.560 --> 24:19.180
+as you said, you haven't used that, but, and I've worked on a lot of other Emacs stuff,
+
+24:19.180 --> 24:27.480
+but I think it'd be valuable, you know, having some discussions with you, to talk about that,
+
+24:27.480 --> 24:34.720
+you know, perspective from somebody trying to grok something like this, or, you know,
+
+24:34.720 --> 24:45.680
+get deeper into Emacs, and I always feel like, like I'm developing some new software at work,
+
+24:45.680 --> 24:51.480
+and our company is kind of moving from being a more consulting company to a technology
+
+24:51.480 --> 24:58.720
+company, and I say, well, okay, we're doing this big, big set of applications, where's
+
+24:58.720 --> 25:03.860
+the market input? The business people kind of wave their hands and say, you know, we
+
+25:03.860 --> 25:11.900
+want something shiny, but we never get structured input from the actual clients that will be
+
+25:11.900 --> 25:17.120
+the users, until we build something and put it in their hands, and I'm like, that's too
+
+25:17.120 --> 25:25.760
+late, you know, and we need, so I think it's sort of true here, too, that it's very hard
+
+25:25.760 --> 25:32.400
+to just, you know, like if I said, let's just have 10 people who have never tried hyperbole,
+
+25:32.400 --> 25:37.360
+look at it, go through a process, and just write one page on their experience, you know,
+
+25:37.360 --> 25:42.320
+but I think that'd be very hard to get that set of people together in general, you know,
+
+25:42.320 --> 25:44.720
+without effort, significant effort.
+
+25:44.720 --> 25:50.520
+That's a good point, because the people that would be able to use it, i.e. people who are
+
+25:50.520 --> 25:56.920
+already Emacs users for the most part, they're probably either already familiar with it,
+
+25:56.920 --> 26:03.360
+or busy, too, or maybe they have their own ways that they don't, they might be competent
+
+26:03.360 --> 26:08.800
+enough to do it, but not comfortable enough to do it, or not interested enough to do it.
+
+26:08.800 --> 26:12.720
+Maybe you have the intersection of all the different properties, which might be pretty
+
+26:12.720 --> 26:13.720
+small.
+
+26:13.720 --> 26:22.360
+Yeah, but just having those ideas, I think it helps us, you know, to shape, and I feel
+
+26:22.360 --> 26:33.040
+like we can take what we have and meld it, like what, if you saw Carl Volt's talk on
+
+26:33.040 --> 26:39.200
+his bi-directional links, I think that's a super valuable thing that we, you know, we
+
+26:39.200 --> 26:44.960
+haven't really considered much, but people talk about a lot as a result of work, having
+
+26:44.960 --> 26:48.040
+given them that capability for a while.
+
+26:48.040 --> 26:52.080
+That was Eduardo Oakes, was that Eduardo Oakes, or?
+
+26:52.080 --> 26:54.640
+No, no, that was not Eduardo.
+
+26:54.640 --> 27:00.120
+He's an interesting fellow, you know, it's like clearly very bright, but he lives in
+
+27:00.120 --> 27:08.120
+this academic-like bubble that, like, he wants to understand everything from the atomic level
+
+27:08.120 --> 27:15.840
+up in order to use it, so, you know, imagine, like, personally, you're what?
+
+27:15.840 --> 27:21.000
+I identify with that mindset, so I, so yeah, if you wanted to use toilet paper, would you
+
+27:21.000 --> 27:24.400
+try to understand the atomic composition?
+
+27:24.400 --> 27:31.320
+I'm just saying, he takes an extreme view, which may be, for him, that's what he finds
+
+27:31.320 --> 27:37.760
+work, so, but some interesting things come out of that, which is his EEV kind of stuff,
+
+27:37.760 --> 27:40.920
+which is very, very explicit, right?
+
+27:40.920 --> 27:48.960
+Everything is laid out, so it's bulky in a sense, but it, but he's got some good ideas
+
+27:48.960 --> 27:55.240
+on, like, tutorials and stuff, and he seems like he's more a scientist than a developer,
+
+27:55.240 --> 28:01.920
+so, you know, when we were trying to, I said, you could, the things you want to do, Hyperbole
+
+28:01.920 --> 28:07.200
+has a toolkit for, so just use Hyperbole, and then we'll help you shape whatever you
+
+28:07.200 --> 28:14.480
+want to do, and that's where we were never able to do that, because he'd say, well, okay,
+
+28:14.480 --> 28:21.920
+you have a button type that does what I want it to do, but now explain to me all the activation
+
+28:21.920 --> 28:27.280
+process for that, and I'm like, well, then you'd have to understand the, you know, the
+
+28:27.280 --> 28:32.240
+key parts of the Hyperbole code base, and you don't really need to, to do what we're
+
+28:32.240 --> 28:37.400
+talking about, so we can't, you know, that would take a long time, so let's not do that,
+
+28:37.400 --> 28:43.960
+and that never worked for him, so he decided to just build his own stuff, but then you
+
+28:43.960 --> 28:49.520
+look into that stuff, and it's sort of what you described in your talk, is, you know,
+
+28:49.520 --> 28:56.440
+it's not structured, it's, it's messy, it's, it's just sort of, you know, cobbled together,
+
+28:56.440 --> 29:06.320
+so he's got the same, he's got the same issue that it's, he doesn't want to do it just for
+
+29:06.320 --> 29:12.360
+his personal need, he wants, he wants this to be somebody that, something that people
+
+29:12.360 --> 29:18.000
+use, and so he gives talks and things like that, and he, so he, he's got this way of
+
+29:18.000 --> 29:23.720
+thinking that's very different than other people, that keeps his stuff away from people,
+
+29:23.720 --> 29:30.640
+but that's not his intention, it's just, you know, sort of the operational mechanics of
+
+29:30.640 --> 29:35.920
+the way it is, and I'd love, you know, I'd love to help him with that, or do something,
+
+29:35.920 --> 29:41.840
+he's a very nice fellow, but I haven't gotten him past the, you know, there are other abstraction
+
+29:41.840 --> 29:49.200
+levels besides the atomic level, let's, let's work on some of those levels, for him, you
+
+29:49.200 --> 29:53.040
+know, there's some sort of barrier, I think, there, so you're saying you're a little like
+
+29:53.040 --> 29:59.760
+that too? You have to get your hands on everything? Yeah, and I think that's, and full disclosure,
+
+29:59.760 --> 30:04.680
+I don't, I didn't have a lot of time to write, or to get in, I didn't have a lot of, like,
+
+30:04.680 --> 30:09.120
+in those 10 minutes to say everything I wanted to say, like, I'm not, I don't want to give
+
+30:09.120 --> 30:14.000
+the impression that I'm not a technical person, I am, I am a programmer, and I've been, like
+
+30:14.000 --> 30:18.880
+I said, I've been using Emacs for a very long time, just that over time, I probably, you
+
+30:18.880 --> 30:24.600
+know, just kind of have stayed in my personal sphere, and kind of worked, carved out a little
+
+30:24.600 --> 30:31.360
+thing that works for me, so I, my perspective might be a little surprising, to come up,
+
+30:31.360 --> 30:35.040
+you know, to people who might think, well, a talk like that, you're, you know, you're
+
+30:35.040 --> 30:40.520
+still a beginner, or you're still on the fringes, I'm like, no, I don't think I'm, I'm neither,
+
+30:40.520 --> 30:43.840
+neither beginner, feel like I'm a beginner, nor am I on the fringes of anything, I've
+
+30:43.840 --> 30:50.680
+just, my path has taken me through a certain way that is, is personal, it just happens,
+
+30:50.680 --> 30:57.880
+you know, but I think what you're saying earlier, is that, to identify, is, is that, that is
+
+30:57.880 --> 31:02.760
+one tension, the tension you were just mentioning, of, want to do something, but the Emacs is
+
+31:02.760 --> 31:08.120
+just one of those platforms where, where it's so, can entice you to do things, it can be
+
+31:08.120 --> 31:12.200
+so interesting and enticing to do certain things that you, it can lead to a lot of pain,
+
+31:12.200 --> 31:17.520
+and that you can, and confusion, where you can really want to learn something, and think,
+
+31:17.520 --> 31:22.240
+in your head, I'm always, you know, I'm, you know, I'm always thinking of, it was a dialogue
+
+31:22.240 --> 31:26.700
+with, you know, a dozen people when I used Emacs, a dozen other people whose, whose work
+
+31:26.700 --> 31:33.800
+I've read about, and developers, I've, I've read their works and stuff, of, it's hard
+
+31:33.800 --> 31:37.600
+to be doing something, and not be thinking about making it available for somebody else
+
+31:37.600 --> 31:43.640
+to use, I think it's, it's both very personal, and it's also hard to have a personal barrier,
+
+31:43.640 --> 31:48.240
+because I'm always, you know, I'm always thinking about, how would I expose this functionality
+
+31:48.240 --> 31:53.000
+for general purposes, how would I, how would I publish this, and so I can identify with
+
+31:53.000 --> 31:58.760
+that, and also, also, I want, you, you want to know, both, maybe there's just certain
+
+31:58.760 --> 32:02.880
+personalities, and mine would be one of them, where you really want to know why things are
+
+32:02.880 --> 32:06.600
+happening the way that they're happening, and I think Emacs is one of those places where,
+
+32:06.600 --> 32:11.520
+when you come in, you come in on the ground floor, and you see, wow, I can go up so high,
+
+32:11.520 --> 32:15.360
+but also, you, you can look down and say, well, there's a hundred floors below me, and
+
+32:15.360 --> 32:18.040
+you get torn, you know.
+
+32:18.040 --> 32:25.280
+I would ask a question like, do you, do you tend to look at the way Lisp primitives are
+
+32:25.280 --> 32:32.880
+implemented in C, or do you just focus on the documentation of the Lisp function, and
+
+32:32.880 --> 32:38.160
+then work from there, in terms of your Emacs, how far down you go?
+
+32:38.160 --> 32:40.200
+Good question.
+
+32:40.200 --> 32:41.200
+It's changed recently.
+
+32:41.200 --> 32:47.040
+I'd say, up until a couple years ago, I was mostly focused on the, on inside, you know,
+
+32:47.040 --> 32:52.400
+inside the Lisp machine, and going up, but I've started getting a little more curious
+
+32:52.400 --> 32:55.160
+about the C layer below that.
+
+32:55.160 --> 32:59.000
+One of the things I started looking at was some of the way that the key maps have been
+
+32:59.000 --> 33:06.920
+handled, the key, the map lookups were handled at the C level, because of the, my Viper,
+
+33:06.920 --> 33:14.640
+sort of affinity, my affinity for Viper, because there's some, some functionality there that
+
+33:14.640 --> 33:20.680
+changed or was made a little bit, the implementation was made a little bit different.
+
+33:20.680 --> 33:24.800
+So I guess, I guess both, but I, but I could understand that, yeah, there's, I, I never
+
+33:24.800 --> 33:30.640
+felt like I had to understand anything below that level, but just, it's good that.
+
+33:30.640 --> 33:37.640
+And do you go up, do you spend a lot of time thinking about the user level and user experience,
+
+33:37.640 --> 33:43.920
+user interfaces in your other work even, or, you know, just to get an idea of the sort
+
+33:43.920 --> 33:49.880
+of problems you'd like to sink your teeth into, you know, how you might provide some
+
+33:49.880 --> 33:55.280
+feedback on the hyperbole side, if you were to?
+
+33:55.280 --> 34:01.960
+I think I'm, I, I, in terms of technical stuff, I do like to stay more, I get more satisfaction,
+
+34:01.960 --> 34:10.320
+I think, thinking about the, the problem solving, especially in Emacs, just how to build, how
+
+34:10.320 --> 34:18.440
+to solve a problem in general, just, you know, UI level stuff or user experience stuff, I
+
+34:18.440 --> 34:25.640
+think it's just, it's, it's harder, it can be harder to do it right, but I guess that's
+
+34:25.640 --> 34:31.840
+something that I don't, I just haven't, I guess I haven't put, I guess I put more of
+
+34:31.840 --> 34:38.560
+my energy towards the, the middle tier of things of kind of just building general solutions.
+
+34:38.560 --> 34:43.400
+But if, but if it comes, I mean, I, hyperbole is definitely high, if not on the top of my
+
+34:43.400 --> 34:49.480
+list now, coming out of today's presentation and hearing about it today, of things to look
+
+34:49.480 --> 34:50.480
+at no matter what.
+
+34:50.480 --> 34:57.120
+So, I mean, I'm, I'm eager to learn more about it and use it from, from wherever, wherever
+
+34:57.120 --> 35:00.440
+I end up kind of landing on, on that, that spectrum.
+
+35:00.440 --> 35:07.600
+Well, I'm wondering if you might have some time to, so we have, there's two other people
+
+35:07.600 --> 35:11.040
+who gave the two other talks who work with me.
+
+35:11.040 --> 35:18.360
+We do a Sunday meeting, Sunday morning, East coast time, you know, one guy's on the development
+
+35:18.360 --> 35:22.840
+and the other is Ramin, who is a writer.
+
+35:22.840 --> 35:28.200
+And I mean, he's an ML engineer too, but he's new to hyperbole.
+
+35:28.200 --> 35:33.120
+So he's kind of, you know, converting some of what he did in a word to hyperbole.
+
+35:33.120 --> 35:39.120
+So he's kind of a good feedback loop for us there too.
+
+35:39.120 --> 35:45.400
+Matt and I have been, you know, deep in it for many years, so we can't, we can't see
+
+35:45.400 --> 35:47.040
+it in an unbiased way.
+
+35:47.040 --> 35:52.960
+And I'm just thinking, you know, maybe if you have a bit of time, you may want to, you
+
+35:52.960 --> 35:58.680
+know, think about giving us some structured feedback or, you know, coming to one of those
+
+35:58.680 --> 36:01.320
+meetings chatting with us.
+
+36:01.320 --> 36:02.320
+Yeah.
+
+36:02.320 --> 36:08.040
+You know, so, and I'm happy to answer your questions too, because I think, I just feel
+
+36:08.040 --> 36:14.840
+like there's, I'll tell you, this is, so my background with Emacs, besides as a user,
+
+36:14.840 --> 36:22.240
+I built something called InfoDoc, which was an extensive IDE to try to bring out Emacs
+
+36:22.240 --> 36:24.240
+functionality.
+
+36:24.240 --> 36:30.000
+Many years ago, it was an extensive set of menus, popup menus, pull down menus, and fixing
+
+36:30.000 --> 36:36.280
+a lot of stuff like, like in our mail, the keys and the interface wasn't the same between
+
+36:36.280 --> 36:39.800
+the summary buffer and the main buffer.
+
+36:39.800 --> 36:42.920
+And I, I normalized all that fixed stuff in Dura.
+
+36:42.920 --> 36:50.400
+All of that was like all rolled into InfoDoc so that a lot of these warts that people talk
+
+36:50.400 --> 36:57.320
+about that still are there to this day, some of them I see got put together and that was
+
+36:57.320 --> 37:06.680
+just built to top Zmax, the fork, XZmax fork of, you know, when Jamie Zawinski was doing
+
+37:06.680 --> 37:07.680
+it.
+
+37:07.680 --> 37:12.480
+And so I, you know, I still use some of that with Gnuely Max, but I never took the time
+
+37:12.480 --> 37:14.280
+to repackage it and stuff like that.
+
+37:14.280 --> 37:15.800
+So that's sort of sitting out there.
+
+37:15.800 --> 37:21.880
+And then I built the OO browser, which was a small talk like a code browser for eight
+
+37:21.880 --> 37:24.680
+different object oriented languages.
+
+37:24.680 --> 37:30.320
+And that's sitting out there waiting for just a, I had it ready, largely ready except for
+
+37:30.320 --> 37:34.820
+some documentation and I have no time to work on it.
+
+37:34.820 --> 37:40.720
+So it's never been, the modern version hasn't been republished for people to use, but you
+
+37:40.720 --> 37:45.920
+know, it sort of tells you some of the areas that, that I've spent a lot of time in and
+
+37:45.920 --> 37:49.300
+I've built some pretty big things.
+
+37:49.300 --> 37:53.760
+So I've gotten to see, you know, what's absorbable and what's not.
+
+37:53.760 --> 37:59.640
+And, you know, there is a lot of people sort of staying down at that low level that I think
+
+37:59.640 --> 38:05.840
+you do tend to run into with Emacs users, but there was like people love people who
+
+38:05.840 --> 38:07.960
+use the OO browser.
+
+38:07.960 --> 38:13.400
+That was a very good user experience because it was just very smooth and it had multiple
+
+38:13.400 --> 38:16.320
+windows and, you know, did what people wanted.
+
+38:16.320 --> 38:21.360
+And it was very fast because I focused on the algorithms and there was nothing else
+
+38:21.360 --> 38:23.400
+that could do what it could do.
+
+38:23.400 --> 38:29.480
+Now, now that we have all these language server protocols, which I still think are not quite
+
+38:29.480 --> 38:34.640
+where they should be on the backend, but you know, it's nice that now they're integrating
+
+38:34.640 --> 38:35.640
+Eclot.
+
+38:35.640 --> 38:41.160
+So I'm not a big user of those yet, but I hope to get more leverage out of them if they,
+
+38:41.160 --> 38:47.120
+in fact, you know, can give them, satisfy the queries that I really need in my work.
+
+38:47.120 --> 38:51.440
+So yeah, I think you'll find, you'll definitely find some utility.
+
+38:51.440 --> 38:57.720
+I think, you know, once you grok a bit, and I don't think it'll take you that long to
+
+38:57.720 --> 39:04.360
+get enough of a sense of hyperbole to start building a couple types, button types yourself
+
+39:04.360 --> 39:08.360
+and tailoring it to whatever your needs are.
+
+39:08.360 --> 39:13.800
+But as you said, I'm kind of interested in your thoughts about what will make that easier
+
+39:13.800 --> 39:22.120
+for people maybe with, maybe with not as much technical knowledge as you have.
+
+39:22.120 --> 39:27.280
+And just, you know, that you're willing to put yourself in somebody else's shoes, I think
+
+39:27.280 --> 39:33.080
+is a very valuable kind of way to be and something I'd like to.
+
+39:33.080 --> 39:40.160
+Well, I certainly, I'm willing to, willing to try, can't promise what my mindset will
+
+39:40.160 --> 39:43.360
+end up producing, but I, you know, it's, let's put it this way.
+
+39:43.360 --> 39:47.240
+If I could, if I could benefit from what you've created, benefit from learning about it, and
+
+39:47.240 --> 39:53.200
+at the same time, potentially give some benefit back, you know, that seems like it's a win-win-win.
+
+39:53.200 --> 39:55.200
+So I'm happy.
+
+39:55.200 --> 40:02.440
+Well, I'd be very surprised if you can't, but we, we accept that kind of feedback too,
+
+40:02.440 --> 40:06.700
+is that, you know, there's too much of a barrier to entry for this reason here.
+
+40:06.700 --> 40:10.760
+I love to hear those things too, because, you know, there have been things that weren't
+
+40:10.760 --> 40:19.480
+there that we've built after, like there's a guy, Sean, Sean something, he's like a business
+
+40:19.480 --> 40:24.760
+user who runs his business on this custom database that he's built.
+
+40:24.760 --> 40:28.840
+And he uses hyperbole as a front end to that backend database.
+
+40:28.840 --> 40:33.200
+He calls it, I forget it's hyper or something.
+
+40:33.200 --> 40:38.200
+And he, he has a lot of deeper thoughts, you know, very specific, like he'll write it with
+
+40:38.200 --> 40:40.880
+just one issue that he's trying to do.
+
+40:40.880 --> 40:44.440
+And sometimes, you know, we'll implement things for him.
+
+40:44.440 --> 40:46.640
+And that seems to work pretty well.
+
+40:46.640 --> 40:51.360
+Sometimes he wants things that are further afield, you know, and we don't go there,
+
+40:51.360 --> 40:58.000
+but he's, he's a useful, one of the users on the very low traffic hyperbole mail list.
+
+40:58.000 --> 41:03.560
+So he's probably responsible for 80% of the traffic, right?
+
+41:03.560 --> 41:05.960
+He's the Pareto subscriber.
+
+41:05.960 --> 41:06.960
+Yeah.
+
+41:06.960 --> 41:07.960
+Yeah.
+
+41:07.960 --> 41:16.040
+So, but I look forward to it and I think you'd like Ramin and Matt, Matt is an engineer for
+
+41:16.040 --> 41:25.680
+Spotify and he has implemented 260 test cases for hyperbole that are run against the three
+
+41:25.680 --> 41:30.040
+major versions of Emacs every time we commit.
+
+41:30.040 --> 41:36.200
+And that's proven to be very successful because, you know, sometimes we're modifying things
+
+41:36.200 --> 41:43.080
+at the engine level and who knows what, what set of button types that affects.
+
+41:43.080 --> 41:50.520
+So it works really well when we're, and we've had very good success that we have very few,
+
+41:50.520 --> 41:58.480
+you know, bugs that we don't know about already being found by users once we make a release.
+
+41:58.480 --> 42:01.760
+It seems like PlasmaStrike wants to jump in.
+
+42:01.760 --> 42:02.760
+I'm sorry.
+
+42:02.760 --> 42:03.760
+I didn't, wasn't.
+
+42:03.760 --> 42:07.120
+I did see your link earlier possibly by the Emacs dashboard and I opened it, it looked
+
+42:07.120 --> 42:08.120
+pretty cool.
+
+42:08.120 --> 42:12.560
+Bob, you might, you might, yeah.
+
+42:12.560 --> 42:23.080
+I've been getting my partner into LogSec with org, which is kind of like org-roam for knowledge
+
+42:23.080 --> 42:24.080
+bases.
+
+42:24.080 --> 42:29.920
+And I've been using that, having my knowledge base on LogSec.
+
+42:29.920 --> 42:36.720
+He could look at it, it's getting synchronized with sync thing and he can see how I do the
+
+42:36.720 --> 42:37.720
+stuff.
+
+42:37.720 --> 42:39.480
+He can replicate it if he wants to.
+
+42:39.480 --> 42:45.640
+Then I'm thinking about putting CRDT with Emacs so that we could both edit the same
+
+42:45.640 --> 42:50.120
+document in real time.
+
+42:50.120 --> 42:55.920
+And that way I can get Emacs to work with the same data set as org-roam and that way
+
+42:55.920 --> 43:01.920
+he doesn't have to learn absolutely everything that Emacs has to offer.
+
+43:01.920 --> 43:07.800
+There's also, I can use all that stuff if I want to use it.
+
+43:07.800 --> 43:08.800
+That's cool.
+
+43:08.800 --> 43:16.120
+I, you know, I've heard of that, but not necessarily, didn't know anything about it.
+
+43:16.120 --> 43:21.080
+So that's, I'm looking, you know, all I guess all I can say at this point is that it looks
+
+43:21.080 --> 43:22.080
+really cool.
+
+43:22.080 --> 43:29.200
+It's, does it sounds like you're saying it's front, it's easy to, easy accessible, easily
+
+43:29.200 --> 43:30.200
+to get into.
+
+43:30.200 --> 43:32.360
+Well, you can also put it on your phone too.
+
+43:32.360 --> 43:39.360
+So it would probably be a really good way of doing that, even though it's harder to
+
+43:39.360 --> 43:48.160
+get Emacs on your phone and on iPhones as well.
+
+43:48.160 --> 43:52.400
+You got to figure out, that's what people were asking about, touchscreens.
+
+43:52.400 --> 43:55.640
+Have we thought about how to use touchscreens?
+
+43:55.640 --> 44:00.800
+I think it's an interesting challenge for Emacs, you know, you even talk about mouse
+
+44:00.800 --> 44:07.840
+buttons and people kind of freak out a lot of times because they're so keyboard driven.
+
+44:07.840 --> 44:14.200
+Well, one of the great things about Emacs is it's a keyboard is a first citizen and
+
+44:14.200 --> 44:19.200
+mouse can't be a first citizen because you're going to have to switch between it and all
+
+44:19.200 --> 44:21.200
+the time.
+
+44:21.200 --> 44:28.560
+If you go back to Engelbart's work, it was one hand on the mouse, one hand on the keyboard.
+
+44:28.560 --> 44:37.320
+And you know, we do miss some of that, that ability to point at things and make operations
+
+44:37.320 --> 44:38.320
+on them.
+
+44:38.320 --> 44:45.160
+We have things like Avi, I believe it is, right, for where you can move around across
+
+44:45.160 --> 44:47.720
+windows and buffers very rapidly.
+
+44:47.720 --> 44:53.400
+So you can get to like an exact point in a buffer much faster, and then you could act
+
+44:53.400 --> 44:55.120
+on it, you know, doing it that way.
+
+44:55.120 --> 44:57.720
+So it's kind of like a replacement for that.
+
+44:57.720 --> 45:03.300
+But it's amazing when you start to think a little differently like that.
+
+45:03.300 --> 45:07.720
+And certainly people have done that with split keyboards and they, some people only use half
+
+45:07.720 --> 45:09.600
+of the keyboard then.
+
+45:09.600 --> 45:12.920
+So and they have all the modifier keys, you know, that's what we're doing.
+
+45:12.920 --> 45:18.080
+In fact, Hyperbole has a module that isn't active, but it's sitting out there.
+
+45:18.080 --> 45:24.500
+And it turns the mouse keys into two modifier buttons.
+
+45:24.500 --> 45:28.720
+So it could be control and meta, or whatever have you.
+
+45:28.720 --> 45:34.400
+And so if you want to operate that way, you can emulate what Engelbart was doing with
+
+45:34.400 --> 45:38.440
+your regular keyboard and the mouse.
+
+45:38.440 --> 45:44.520
+Didn't that, didn't he have like a weird mouse where it had like more buttons on it?
+
+45:44.520 --> 45:47.520
+He was three buttons, actually, yeah.
+
+45:47.520 --> 45:50.080
+He had the chord keyboard you're thinking of.
+
+45:50.080 --> 45:56.840
+The keyboard was like five keys that you could press as chords.
+
+45:56.840 --> 46:02.120
+So you could press all five or three of them, and they would produce different character
+
+46:02.120 --> 46:03.120
+outputs.
+
+46:03.120 --> 46:05.880
+I mean, they had a lot of things that we don't have.
+
+46:05.880 --> 46:13.520
+You know, their file system was node based, and so everything could be hyperlinked to.
+
+46:13.520 --> 46:17.440
+And they had permanent IDs everywhere, and they had journals.
+
+46:17.440 --> 46:22.120
+And they had implemented almost all of this in assembly at first, and it was on a time
+
+46:22.120 --> 46:23.120
+shared machine.
+
+46:23.120 --> 46:26.800
+So everything was collaborative instead of individual.
+
+46:26.800 --> 46:30.680
+But you know, so we'll get there eventually.
+
+46:30.680 --> 46:36.320
+It's a lot of, a lot of things have changed that we've had to, you know, fight against
+
+46:36.320 --> 46:38.800
+separating people from collaborating.
+
+46:38.800 --> 46:44.760
+And now everybody's trying to get back to you and say, let's build collaborative software.
+
+46:44.760 --> 46:50.320
+Yeah, I noticed that's another, another one of those cycles that I noticed was the talk
+
+46:50.320 --> 46:57.080
+of, I forget who, it was the guy who did the SQLite thing and how he, how he was basically
+
+46:57.080 --> 47:03.720
+saying, hey, text is great, but these, these somewhat relational databases have a lot of
+
+47:03.720 --> 47:04.720
+things to offer.
+
+47:04.720 --> 47:07.200
+And I'm thinking, yeah, of course, I agree.
+
+47:07.200 --> 47:12.160
+But it's just funny how so much of the Emacs ethos has been, text can do so much, and they
+
+47:12.160 --> 47:13.160
+were right.
+
+47:13.160 --> 47:18.560
+And then now, like, this is, it's like a turning point to say, hey, text can't do all these
+
+47:18.560 --> 47:22.160
+things, but let's use Emacs to take advantage of all this non-text stuff too.
+
+47:22.160 --> 47:27.600
+That's just, that's just one of those, kind of those cyclical things of where we do what
+
+47:27.600 --> 47:31.360
+we can with text, and then someone notices that, hey, we, maybe we could do something
+
+47:31.360 --> 47:35.360
+without text, and then that, that balance might shift and just go back and forth.
+
+47:35.360 --> 47:39.560
+And it sounds like it's the same, like you're talking about with collaboration.
+
+47:39.560 --> 47:43.840
+Have you ever seen VisiData?
+
+47:43.840 --> 47:53.440
+It's a curses program that one guy has written that can manipulate any sort of tabular information.
+
+47:53.440 --> 48:00.360
+It's the, it's the Emacs of, like, you don't want to use a spreadsheet, and you want to
+
+48:00.360 --> 48:02.720
+do data analysis.
+
+48:02.720 --> 48:04.360
+It's pretty unbelievable what's in there.
+
+48:04.360 --> 48:06.560
+It's written in Python.
+
+48:06.560 --> 48:15.600
+But he has asynchronous slurping of super large CSVs that are compressed and encrypted.
+
+48:15.600 --> 48:17.600
+So it's basically like a Unix tool.
+
+48:17.600 --> 48:23.600
+You can use a command line wise, but then it gives you a curses interface, and you can
+
+48:23.600 --> 48:27.040
+slice and dice and get histograms.
+
+48:27.040 --> 48:28.040
+So it's kind of amazing.
+
+48:28.040 --> 48:30.680
+I tried, the key bindings were so different.
+
+48:30.680 --> 48:35.560
+I did some work to try to make it more Emacs-like in that.
+
+48:35.560 --> 48:40.600
+But he would have something that would be so valuable if it wasn't connected to the
+
+48:40.600 --> 48:41.600
+curses interface.
+
+48:41.600 --> 48:46.720
+You know, it was an API, and, but he likes it that way.
+
+48:46.720 --> 48:49.200
+And so he just keeps developing it.
+
+48:49.200 --> 48:55.440
+But it's really amazing if you have to process a lot of data and don't want to use Excel
+
+48:55.440 --> 48:56.440
+or something.
+
+48:56.440 --> 49:00.280
+That's with a Z, Visi or S, or?
+
+49:00.280 --> 49:02.280
+No, V-I-S-I-D-A-T-A.
+
+49:02.280 --> 49:05.160
+You'll find it.
+
+49:05.160 --> 49:12.000
+It's his name is Paul Swanson.
+
+49:12.000 --> 49:13.200
+It's not Swanson.
+
+49:13.200 --> 49:17.000
+It's something like that, though.
+
+49:17.000 --> 49:18.520
+I think it is.
+
+49:18.520 --> 49:22.640
+I think according to his website, according to the website, it says Saul Pwonson.
+
+49:22.640 --> 49:23.640
+So I'm guessing that.
+
+49:23.640 --> 49:24.640
+Yes, Saul Pwonson.
+
+49:24.640 --> 49:25.640
+I get it backwards.
+
+49:25.640 --> 49:26.640
+I was Paul Swanson.
+
+49:26.640 --> 49:31.640
+Yeah, he's a great guy.
+
+49:31.640 --> 49:32.640
+That's another thing on my list.
+
+49:32.640 --> 49:33.640
+It'll go.
+
+49:33.640 --> 49:34.640
+Yeah, check it out.
+
+49:34.640 --> 49:38.400
+Don't blow your mind what's in there.
+
+49:38.400 --> 49:43.960
+And again, it's like there's a small community, but it's like all these people that it's such
+
+49:43.960 --> 49:51.360
+a simple download, you know, it's a standalone executable, but largely, you know, people
+
+49:51.360 --> 49:52.440
+just don't know about it.
+
+49:52.440 --> 49:58.680
+I tripped over it and I'm like, my God, how do you get this far without me hearing about
+
+49:58.680 --> 49:59.680
+it?
+
+49:59.680 --> 50:01.240
+I think that's one of those.
+
+50:01.240 --> 50:06.840
+Maybe it's a case where if you don't get a lot of attention, you end up doing things
+
+50:06.840 --> 50:12.120
+in a way that you take things in the direction that you want to take them.
+
+50:12.120 --> 50:15.720
+And sometimes that leads to a bad place and sometimes it leads to a really interesting
+
+50:15.720 --> 50:16.720
+and good place.
+
+50:16.720 --> 50:23.120
+And it's probably somewhere in between that seems like he's taking this to a place.
+
+50:23.120 --> 50:28.360
+He had some usability issues and then he got like two other people on the team and they
+
+50:28.360 --> 50:34.360
+really helped him, I think with that, you know, he takes feedback pretty well and the
+
+50:34.360 --> 50:36.440
+team takes feedback well.
+
+50:36.440 --> 50:40.160
+So they've been evolving it, you know, from version one to like, I think they're on three
+
+50:40.160 --> 50:46.160
+now and you know, it's come a long way that way too.
+
+50:46.160 --> 50:52.120
+And now he's got a job, I believe, where he can work on it as well.
+
+50:52.120 --> 50:58.280
+So yeah, that should advance it a lot too.
+
+50:58.280 --> 51:03.960
+So yeah, there's so much good stuff going on, you know, and it's just what's not going
+
+51:03.960 --> 51:08.760
+on is sort of what we had long ago was the reusability.
+
+51:08.760 --> 51:13.560
+Nobody's really building libraries anymore, you know, that people can build on.
+
+51:13.560 --> 51:20.320
+It's all like, well, we got to wrap a web app around our API and that's it.
+
+51:20.320 --> 51:24.920
+And we're not going to make the code underlying the API shareable.
+
+51:24.920 --> 51:28.960
+You have to consume it, but that's all you can do.
+
+51:28.960 --> 51:35.160
+And so I think where everybody's rebuilding the same things again and again now, because
+
+51:35.160 --> 51:43.840
+sort of what Stallman talks about, that sharing culture has been snuffed out so broadly, you
+
+51:43.840 --> 51:49.520
+know, in terms of what people spend most of their waking hours on, right?
+
+51:49.520 --> 51:54.880
+As professional developers and, you know, you kind of miss it, right?
+
+51:54.880 --> 52:00.240
+From when you could, because having written that old browser, I mean, what I would do,
+
+52:00.240 --> 52:03.720
+what I remember doing is saying, okay, here's a thousand classes.
+
+52:03.720 --> 52:09.040
+I'll just run my browser over it and get to understand the interrelationships.
+
+52:09.040 --> 52:13.060
+And it's like, well, where are those like, you know, they're out there, there's still
+
+52:13.060 --> 52:18.540
+numerical libraries and things, but you just don't have the ecosystem because the energy
+
+52:18.540 --> 52:25.680
+is going somewhere else, you know, to the finished products, more than reusable building
+
+52:25.680 --> 52:26.680
+blocks.
+
+52:26.680 --> 52:27.680
+I think.
+
+52:27.680 --> 52:28.680
+Yeah.
+
+52:28.680 --> 52:30.480
+Have you heard of Glorious Toolkit?
+
+52:30.480 --> 52:35.680
+I think that's what it's called, but it's a continuation of Smalltalk and it has a lot
+
+52:35.680 --> 52:40.840
+of concepts like that where you have multiple representations of the same data.
+
+52:40.840 --> 52:46.480
+Like the, also that Mother of All Demos where Engelbarton was doing that.
+
+52:46.480 --> 52:47.480
+Yeah.
+
+52:47.480 --> 52:48.960
+I know, I've seen that many times.
+
+52:48.960 --> 52:53.560
+I got to work with Doug maybe for a year or so.
+
+52:53.560 --> 52:58.320
+By the way, Plasma Strike, I'm going to put that on my queue to watch because I've never
+
+52:58.320 --> 52:59.320
+actually watched.
+
+52:59.320 --> 53:00.320
+I know about it.
+
+53:00.320 --> 53:01.320
+Oh yeah.
+
+53:01.320 --> 53:02.320
+It's great.
+
+53:02.320 --> 53:03.320
+It's great.
+
+53:03.320 --> 53:05.040
+It's nice to see him as a young man too.
+
+53:05.040 --> 53:09.800
+Like that was 1968, he started like 1957 or something.
+
+53:09.800 --> 53:13.480
+The stuff they had before 1960 is incredible.
+
+53:13.480 --> 53:17.880
+There's also another spreadsheet, like what you're talking about, but an Emacs and that
+
+53:17.880 --> 53:23.240
+talk right there too, but yeah.
+
+53:23.240 --> 53:28.520
+All this, I mean, just those initial tips, you know, I was finding stuff that I need.
+
+53:28.520 --> 53:34.960
+So I like that idea, I think might do something with that if we can get a good database and
+
+53:34.960 --> 53:43.340
+link it into Hyperbole with some simple exposure that kind of gets people into some of this
+
+53:43.340 --> 53:48.880
+but I'll tell you what I really want that I can't find.
+
+53:48.880 --> 53:52.560
+There's so much effort at low code environments now.
+
+53:52.560 --> 54:01.120
+I want a low code environment for spinning up web apps inside a company where it's not
+
+54:01.120 --> 54:02.880
+your focus.
+
+54:02.880 --> 54:05.260
+It's just for an internal app, right?
+
+54:05.260 --> 54:11.520
+Like we want to do say time tracking for one small team and we want to build it ourselves.
+
+54:11.520 --> 54:16.380
+You know, that's not the real use case, but if you took something like that, so you don't
+
+54:16.380 --> 54:21.520
+have a lot of resources, you don't have a lot of time, you know how to program, but
+
+54:21.520 --> 54:28.040
+you want something that lets you operate like you're building a Python command line thing,
+
+54:28.040 --> 54:30.940
+but you want it to be a web app.
+
+54:30.940 --> 54:37.320
+There's a cool project I saw for that that would be, that was a peer-to-peer KISS web
+
+54:37.320 --> 54:42.560
+browser.
+
+54:42.560 --> 54:48.220
+Because I've looked at a lot of these, you know, there's no code DB.
+
+54:48.220 --> 54:57.640
+The best one that I came to but has been hard to set up internally was, it's like from a
+
+54:57.640 --> 55:04.940
+German company, it's like designed in Germany and implemented in China, a lot or pieces
+
+55:04.940 --> 55:09.260
+of it, and what is it called?
+
+55:09.260 --> 55:14.200
+I'll have to look at my database.
+
+55:14.200 --> 55:20.560
+There's like something like Seaborn or something like that.
+
+55:20.560 --> 55:33.720
+There's a couple of projects that are named that way, but let's see, Seaborn, low code.
+
+55:33.720 --> 56:01.320
+Let's see something, find it, but, oh, low code, so there's something, it's amazing to
+
+56:01.320 --> 56:11.560
+me, oh, C table, that's it, C table, SEA table, that's kind of one we've been trying to get
+
+56:11.560 --> 56:15.400
+to work, but there's still limits.
+
+56:15.400 --> 56:23.720
+There's an environment where like if Emacs could let you do the mock-up of your web app
+
+56:23.720 --> 56:33.480
+using Lisp and then could be fully deployable onto a web stack, that would be, I mean, we
+
+56:33.480 --> 56:41.200
+have a web server, it's just a question of, and we have like C-based fast web servers
+
+56:41.200 --> 56:49.480
+that you could interface to Lisp, so I don't think like the capacity is the problem, but
+
+56:49.480 --> 56:56.760
+nobody's gone from providing the web server to here's how you could program the front
+
+56:56.760 --> 57:00.840
+end and connect it to the back end all in Lisp.
+
+57:00.840 --> 57:08.960
+That's one of my biggest issues is like, and you see it in the hyperbole work, is I want
+
+57:08.960 --> 57:10.920
+simplicity and uniformity.
+
+57:10.920 --> 57:19.080
+I can't like program in three languages at the same time, so I can't use JavaScript on
+
+57:19.080 --> 57:25.840
+the front end and Python on the back end and then have to deal with CSS as well.
+
+57:25.840 --> 57:26.840
+And HTML.
+
+57:26.840 --> 57:27.840
+Yeah.
+
+57:27.840 --> 57:28.840
+And HTML.
+
+57:28.840 --> 57:34.840
+It's like my mind just cracks up and I'm like, why do, and even if you were brought up that
+
+57:34.840 --> 57:42.880
+way, like how can you be a 22-year-old and say, oh, this is so simple, because they do,
+
+57:42.880 --> 57:43.960
+they say that all the time.
+
+57:43.960 --> 57:47.240
+Well, this is a really simple thing to do.
+
+57:47.240 --> 57:54.560
+I mean, yeah, if you're copying and pasting all your code, which is apparently what has
+
+57:54.560 --> 58:01.040
+become common now, right, is I'll just use this template, then yeah, that's simple.
+
+58:01.040 --> 58:03.760
+But what about building it originally?
+
+58:03.760 --> 58:09.720
+It's like, there's just so much for your mind to process.
+
+58:09.720 --> 58:17.080
+And there was something called Meta HTML, which was really cool when HTML first came
+
+58:17.080 --> 58:21.800
+out, and you're not going to be able to find this or even a reference to it, probably.
+
+58:21.800 --> 58:30.600
+But this was two guys from MIT, and they said, okay, instead of programming at the HTML level,
+
+58:30.600 --> 58:39.720
+let's write a list-like interpreter that uses HTML syntax, but will give you all the higher
+
+58:39.720 --> 58:42.160
+level programming constructs you need.
+
+58:42.160 --> 58:47.840
+And so you could write stuff that looked like HTML, but you'd be processing lists of things
+
+58:47.840 --> 58:55.280
+and manipulating the DOM in these very abstract ways and very little code.
+
+58:55.280 --> 59:01.800
+And again, you didn't have to mix a different syntax in like you have to now.
+
+59:01.800 --> 59:09.940
+It was great, and it wasn't a lot of code, and it worked, and nobody cared.
+
+59:09.940 --> 59:11.280
+Nobody did anything with it.
+
+59:11.280 --> 59:12.880
+It died on the vine.
+
+59:12.880 --> 59:21.520
+Well, we didn't need to endlessly measure every little mouse movement and eyeball engagement
+
+59:21.520 --> 59:23.440
+and then monetize it and analyze it.
+
+59:23.440 --> 59:27.320
+So you could focus on just doing what you needed to do.
+
+59:27.320 --> 59:28.320
+Yeah.
+
+59:28.320 --> 59:29.320
+Well, that's right.
+
+59:29.320 --> 59:30.320
+Friction drives.
+
+59:30.320 --> 59:32.200
+That's what I love.
+
+59:32.200 --> 59:37.280
+I'm stuck in a Microsoft environment now where there's a little bit of Linux here and there,
+
+59:37.280 --> 59:40.480
+but I'm either a Mac user.
+
+59:40.480 --> 59:47.840
+I've always been a Unix user, so Windows is enormously painful despite the strides that
+
+59:47.840 --> 59:50.840
+they've made.
+
+59:50.840 --> 59:55.440
+I always look at it, and I say, well, it's a brilliant business perspective because they
+
+59:55.440 --> 01:00:02.280
+know they create so many problems for people, so much friction that it creates enormous
+
+01:00:02.280 --> 01:00:10.240
+economic opportunities for many, many people, and that's what they do.
+
+01:00:10.240 --> 01:00:11.640
+They have WSL.
+
+01:00:11.640 --> 01:00:13.720
+Do you know about that?
+
+01:00:13.720 --> 01:00:17.720
+The Windows System for Linux, yeah.
+
+01:00:17.720 --> 01:00:21.840
+They had a guy working on that who was leading it, and they were just making stride after
+
+01:00:21.840 --> 01:00:30.720
+stride, and apparently some high-level executive probably did not like seeing this, and so
+
+01:00:30.720 --> 01:00:35.740
+they moved this guy off, and now it's like Microsofty.
+
+01:00:35.740 --> 01:00:41.360
+So now all you see come out of there is like we've improved Windows Terminal, and the whole
+
+01:00:41.360 --> 01:00:47.000
+WSL thing moves at a snail's pace now, and you have to think that wasn't just like the
+
+01:00:47.000 --> 01:00:53.460
+guy got promoted, but that there was a strategic decision that this was helping people too
+
+01:00:53.460 --> 01:01:00.920
+much to live in a non-Windows environment in their mind, and we can't be supporting
+
+01:01:00.920 --> 01:01:01.920
+that.
+
+01:01:01.920 --> 01:01:13.440
+I was going to say, even though if you say, I want to use Kubernetes or in Azure, they
+
+01:01:13.440 --> 01:01:20.880
+say, okay, use Linux VMs, so they'll do that all day long and tell you not to use Windows,
+
+01:01:20.880 --> 01:01:26.800
+so there is still parts of the company that are like that and are open to it, but they
+
+01:01:26.800 --> 01:01:31.560
+have it pretty well locked down.
+
+01:01:31.560 --> 01:01:37.520
+I think it goes in line with the attention economy where they want to control the computing
+
+01:01:37.520 --> 01:01:43.520
+experience, and you want to use Microsoft apps, Microsoft Office.
+
+01:01:43.520 --> 01:01:49.240
+We don't want to make sure that you can reach out too easily into other ecosystems.
+
+01:01:49.240 --> 01:01:54.800
+Embrace, extend, extinguish, right?
+
+01:01:54.800 --> 01:01:55.800
+Is that the...
+
+01:01:55.800 --> 01:01:56.800
+Yep.
+
+01:01:56.800 --> 01:01:57.800
+That's it.
+
+01:01:57.800 --> 01:02:04.160
+An interesting Windows feature is you can update Windows, see that it's all the way
+
+01:02:04.160 --> 01:02:10.040
+up to date, reboot it, wait a day, or wait a day, and all of a sudden you have more updates
+
+01:02:10.040 --> 01:02:13.040
+for like a week or something along those lines.
+
+01:02:13.040 --> 01:02:17.600
+I don't know of any other operating system that does that.
+
+01:02:17.600 --> 01:02:24.900
+You only have two minutes until your reboot is done, and then it's like it comes back.
+
+01:02:24.900 --> 01:02:29.240
+Now it's an hour, and then another half an hour, right?
+
+01:02:29.240 --> 01:02:33.400
+They only give you a little snippet.
+
+01:02:33.400 --> 01:02:38.360
+Is PlasmaStrike, by the way, is that stack that you're describing with LogSec and syncing
+
+01:02:38.360 --> 01:02:39.360
+and everything?
+
+01:02:39.360 --> 01:02:41.400
+Is that something that you've published any examples?
+
+01:02:41.400 --> 01:02:46.080
+I saw you said something in the IRC, but I just lost track of what was going on in IRC,
+
+01:02:46.080 --> 01:02:49.080
+so I'm sorry if I missed that.
+
+01:02:49.080 --> 01:02:51.020
+No, I haven't.
+
+01:02:51.020 --> 01:02:58.880
+This is although now I'm thinking about just putting a whole bunch of some resources together
+
+01:02:58.880 --> 01:03:06.220
+of HyperBowl does a really good job of showing you a knowledge base, plus enough configuration
+
+01:03:06.220 --> 01:03:14.760
+to use an EEV does a really good job of showing you enough in-source documentation to play
+
+01:03:14.760 --> 01:03:19.840
+it out and see how it actually works in practice.
+
+01:03:19.840 --> 01:03:23.800
+Our Chrome needs something like that, so I don't know if I'll...
+
+01:03:23.800 --> 01:03:30.080
+But you need some minimal config to work with that, so you can look at the more philosophy
+
+01:03:30.080 --> 01:03:38.000
+plus packages combination.
+
+01:03:38.000 --> 01:03:44.560
+How do you guys like the HyperBorg term, if we use that?
+
+01:03:44.560 --> 01:03:48.200
+Does that strike you as a little...
+
+01:03:48.200 --> 01:03:50.080
+Was that what you were going for?
+
+01:03:50.080 --> 01:03:52.480
+Were you trying to conjure up the Borg?
+
+01:03:52.480 --> 01:03:53.480
+Well, yeah.
+
+01:03:53.480 --> 01:03:59.960
+Well, Sasha came up with HyperOrg for hyperbole and org, and then I thought, well, it'd be
+
+01:03:59.960 --> 01:04:09.160
+funnier if we called it HyperBorg, because it kind of is like Stalvan talks about org
+
+01:04:09.160 --> 01:04:16.580
+wants to take you into this environment, and hyperbole certainly does too, so if we put
+
+01:04:16.580 --> 01:04:21.240
+the two together, we would definitely have something like the Borg.
+
+01:04:21.240 --> 01:04:26.800
+My impression, and I said something to Kielaro, I don't know if I spoke wrong, but my impression
+
+01:04:26.800 --> 01:04:31.920
+was that this was not something that was going to be created, this was just a way, just like
+
+01:04:31.920 --> 01:04:32.920
+a...
+
+01:04:32.920 --> 01:04:33.920
+Oh, right.
+
+01:04:33.920 --> 01:04:34.920
+It's just a...
+
+01:04:34.920 --> 01:04:39.200
+Yeah, the music kind of term, but I do want to do more work.
+
+01:04:39.200 --> 01:04:45.080
+I've joined the org mail list, and I mean, just I did a lot of work for that presentation
+
+01:04:45.080 --> 01:04:53.840
+and that sort of struck me, and I said, there's a certain level of work we need to do.
+
+01:04:53.840 --> 01:05:00.760
+Years ago, we were thinking we'd put hyperbole into Emacs, now that org is...
+
+01:05:00.760 --> 01:05:07.600
+There's no reason not to, and were it to be there, there are things that there's namings
+
+01:05:07.600 --> 01:05:14.360
+that we would correct, and the interface points to org, we would want to do something about
+
+01:05:14.360 --> 01:05:17.920
+and work out with them, especially the made a return key.
+
+01:05:17.920 --> 01:05:23.080
+That's the main, if we could resolve that between the two packages better, and we've
+
+01:05:23.080 --> 01:05:28.180
+done a pretty good job just on hyperboles in, but we've never talked to the org people
+
+01:05:28.180 --> 01:05:29.180
+about it.
+
+01:05:29.180 --> 01:05:33.160
+It kind of seems like the term would work better the opposite way, because org wants
+
+01:05:33.160 --> 01:05:39.400
+to go around and doesn't have that modularity that your package has.
+
+01:05:39.400 --> 01:05:45.080
+So you're suggesting like, let them give the key over to us, and then we'll support some
+
+01:05:45.080 --> 01:05:46.080
+of their...
+
+01:05:46.080 --> 01:05:50.880
+Well, it's more reading the board taking over everything, because org mode comes and they
+
+01:05:50.880 --> 01:05:51.880
+take over...
+
+01:05:51.880 --> 01:06:02.040
+All their code works with org mode, not K outline or markdown mode or anything along
+
+01:06:02.040 --> 01:06:03.040
+those lines.
+
+01:06:03.040 --> 01:06:08.240
+Yeah, more, so the board part comes more from the hyperbole side, yeah.
+
+01:06:08.240 --> 01:06:12.520
+Well, but maybe it's fitting in the long run, because no matter...
+
+01:06:12.520 --> 01:06:18.600
+Perhaps if you provide a, or if hyperbole provides a very convenient enhancement on
+
+01:06:18.600 --> 01:06:23.320
+top of how people used to use org mode, it'll just become part of org mode eventually.
+
+01:06:23.320 --> 01:06:31.400
+Yeah, that's something I can see too, is that they just become one big thing that Stallman
+
+01:06:31.400 --> 01:06:36.880
+doesn't like, because we do have a bit of that in all of them.
+
+01:06:36.880 --> 01:06:42.280
+I mean, I totally get what he's saying and I buy it, I'm kind of like a functional programmer
+
+01:06:42.280 --> 01:06:49.800
+and I like bottom up development, but people ask us all the time, okay, if you have four
+
+01:06:49.800 --> 01:06:55.360
+or five things in hyperbole, why don't you separate them into separate packages?
+
+01:06:55.360 --> 01:06:57.200
+And it was the same thing for Engelbart.
+
+01:06:57.200 --> 01:07:02.840
+Well, one, it would be a lot more overhead just in separate manuals and dealing with
+
+01:07:02.840 --> 01:07:04.480
+separate communities.
+
+01:07:04.480 --> 01:07:09.840
+We want everyone who uses it to have the same baseline experience.
+
+01:07:09.840 --> 01:07:15.560
+And so even though, yes, you could separate out the button functionality from the K-outliner
+
+01:07:15.560 --> 01:07:23.880
+and the Rolodex, and the Rolodex originally was a separate thing by itself, we find putting
+
+01:07:23.880 --> 01:07:29.200
+them all together gives people the same thing that Emacs provides, it's sort of, you don't
+
+01:07:29.200 --> 01:07:34.680
+have to use all of the libraries, but having them there ensures you that when somebody
+
+01:07:34.680 --> 01:07:42.640
+references it, it works and you have a lot fewer of those kinds of, well, I only have
+
+01:07:42.640 --> 01:07:47.720
+the subsystem, so when I invoke your code, it breaks.
+
+01:07:47.720 --> 01:07:52.400
+Yeah, I think, and I think, I mean, I don't think there's any, I don't personally have
+
+01:07:52.400 --> 01:07:56.480
+like a preference as to what the right direction is, I just acknowledge that the downsides
+
+01:07:56.480 --> 01:08:00.880
+and upsides of each choice, but one thing I have noticed is I think something, I think
+
+01:08:00.880 --> 01:08:07.280
+it was McGit, that's how I say it, but, you know, initially it was one thing and now I
+
+01:08:07.280 --> 01:08:13.880
+think it's turned into a dozen or maybe even a couple dozen different packages.
+
+01:08:13.880 --> 01:08:19.320
+And I remember I went to update it once and they had to, you know, navigate a few different,
+
+01:08:19.320 --> 01:08:25.640
+like, what's the word, combinatorial, you know, they had to go two or three levels of
+
+01:08:25.640 --> 01:08:30.560
+dependencies deep in each level or introduce two dishes, yeah.
+
+01:08:30.560 --> 01:08:37.360
+So yeah, that can happen, there's situations where you can see those downsides, where the
+
+01:08:37.360 --> 01:08:42.000
+more, you know, splitting things apart is...
+
+01:08:42.000 --> 01:08:48.280
+We're fighting with that at work right now, it's like, do we create more repos so we can
+
+01:08:48.280 --> 01:08:54.880
+deliver microservices or, you know, how do we split things out on the containers and
+
+01:08:54.880 --> 01:09:00.500
+it's very, very complicated and even, you know, with years, we've got years of experience
+
+01:09:00.500 --> 01:09:08.640
+with our architects and we're all like going back and forth on how far to go because one
+
+01:09:08.640 --> 01:09:13.360
+of the people is very worried that we get into that dependency hell kind of thing with
+
+01:09:13.360 --> 01:09:16.120
+some of our new get packages.
+
+01:09:16.120 --> 01:09:23.920
+So yeah, I wish there were easier solutions and that's, again, for hyperbole, there's,
+
+01:09:23.920 --> 01:09:28.600
+you know, there's none of it, there's no external dependencies, it's just what version of Emacs
+
+01:09:28.600 --> 01:09:36.140
+you're using and people don't realize that, yeah, they say, oh, it's so big, like, it's
+
+01:09:36.140 --> 01:09:43.600
+dependent on all this other stuff, but it's not, it's just, you know, I mean, it will
+
+01:09:43.600 --> 01:09:48.640
+leverage stuff, again, that's in core Emacs, but it won't require you to load a third party
+
+01:09:48.640 --> 01:09:52.360
+package just because, you know, it's useful or interesting.
+
+01:09:52.360 --> 01:10:00.960
+I think Emacs does a really good job on this because unlike the normal GUI apps, if I want
+
+01:10:00.960 --> 01:10:07.520
+to change my theme in Emacs, I get to change everything to a dark theme or white theme
+
+01:10:07.520 --> 01:10:17.120
+or whatever and unlike, and you can't really do that very in any way that shares any of
+
+01:10:17.120 --> 01:10:24.200
+the code or the settings with all your GUI applications, but also with a terminal, you
+
+01:10:24.200 --> 01:10:34.960
+miss out on a whole bunch more stuff because, well, you don't get GUIs or unless you're
+
+01:10:34.960 --> 01:10:46.400
+talking about TUI apps, but they're not really CLI apps because they're like a half stepchild,
+
+01:10:46.400 --> 01:10:50.120
+they don't get near as good themes because they can't integrate into all the packages
+
+01:10:50.120 --> 01:10:59.000
+near as well, you know, mouse and all the various other things like that.
+
+01:10:59.000 --> 01:11:02.160
+Where are you guys located?
+
+01:11:02.160 --> 01:11:04.200
+I'm in, I'm in Virginia.
+
+01:11:04.200 --> 01:11:07.880
+Oh, I just had guests from West Virginia.
+
+01:11:07.880 --> 01:11:09.880
+I'm in Connecticut.
+
+01:11:09.880 --> 01:11:10.880
+Utah.
+
+01:11:10.880 --> 01:11:11.880
+Oh, wow.
+
+01:11:11.880 --> 01:11:12.880
+Utah.
+
+01:11:12.880 --> 01:11:17.160
+So we're almost spanning the entire continent, almost.
+
+01:11:17.160 --> 01:11:23.200
+If we round up, we can consider it to be the case.
+
+01:11:23.200 --> 01:11:29.400
+I work with a lot of people in India, so we've got like a 12 hour difference much of the
+
+01:11:29.400 --> 01:11:30.400
+year.
+
+01:11:30.400 --> 01:11:37.200
+That's fascinating to try to work through all the time, but on Hyperbole, we have one
+
+01:11:37.200 --> 01:11:44.240
+guy in Sweden and one guy in Japan, so we're all over the map too.
+
+01:11:44.240 --> 01:11:51.680
+Yeah, I was involved with a little hobby group for something unrelated and we were in various
+
+01:11:51.680 --> 01:11:56.400
+countries and it was always, the best thing that we could do was just find the time at
+
+01:11:56.400 --> 01:12:03.440
+which all of us would be the least miserable and the least tired and not, you know, there
+
+01:12:03.440 --> 01:12:07.720
+was no good time for a meeting, there was just the least bad time.
+
+01:12:07.720 --> 01:12:15.840
+Well, I was struggling to finish up my presentation and just, you know, I would like want to show
+
+01:12:15.840 --> 01:12:21.840
+an example and then I'm like, well, I need to change the code a little bit so I go and,
+
+01:12:21.840 --> 01:12:26.840
+you know, I'd add capability and Hyperbole and it was just a lot more work than I expected.
+
+01:12:26.840 --> 01:12:31.900
+So November 4th was the deadline to send in your video.
+
+01:12:31.900 --> 01:12:36.520
+That came and went and then I couldn't touch anything until the weekend and I get maybe
+
+01:12:36.520 --> 01:12:38.680
+half a day with the holidays and stuff.
+
+01:12:38.680 --> 01:12:43.720
+So comes to be last night, still haven't sent the video in.
+
+01:12:43.720 --> 01:12:49.240
+You know, I had told them though a week ago that I'll do it live if I can't get the video
+
+01:12:49.240 --> 01:12:53.360
+in, but I'm like, you know, it'd be nice to have it recorded and they do all this stuff
+
+01:12:53.360 --> 01:12:54.360
+to it.
+
+01:12:54.360 --> 01:13:04.600
+So I finished the video at 5.30 in the morning and I just, you know, no, I was dead so I
+
+01:13:04.600 --> 01:13:11.440
+just uploaded it and I figured, you know, I had tested snippets before of how I recorded.
+
+01:13:11.440 --> 01:13:17.560
+So I sent the two of them, I go to bed, I get up and I have a message waiting.
+
+01:13:17.560 --> 01:13:23.280
+The video cuts off at 18 minutes and it was 36 minutes long and I'm like, oh, come on,
+
+01:13:23.280 --> 01:13:28.560
+it must be the software, like just can't handle a file that size and it's stupid.
+
+01:13:28.560 --> 01:13:32.080
+But I play it back on my system and it plays perfectly fine.
+
+01:13:32.080 --> 01:13:36.560
+And they gave me the checksum of the file, the size of the file, those matched up.
+
+01:13:36.560 --> 01:13:38.360
+So we knew we had uploaded a good thing.
+
+01:13:38.360 --> 01:13:42.320
+So I just went back to them and said, no, it works here.
+
+01:13:42.320 --> 01:13:47.280
+And then they went and researched and found, you know, it was their software and they were
+
+01:13:47.280 --> 01:13:48.480
+able to make it work.
+
+01:13:48.480 --> 01:13:50.580
+So I was good.
+
+01:13:50.580 --> 01:13:53.760
+But you know, that's like right at the edge.
+
+01:13:53.760 --> 01:13:56.480
+It's like 5.30 this morning.
+
+01:13:56.480 --> 01:13:57.480
+Yeah.
+
+01:13:57.480 --> 01:14:00.440
+And you haven't, and then you got some sleep after that?
+
+01:14:00.440 --> 01:14:01.440
+Yeah.
+
+01:14:01.440 --> 01:14:07.080
+I got up at like 9.30 so I'm running on a little, not too much sleep, but no, I was
+
+01:14:07.080 --> 01:14:14.100
+very happy because I got to, I actually, like Rahman who did his and he sort of had his
+
+01:14:14.100 --> 01:14:23.200
+face behind an Emacs window, transparency through the Emacs window.
+
+01:14:23.200 --> 01:14:27.960
+He spent like at least 20 hours, like just on the video part or something.
+
+01:14:27.960 --> 01:14:30.680
+I literally did one recording.
+
+01:14:30.680 --> 01:14:35.120
+I mean, I had done samples a little bit, but I sat down, I said, I'm just going to try
+
+01:14:35.120 --> 01:14:37.800
+to run through the whole thing, no breaks.
+
+01:14:37.800 --> 01:14:44.680
+I did both my face, you know, they were separating their face video from their audio for some
+
+01:14:44.680 --> 01:14:45.680
+reason.
+
+01:14:45.680 --> 01:14:50.800
+And they did all these separate tracks, one recording and threw it over the wall.
+
+01:14:50.800 --> 01:14:53.800
+So it was pretty good.
+
+01:14:53.800 --> 01:14:58.800
+I think it's easier to do with a longer video because I was in much the same situation.
+
+01:14:58.800 --> 01:15:06.800
+And if any organizers are reviewing this recording, you know, I was a day ahead of you, Bob.
+
+01:15:06.800 --> 01:15:12.960
+I submitted it a day before you and I went to sleep, I think roughly 24 hours before
+
+01:15:12.960 --> 01:15:15.000
+you did.
+
+01:15:15.000 --> 01:15:21.120
+But you know, it's, so I was scrambling to do a lot of those things too, but you know,
+
+01:15:21.120 --> 01:15:22.120
+because of my own fault.
+
+01:15:22.120 --> 01:15:28.120
+And again, if any organizers are listening, I sincerely apologize and thank you and admire
+
+01:15:28.120 --> 01:15:32.920
+your saintly level of tolerance and patience there.
+
+01:15:32.920 --> 01:15:41.840
+And I hope that they spend a lot of time and energy just hitting things with baseball bats
+
+01:15:41.840 --> 01:15:47.880
+after this conference, because I think that they've probably suppressed a lot of negative
+
+01:15:47.880 --> 01:15:52.520
+energy from having to process things like that.
+
+01:15:52.520 --> 01:15:55.520
+They're incredible.
+
+01:15:55.520 --> 01:16:03.960
+I said thank you like an hour into the conference because it was so, I was looking at all the
+
+01:16:03.960 --> 01:16:09.240
+detail they had and you know, you see the way it's grown from year to year that you
+
+01:16:09.240 --> 01:16:13.840
+could just tell there was a tremendous amount of effort put in to have all these different
+
+01:16:13.840 --> 01:16:15.880
+formats and dealing with it.
+
+01:16:15.880 --> 01:16:21.480
+People have disabilities and you know, I mean, they're just very thoughtful all around and
+
+01:16:21.480 --> 01:16:23.480
+a great set of people.
+
+01:16:23.480 --> 01:16:26.760
+So I think every year they get better at it.
+
+01:16:26.760 --> 01:16:27.760
+Yeah.
+
+01:16:27.760 --> 01:16:33.400
+Yeah, they're clearly, I like they took a DevOps kind of approach to it, which you can
+
+01:16:33.400 --> 01:16:40.580
+also see, I guess they have some people, they're using Ansible to maintain some of their environments.
+
+01:16:40.580 --> 01:16:44.920
+So it's like, wow, that's a pretty advanced way to do it.
+
+01:16:44.920 --> 01:16:50.760
+And it shows they struggled in parts, you know, it's like, like this, they had trouble,
+
+01:16:50.760 --> 01:16:57.320
+you know, I was asking multiple times, it's like, is the video going to be playable?
+
+01:16:57.320 --> 01:16:59.360
+And there'd like be no answer.
+
+01:16:59.360 --> 01:17:03.440
+And then it's like, okay, don't worry, we're taking care of it.
+
+01:17:03.440 --> 01:17:08.080
+But they couldn't say because they hadn't converted it the way they wanted to yet.
+
+01:17:08.080 --> 01:17:12.720
+And then they finally got there and they like 20 minutes before the presentation is when
+
+01:17:12.720 --> 01:17:21.760
+I guess I got on with you, right, plasma strike, and we did prep before prep.
+
+01:17:21.760 --> 01:17:24.880
+So it was a good experience.
+
+01:17:24.880 --> 01:17:30.920
+But I have to know, yeah, I thought I would have it done, no problem, November 4.
+
+01:17:30.920 --> 01:17:37.480
+So I think that and I did get very busy at work, but you know, that tells you something
+
+01:17:37.480 --> 01:17:40.840
+just about and I'm not, I don't do videos much.
+
+01:17:40.840 --> 01:17:43.040
+So that was part of the problem.
+
+01:17:43.040 --> 01:17:45.600
+Yeah, it's Yeah.
+
+01:17:45.600 --> 01:17:50.360
+I mean, I'd say the most concrete lesson that I learned, maybe not even a lesson so much
+
+01:17:50.360 --> 01:17:57.940
+as a as a punishment is that if I dare to submit anything next year, I'll, I'll make
+
+01:17:57.940 --> 01:18:01.040
+sure that I'm done recording it before I even propose it.
+
+01:18:01.040 --> 01:18:07.880
+Because I wouldn't want to have them wonder, is he gonna wait until the very end?
+
+01:18:07.880 --> 01:18:11.660
+Like, I'm gonna, I'm sure I am.
+
+01:18:11.660 --> 01:18:15.600
+So I will, I will have it done in the summer of 2023.
+
+01:18:15.600 --> 01:18:19.080
+And I will include it, I will upload it before I even submit it to them.
+
+01:18:19.080 --> 01:18:21.480
+Did you not get that message?
+
+01:18:21.480 --> 01:18:23.000
+Sasha was so nice about it.
+
+01:18:23.000 --> 01:18:29.200
+She's like, you know, it's really not a problem if you don't have time, you know, we can just
+
+01:18:29.200 --> 01:18:30.200
+cancel.
+
+01:18:30.200 --> 01:18:36.320
+And I'm like, I've never canceled on a talk before, so I'm gonna get it done, even if
+
+01:18:36.320 --> 01:18:38.320
+I have to do it live.
+
+01:18:38.320 --> 01:18:43.680
+Yeah, you know, I got I got similar ones got go ahead.
+
+01:18:43.680 --> 01:18:44.680
+How would that work?
+
+01:18:44.680 --> 01:18:48.040
+If you didn't know exactly how much time that you'd have for the talk?
+
+01:18:48.040 --> 01:18:50.160
+If you're going to do it all in advance?
+
+01:18:50.160 --> 01:18:57.640
+Oh, oh, for you, because it Yeah, well, you can take a shot.
+
+01:18:57.640 --> 01:18:58.640
+Don't give me a slot.
+
+01:18:58.640 --> 01:19:01.360
+You say I have a 20 minute video ready to go.
+
+01:19:01.360 --> 01:19:02.360
+Yeah, yeah.
+
+01:19:02.360 --> 01:19:07.560
+Or, I mean, and plus, I think it's also it would be it doesn't necessarily indicate that
+
+01:19:07.560 --> 01:19:12.200
+it's the final product, but it could be the final product, you could say, Okay, here's,
+
+01:19:12.200 --> 01:19:14.720
+here's 10 minutes or 15 minutes.
+
+01:19:14.720 --> 01:19:16.680
+And I will try to iterate on this.
+
+01:19:16.680 --> 01:19:21.840
+But if I if I default on this loan, so to speak, it's it serves as collateral, maybe
+
+01:19:21.840 --> 01:19:24.280
+it's not, not necessarily the final product.
+
+01:19:24.280 --> 01:19:28.320
+But if it needs to be the final product, they could use it that way.
+
+01:19:28.320 --> 01:19:33.440
+I think the thing that they're most worried about was just having to having to process
+
+01:19:33.440 --> 01:19:39.880
+things at the last minute and having to run it live, if necessary.
+
+01:19:39.880 --> 01:19:49.000
+So I don't think they they, you know, care that much about changing, you know, changing
+
+01:19:49.000 --> 01:19:50.000
+the length or so.
+
+01:19:50.000 --> 01:19:51.000
+Well, maybe they would, I don't know.
+
+01:19:51.000 --> 01:19:53.000
+But I guess that that would mess up the schedule.
+
+01:19:53.000 --> 01:19:56.520
+Well, the the subtitles were really popular, I understand.
+
+01:19:56.520 --> 01:20:05.240
+So that's, that's a big thing that would have been nice to have, which I imagine you're
+
+01:20:05.240 --> 01:20:06.240
+gonna process.
+
+01:20:06.240 --> 01:20:13.640
+Yeah, yeah, I, I, hopefully, I can, I can help them with with subtitling some of the
+
+01:20:13.640 --> 01:20:16.160
+things that didn't have them yet.
+
+01:20:16.160 --> 01:20:20.960
+Because, yeah, there's still a lot of work that I think needs to be done even after after
+
+01:20:20.960 --> 01:20:21.960
+the fact.
+
+01:20:21.960 --> 01:20:26.800
+And, you know, with transcribing these sessions, even not all of them, but at least some of
+
+01:20:26.800 --> 01:20:28.800
+the questions and answers and things.
+
+01:20:28.800 --> 01:20:35.760
+PlasmaStrike, did you that I hear that I understand you say that you you were a volunteer for
+
+01:20:35.760 --> 01:20:37.320
+managing the this year?
+
+01:20:37.320 --> 01:20:42.320
+No, I just I was just asking the question.
+
+01:20:42.320 --> 01:20:43.320
+I got you.
+
+01:20:43.320 --> 01:20:44.320
+No, I thought I heard you.
+
+01:20:44.320 --> 01:20:45.320
+I might have misheard something you said earlier.
+
+01:20:45.320 --> 01:20:46.320
+Are you Corbin?
+
+01:20:46.320 --> 01:20:47.320
+Me?
+
+01:20:47.320 --> 01:20:48.320
+Yeah.
+
+01:20:48.320 --> 01:20:49.320
+No.
+
+01:20:49.320 --> 01:20:50.320
+No.
+
+01:20:50.320 --> 01:20:51.320
+No.
+
+01:20:51.320 --> 01:20:52.320
+No.
+
+01:20:52.320 --> 01:20:53.320
+Okay.
+
+01:20:53.320 --> 01:20:56.560
+I thought you sounded like Corbin.
+
+01:20:56.560 --> 01:20:57.680
+You know him?
+
+01:20:57.680 --> 01:20:58.680
+Maybe a little bit.
+
+01:20:58.680 --> 01:20:59.680
+I can hear it a little bit.
+
+01:20:59.680 --> 01:21:00.680
+Okay.
+
+01:21:00.680 --> 01:21:06.360
+But you use, PlasmaStrike, you were saying that you you do use a lot of theming and things
+
+01:21:06.360 --> 01:21:12.160
+like that in terms of like your like various applications, like color themes and things.
+
+01:21:12.160 --> 01:21:21.960
+I've used various, I've Solarize, Doom themes, I think there's a Tron theme that I use, but
+
+01:21:21.960 --> 01:21:26.800
+now I'm just using the Modus themes, just simple black and white that's done really
+
+01:21:26.800 --> 01:21:27.800
+well.
+
+01:21:27.800 --> 01:21:28.800
+Yeah.
+
+01:21:28.800 --> 01:21:29.800
+Yeah.
+
+01:21:29.800 --> 01:21:30.800
+Simplicity.
+
+01:21:30.800 --> 01:21:32.680
+That was actually going to be one of the things that I wanted to mention in my talk.
+
+01:21:32.680 --> 01:21:36.400
+But again, those 10 minutes were turned out to be brutal.
+
+01:21:36.400 --> 01:21:41.560
+I wanted to mention how how people like like us and when I say us, I just mean I don't
+
+01:21:41.560 --> 01:21:47.680
+mean necessarily you two, just people that I was speaking for, are maybe a little bit
+
+01:21:47.680 --> 01:21:48.680
+scared of themes.
+
+01:21:48.680 --> 01:21:52.400
+You know, like I was going to mention that we like I try to stay the heck away from fonts
+
+01:21:52.400 --> 01:21:58.600
+and colors and things because I just, it's, I don't know if I have the bandwidth to keep
+
+01:21:58.600 --> 01:21:59.600
+them.
+
+01:21:59.600 --> 01:22:02.840
+I kind of just declare advanced bankruptcy on those and say, you know what, whatever
+
+01:22:02.840 --> 01:22:06.320
+it looks like, I'm going to live with it.
+
+01:22:06.320 --> 01:22:13.040
+I just look at like 20 themes, pick one that suits my taste and then live with that.
+
+01:22:13.040 --> 01:22:21.600
+So I found one called Cream Soddy, like cream soda, but S-O-D-Y and that's what I use as
+
+01:22:21.600 --> 01:22:26.960
+a dark theme and I find it, you know, very appealing in general.
+
+01:22:26.960 --> 01:22:34.000
+So, but yeah, I was noticing like the org people have so much, tweaking the visuals,
+
+01:22:34.000 --> 01:22:36.200
+you know, it was kind of amazing.
+
+01:22:36.200 --> 01:22:42.080
+Some people's presentations, I'm like, I'm really not into that.
+
+01:22:42.080 --> 01:22:47.600
+But I do have a feature in hyperbole, which is kind of cool.
+
+01:22:47.600 --> 01:22:52.960
+So there's this subsystem called high control, which lets you control your windows and your
+
+01:22:52.960 --> 01:22:53.960
+frames interactively.
+
+01:22:53.960 --> 01:23:00.800
+So it's, it's kind of like you go into a mode and it stays live until you quit.
+
+01:23:00.800 --> 01:23:04.920
+And so you can use regular insertion keys to manipulate things.
+
+01:23:04.920 --> 01:23:12.800
+One of the things it has in conjunction with a package called Zoom Frame is you can change
+
+01:23:12.800 --> 01:23:20.560
+your default face across like all your frames with one key, grow it, shrink it.
+
+01:23:20.560 --> 01:23:25.960
+And I found that, and not just the default face, but all the related faces so that everything
+
+01:23:25.960 --> 01:23:28.840
+stays a consistent size.
+
+01:23:28.840 --> 01:23:34.560
+Every time I would try any of the built-in things, I would always end up changing a face
+
+01:23:34.560 --> 01:23:38.840
+or multiple and something else would stay tiny.
+
+01:23:38.840 --> 01:23:40.360
+And it just annoyed the hell out of me.
+
+01:23:40.360 --> 01:23:43.120
+So I implemented that.
+
+01:23:43.120 --> 01:23:44.880
+This was in high control or Zoom?
+
+01:23:44.880 --> 01:23:54.080
+Yeah, it's in high control, the Z keys, you use I guess capital Z for make it bigger and
+
+01:23:54.080 --> 01:23:56.320
+lowercase Z to make it smaller.
+
+01:23:56.320 --> 01:23:58.680
+So you're zooming both ways.
+
+01:23:58.680 --> 01:24:04.600
+And the neat thing is that what high control has is a persistent prefix argument.
+
+01:24:04.600 --> 01:24:10.920
+So say like you want to move a window, say you want to move a frame two pixels at a time.
+
+01:24:10.920 --> 01:24:14.920
+So you set the prefix argument to two, and then every time you hit your arrow key or
+
+01:24:14.920 --> 01:24:17.960
+whatever moves it, it moves by two pixels.
+
+01:24:17.960 --> 01:24:21.440
+You can change that to 20 and it'll move by 20 pixels.
+
+01:24:21.440 --> 01:24:26.840
+And the 20 will apply to every successive operation until you change it.
+
+01:24:26.840 --> 01:24:29.560
+And to change it, you just hit a decimal point.
+
+01:24:29.560 --> 01:24:34.280
+So you can say period one, zero, and then you get a 10.
+
+01:24:34.280 --> 01:24:38.920
+Or just set it to zero and then it's off.
+
+01:24:38.920 --> 01:24:40.240
+And so it's very rapid.
+
+01:24:40.240 --> 01:24:47.680
+So you're doing these single keys NPF dot one, zero.
+
+01:24:47.680 --> 01:24:51.960
+And so you can string these together in your key series too.
+
+01:24:51.960 --> 01:24:54.440
+And you get this incredible operation.
+
+01:24:54.440 --> 01:25:02.480
+It can place frames at any of the corners or the top center of the screen too.
+
+01:25:02.480 --> 01:25:10.680
+And on a Mac, it will account for the toolbar and only grow so it doesn't overlap that.
+
+01:25:10.680 --> 01:25:15.240
+All these kind of fit and finish things are just pre-programmed in there.
+
+01:25:15.240 --> 01:25:20.360
+So when you're actually doing it, I mean, don't you hate that?
+
+01:25:20.360 --> 01:25:26.520
+It's like you expand your window programmatically and then half of it's off screen, right?
+
+01:25:26.520 --> 01:25:27.520
+For no reason at all.
+
+01:25:27.520 --> 01:25:29.560
+And then you got to go manipulate it.
+
+01:25:29.560 --> 01:25:36.400
+So I don't know, there was one time when I decided to do this and I just thought of those
+
+01:25:36.400 --> 01:25:41.200
+pain points and I took care of them all in there.
+
+01:25:41.200 --> 01:25:45.360
+So that's kind of a useful thing.
+
+01:25:45.360 --> 01:25:54.640
+And one guy, his fingers, if you saw the presentation, he was losing carpal tunnel like problems
+
+01:25:54.640 --> 01:25:56.120
+but very severely.
+
+01:25:56.120 --> 01:26:03.520
+So he went to voice control and he was using Emacs and he discovered high control.
+
+01:26:03.520 --> 01:26:09.720
+And he said that was like a life changer because he always wanted to manipulate his windows,
+
+01:26:09.720 --> 01:26:10.720
+his frames.
+
+01:26:10.720 --> 01:26:14.800
+And now he didn't have a good way because he couldn't hit all these keystrokes.
+
+01:26:14.800 --> 01:26:25.880
+And now he can just say those key sequences and it does it all for him very rapidly.
+
+01:26:25.880 --> 01:26:33.360
+Another guy, years ago I was working with, there's this brilliant guy named, oh God,
+
+01:26:33.360 --> 01:26:35.320
+this is, what is his name?
+
+01:26:35.320 --> 01:26:40.160
+Works for Google now and it's an Indian name.
+
+01:26:40.160 --> 01:26:44.340
+I forget his name, but he's been blind since birth.
+
+01:26:44.340 --> 01:26:50.000
+And he got a PhD in computer science and he's worked before Google.
+
+01:26:50.000 --> 01:26:54.560
+He worked at like Sun and just all the major companies.
+
+01:26:54.560 --> 01:27:02.680
+And I guess a lot of his work is on making technology accessible to the blind or disabled.
+
+01:27:02.680 --> 01:27:13.080
+So he wrote a package called EmacsSpeed, yeah, Raman, Raman is his name, TV Raman.
+
+01:27:13.080 --> 01:27:22.920
+And so EmacsSpeak is another whole environment that lets a blind person utilize Emacs as
+
+01:27:22.920 --> 01:27:25.200
+an advanced screen reader.
+
+01:27:25.200 --> 01:27:31.000
+Instead of reading you the whole screen, it knows what your context is and it just reads
+
+01:27:31.000 --> 01:27:32.180
+you appropriate stuff.
+
+01:27:32.180 --> 01:27:35.360
+So like he can understand code very rapidly.
+
+01:27:35.360 --> 01:27:39.640
+Additionally, he can change the speed of the voice so he can listen to something at five
+
+01:27:39.640 --> 01:27:41.440
+times speed and absorb it.
+
+01:27:41.440 --> 01:27:44.700
+So he can actually get a picture of code and manipulate it.
+
+01:27:44.700 --> 01:27:54.740
+So he and I got together years ago and he integrated it with Hyperbole and he was using
+
+01:27:54.740 --> 01:27:59.320
+Hyperbole to give a macro kind of capability in a lot of stuff.
+
+01:27:59.320 --> 01:28:01.120
+So I thought that was very cool.
+
+01:28:01.120 --> 01:28:06.880
+And he was just a very cool guy out in Silicon Valley.
+
+01:28:06.880 --> 01:28:10.840
+So glad to see he's done so well all this time.
+
+01:28:10.840 --> 01:28:17.400
+He's got an example config in his package.
+
+01:28:17.400 --> 01:28:21.920
+I don't know if it has your package configured inside of it or...
+
+01:28:21.920 --> 01:28:22.920
+I don't know.
+
+01:28:22.920 --> 01:28:23.920
+I haven't.
+
+01:28:23.920 --> 01:28:27.600
+He's got some for using CSS.
+
+01:28:27.600 --> 01:28:34.120
+I think that he was talking, something I read is it would change how the tones and voices
+
+01:28:34.120 --> 01:28:37.320
+that the voice was using.
+
+01:28:37.320 --> 01:28:38.320
+Right.
+
+01:28:38.320 --> 01:28:45.080
+The funny thing is that he's so devoted to his seeing eye dogs, right?
+
+01:28:45.080 --> 01:28:48.060
+He's had to have a number of them through his life.
+
+01:28:48.060 --> 01:28:54.200
+So he writes these fake press releases every time he releases a version and they're all
+
+01:28:54.200 --> 01:28:59.240
+named after the dog and the dog is making the announcement.
+
+01:28:59.240 --> 01:29:07.860
+It's like so and so is proud to announce Emacs, the friendliest dog release in history.
+
+01:29:07.860 --> 01:29:10.520
+So they're kind of fun to read.
+
+01:29:10.520 --> 01:29:16.920
+I've seen his messages on the mailing lists, rather I've seen his subject lines on the
+
+01:29:16.920 --> 01:29:21.400
+mailing list because I usually don't have, I don't give myself the time to read a lot
+
+01:29:21.400 --> 01:29:22.400
+of those messages.
+
+01:29:22.400 --> 01:29:27.840
+But now that I have that context, I'll dig into his messages and see because it sounds
+
+01:29:27.840 --> 01:29:28.840
+very interesting.
+
+01:29:28.840 --> 01:29:29.840
+Yeah.
+
+01:29:29.840 --> 01:29:30.840
+I mean, it would be.
+
+01:29:30.840 --> 01:29:39.880
+And if you're like my son has no problem seeing, but he has a bit of trouble processing words
+
+01:29:39.880 --> 01:29:41.880
+when he's reading.
+
+01:29:41.880 --> 01:29:46.840
+So he uses audible while he reads and it's too slow for him.
+
+01:29:46.840 --> 01:29:53.720
+So he uses audible at like twice the speed and finds that that really helps him understand
+
+01:29:53.720 --> 01:29:54.720
+passages.
+
+01:29:54.720 --> 01:30:01.040
+So it may have utility for people without visual disabilities too.
+
+01:30:01.040 --> 01:30:02.520
+Good point.
+
+01:30:02.520 --> 01:30:03.520
+Yeah.
+
+01:30:03.520 --> 01:30:09.800
+That's probably so much there that doesn't really get thought about because just think
+
+01:30:09.800 --> 01:30:11.440
+this is what, how we have to do it.
+
+01:30:11.440 --> 01:30:15.880
+It's in front of you, consume it, consume it the same way everybody else consumes it.
+
+01:30:15.880 --> 01:30:18.600
+And if you have trouble, then it's on you.
+
+01:30:18.600 --> 01:30:24.680
+Well, here's an interesting usability to bit, Robin, a different Robin, the Robin who
+
+01:30:24.680 --> 01:30:32.040
+works on hyperbole was showing me his presentation and he had the text of the presentation there.
+
+01:30:32.040 --> 01:30:37.460
+And every time he would say something, the word that he was saying would be highlighted
+
+01:30:37.460 --> 01:30:38.460
+on the screen.
+
+01:30:38.460 --> 01:30:41.520
+And I'm like, wow, that's very impressive.
+
+01:30:41.520 --> 01:30:45.440
+And it followed his speaking perfectly.
+
+01:30:45.440 --> 01:30:48.520
+I'm like, how did you do that?
+
+01:30:48.520 --> 01:30:55.920
+And he said, Oh, I'm just highlighting each word manually.
+
+01:30:55.920 --> 01:30:56.920
+Wow.
+
+01:30:56.920 --> 01:31:01.760
+Now that it's, it's like being a drummer, you know, he had such perfect cadence that
+
+01:31:01.760 --> 01:31:07.200
+I couldn't tell that this wasn't automated, that he did it so beautifully while he was
+
+01:31:07.200 --> 01:31:14.520
+speaking or, or watching him self speak, played back.
+
+01:31:14.520 --> 01:31:20.040
+It would have been nice if it was an automated thing, but apparently it takes the human to
+
+01:31:20.040 --> 01:31:21.040
+do it.
+
+01:31:21.040 --> 01:31:25.460
+I had to rig something up when I was recording my video, cause I, I wrote, I did it, I scripted
+
+01:31:25.460 --> 01:31:26.460
+it all.
+
+01:31:26.460 --> 01:31:31.240
+Um, and I, I just couldn't, I wasn't, I didn't have the mental bandwidth to try to memorize
+
+01:31:31.240 --> 01:31:32.440
+it at that point.
+
+01:31:32.440 --> 01:31:37.840
+So I just split everything up into, into half paragraphs basically, and tried to get it
+
+01:31:37.840 --> 01:31:43.720
+up as close to my camera as I could, um, scroll my mouse wheel.
+
+01:31:43.720 --> 01:31:48.040
+Every time I came to the end of a paragraph, I had to scroll the script with one hand and
+
+01:31:48.040 --> 01:31:52.200
+my other hand was controlling the slot, the so-called slide show, which was just paging
+
+01:31:52.200 --> 01:31:54.400
+through my org, my org outline.
+
+01:31:54.400 --> 01:32:01.240
+Um, and I think about five to 10 times I had to stop recording it because I, I scrolled,
+
+01:32:01.240 --> 01:32:05.320
+I got off sync with, with either my script or my outline or both.
+
+01:32:05.320 --> 01:32:10.200
+And just, you know, with 10 minutes, like, Oh, I can't go back and I lost, I lost like
+
+01:32:10.200 --> 01:32:11.440
+5% of my time.
+
+01:32:11.440 --> 01:32:13.360
+I have to start over.
+
+01:32:13.360 --> 01:32:16.680
+So I can't imagine doing it on a word by word basis.
+
+01:32:16.680 --> 01:32:22.640
+It's strange we're still recording this, but we're getting into just the, you know, interesting
+
+01:32:22.640 --> 01:32:23.640
+story.
+
+01:32:23.640 --> 01:32:24.640
+Oh, it's the last thing.
+
+01:32:24.640 --> 01:32:29.880
+So, you know, this is just kind of like, I feel like this is the, the after party, right?
+
+01:32:29.880 --> 01:32:31.640
+Maybe they'll cut it off.
+
+01:32:31.640 --> 01:32:36.720
+So I work with a British guy, brilliant, uh, mathematician kind of guy.
+
+01:32:36.720 --> 01:32:44.520
+He's a financial guy and, uh, he, he has that, you know, often British kind of capability.
+
+01:32:44.520 --> 01:32:52.760
+He, he speaks beautifully, but he can speak off the cuff about anything he's working on,
+
+01:32:52.760 --> 01:32:56.500
+just like he has spent a week, uh, working on it.
+
+01:32:56.500 --> 01:33:02.040
+So he gets called on like, you know, the bigger bosses will say, we got to show this, do this
+
+01:33:02.040 --> 01:33:08.600
+demo for this client, literally like five minutes ahead of time, and he'll just go into
+
+01:33:08.600 --> 01:33:12.240
+it and there won't be an um, there won't be a pause.
+
+01:33:12.240 --> 01:33:14.840
+It'll just be this fluid sort of thing.
+
+01:33:14.840 --> 01:33:20.960
+And I'm like, man, if you could bottle that, uh, you know, because do it, what you're saying,
+
+01:33:20.960 --> 01:33:27.640
+doing, uh, you're on camera, doing a video thing, speaking, managing your thoughts, you
+
+01:33:27.640 --> 01:33:32.120
+know, keeping your context, it's, uh, super hard, I think.
+
+01:33:32.120 --> 01:33:37.120
+And, uh, when you see somebody who has that, like Steve Jobs, you know, he would practice
+
+01:33:37.120 --> 01:33:46.240
+I guess, but he had that ability that he could communicate anything, uh, beautifully.
+
+01:33:46.240 --> 01:33:47.820
+That's an art.
+
+01:33:47.820 --> 01:33:48.820
+Maybe not.
+
+01:33:48.820 --> 01:33:51.240
+Maybe it's just a personality trait.
+
+01:33:51.240 --> 01:33:56.360
+It's a, yeah, I don't, I don't think you can train, you can definitely improve, but I don't
+
+01:33:56.360 --> 01:34:02.360
+think you can train people if you're not born with that kind of silver tongue.
+
+01:34:02.360 --> 01:34:03.360
+Yeah.
+
+01:34:03.360 --> 01:34:04.360
+Right.
+
+01:34:04.360 --> 01:34:07.480
+And maybe it has to do with not being conscious of things.
+
+01:34:07.480 --> 01:34:13.520
+I think a lot of times it has, it's, you've never really thought about what, about what
+
+01:34:13.520 --> 01:34:19.000
+happens if you mess up or something just hasn't, you're blessed to not be able to worry about
+
+01:34:19.000 --> 01:34:20.000
+certain things.
+
+01:34:20.000 --> 01:34:21.000
+Yeah, that's true.
+
+01:34:21.000 --> 01:34:27.800
+That's why you see all the technical people that struggle, right, is, uh, but he's, you
+
+01:34:27.800 --> 01:34:29.800
+know, he has that too.
+
+01:34:29.800 --> 01:34:32.220
+He'll be very self-critical at times and stuff.
+
+01:34:32.220 --> 01:34:37.320
+But I think when, you know, like all of us, I mean, if I start out, I may be thinking
+
+01:34:37.320 --> 01:34:43.760
+about a bunch of things, but once I'm into it, you can see, you know, you sort of relax
+
+01:34:43.760 --> 01:34:50.040
+and you're just focused on that and all those other things kind of fade away, right?
+
+01:34:50.040 --> 01:34:51.320
+You can get into that zone.
+
+01:34:51.320 --> 01:34:52.600
+It's there for all of us.
+
+01:34:52.600 --> 01:34:59.640
+Well, as you become competent in things, the technology more and more disappears because
+
+01:34:59.640 --> 01:35:05.800
+I don't, as Emacs users, we don't think about what keyboards we, our touch typing is generally
+
+01:35:05.800 --> 01:35:11.200
+at another level because we split the windows without ever thinking about it.
+
+01:35:11.200 --> 01:35:12.200
+Muscle memory.
+
+01:35:12.200 --> 01:35:13.200
+Yeah.
+
+01:35:13.200 --> 01:35:14.600
+And that's what I'm saying.
+
+01:35:14.600 --> 01:35:19.680
+It's like, use that for like the value add and then, you know, literally have your muscles
+
+01:35:19.680 --> 01:35:26.280
+almost take care of the stuff that's silly, like, you know, opening a directory when it's
+
+01:35:26.280 --> 01:35:29.840
+part of a path, colon, separated, set of things.
+
+01:35:29.840 --> 01:35:31.080
+I don't want to think about that.
+
+01:35:31.080 --> 01:35:33.320
+I just want to point and go.
+
+01:35:33.320 --> 01:35:38.760
+And I don't want to know what the key binding is or any of that kind of stuff, so that we're
+
+01:35:38.760 --> 01:35:44.800
+definitely trying to like push it down to your unconscious and then see how far we can
+
+01:35:44.800 --> 01:35:49.120
+take that, you know, like what, how can you fly?
+
+01:35:49.120 --> 01:35:55.960
+Uh, I, you know, people sometimes have said there's some magic or that's why I mentioned
+
+01:35:55.960 --> 01:35:59.200
+that term today, but I think that's an important concept.
+
+01:35:59.200 --> 01:36:06.360
+You know, if it, if it seems like magic, then you've probably got it down to the right level
+
+01:36:06.360 --> 01:36:12.640
+that people don't have to think about it anymore and they're just, it's in their subconscious
+
+01:36:12.640 --> 01:36:18.120
+and they can move on to more interesting things, which is sort of why we build software in
+
+01:36:18.120 --> 01:36:19.120
+the first place.
+
+01:36:19.120 --> 01:36:20.120
+I think, right.
+
+01:36:20.120 --> 01:36:26.680
+It's to automate the mundane and let us keep adding value at another level.
+
+01:36:26.680 --> 01:36:27.680
+Yeah.
+
+01:36:27.680 --> 01:36:30.640
+Although it's very hard to remember that sometimes.
+
+01:36:30.640 --> 01:36:31.640
+Right.
+
+01:36:31.640 --> 01:36:36.560
+When you're, when you're saying, Oh, move this pixel over here.
+
+01:36:36.560 --> 01:36:37.560
+Right?
+
+01:36:37.560 --> 01:36:38.560
+Yeah.
+
+01:36:38.560 --> 01:36:43.840
+Like you were saying about front end development and how hard it can be sometimes that all
+
+01:36:43.840 --> 01:36:50.040
+the business people want to put their two cents in, it has to be, it has to be making
+
+01:36:50.040 --> 01:36:52.040
+somebody money at some point.
+
+01:36:52.040 --> 01:36:53.040
+Yeah.
+
+01:36:53.040 --> 01:36:59.160
+It's helpful, helpful when it does, but you know, not all you can build.
+
+01:36:59.160 --> 01:37:03.780
+You can spend a lot of money on things and they, I mean, look at, uh, look at what's
+
+01:37:03.780 --> 01:37:09.680
+happening to the tech companies now after billions of dollars invested and they're just
+
+01:37:09.680 --> 01:37:18.120
+throwing away thousands of people and all their knowledge bases and yeah, it's, it's
+
+01:37:18.120 --> 01:37:19.120
+competitive.
+
+01:37:19.120 --> 01:37:25.280
+I mean, you know, it's like, we don't need a thousand task management, commercial tools,
+
+01:37:25.280 --> 01:37:26.280
+right?
+
+01:37:26.280 --> 01:37:27.640
+Project management tools.
+
+01:37:27.640 --> 01:37:29.920
+So the market will shake out.
+
+01:37:29.920 --> 01:37:32.220
+There'll be three big ones maybe.
+
+01:37:32.220 --> 01:37:36.380
+And then everybody else is, if they exist, they're losing money.
+
+01:37:36.380 --> 01:37:40.980
+So what, you know, so are you going to be one of those three?
+
+01:37:40.980 --> 01:37:47.200
+That's that's the problem is that there's not enough room left for a lot of the things
+
+01:37:47.200 --> 01:37:49.200
+that people are trying to do.
+
+01:37:49.200 --> 01:37:51.680
+You talked about advancing things.
+
+01:37:51.680 --> 01:37:55.000
+It's like stuff like hyperbole or this mother of all demos.
+
+01:37:55.000 --> 01:38:01.800
+It's like sometimes we don't always have to move forward because all this mother of all
+
+01:38:01.800 --> 01:38:08.680
+demos is in a lot of ways, way ahead of anything we have now.
+
+01:38:08.680 --> 01:38:16.180
+And seems like it's ahead of hyperbole in a lot of ways and well, I've talked to a lot
+
+01:38:16.180 --> 01:38:20.520
+of non-technical people and they always say, you know, the problem I have is technology
+
+01:38:20.520 --> 01:38:21.520
+moves so fast.
+
+01:38:21.520 --> 01:38:22.520
+I can't keep up.
+
+01:38:22.520 --> 01:38:31.120
+And I say, well, actually in thinking about it over decades now that I've aged, uh, I
+
+01:38:31.120 --> 01:38:33.980
+see it as cycles much more, right?
+
+01:38:33.980 --> 01:38:40.000
+And like a sine wave that, uh, first of all, we, we do lose knowledge.
+
+01:38:40.000 --> 01:38:42.280
+We don't have a good way of capturing it.
+
+01:38:42.280 --> 01:38:47.180
+And I mean, I literally knew something about Engelbart's work and it was over a decade
+
+01:38:47.180 --> 01:38:53.140
+later that I rediscovered it and, and then got in touch and interacted with him.
+
+01:38:53.140 --> 01:38:58.480
+So, so we're definitely like forgetting about the past and get a new generation in.
+
+01:38:58.480 --> 01:39:00.380
+They don't know the lessons.
+
+01:39:00.380 --> 01:39:01.900
+They screwed things up.
+
+01:39:01.900 --> 01:39:06.720
+And eventually we rediscover that somebody already solved this and we can go and use
+
+01:39:06.720 --> 01:39:07.720
+it again.
+
+01:39:07.720 --> 01:39:11.800
+And then we start building on that and then the war happens and it gets destroyed.
+
+01:39:11.800 --> 01:39:15.080
+And then we got, so, so you actually get a lot of time, right?
+
+01:39:15.080 --> 01:39:16.680
+Like ethernet, right?
+
+01:39:16.680 --> 01:39:23.340
+To the masses from when it was invented to when it got deployed, uh, you know, hypertext.
+
+01:39:23.340 --> 01:39:30.880
+So let's say if Engelbart was showing it in 1968 and before that Ted Nelson was opining
+
+01:39:30.880 --> 01:39:37.640
+about it a ton, uh, so 1991 or two is when we got the web.
+
+01:39:37.640 --> 01:39:40.840
+So 25 years at least.
+
+01:39:40.840 --> 01:39:42.440
+And I think that's sort of cycles.
+
+01:39:42.440 --> 01:39:47.680
+I don't think there's a lot of technology cycles that are less than 10 years, uh, but
+
+01:39:47.680 --> 01:39:56.600
+you often see that the 10 to 15 to 20 year cycles from research to, you know, broad consumer
+
+01:39:56.600 --> 01:40:01.760
+adoption, uh, you've got about that amount of time to deal with it.
+
+01:40:01.760 --> 01:40:09.320
+So if you can have a research team that stays 10 years ahead of like what's out in the marketplace,
+
+01:40:09.320 --> 01:40:11.960
+you have lots of time to develop your product.
+
+01:40:11.960 --> 01:40:14.400
+It's not this, it's gotta be out yesterday.
+
+01:40:14.400 --> 01:40:17.480
+You only have two months or the market's going to close up.
+
+01:40:17.480 --> 01:40:23.580
+But it's very difficult to convince business people of that because there's so much chatter
+
+01:40:23.580 --> 01:40:29.420
+on the business side and people will show their, their mockups and their demos very
+
+01:40:29.420 --> 01:40:30.420
+broadly.
+
+01:40:30.420 --> 01:40:34.120
+And then they're like, they've got it, you know, it's like, what have they got?
+
+01:40:34.120 --> 01:40:36.000
+Well that I saw it, I saw it.
+
+01:40:36.000 --> 01:40:37.000
+Yeah.
+
+01:40:37.000 --> 01:40:41.120
+And what's behind that thing that you saw, you know, they just whipped it up right over
+
+01:40:41.120 --> 01:40:46.400
+a weekend and there's nothing, there's no database, there's no, uh, there's no user
+
+01:40:46.400 --> 01:40:47.400
+validation.
+
+01:40:47.400 --> 01:40:53.880
+So you kind of have to contend with that, which is probably why a lot of Emacs users
+
+01:40:53.880 --> 01:40:59.400
+are in academia and they don't want to deal with those issues.
+
+01:40:59.400 --> 01:41:00.400
+Yeah.
+
+01:41:00.400 --> 01:41:07.000
+It's kind of like also advanced by doing the, uh, doubling down on the stuff that works
+
+01:41:07.000 --> 01:41:12.160
+like for instance, uh, cars like, Oh look, the car's better.
+
+01:41:12.160 --> 01:41:14.440
+It's got a higher Bluetooth version.
+
+01:41:14.440 --> 01:41:15.540
+See it's better.
+
+01:41:15.540 --> 01:41:17.640
+But what about the gas mileage?
+
+01:41:17.640 --> 01:41:19.200
+How long does the motor last?
+
+01:41:19.200 --> 01:41:22.520
+But it's got a higher Bluetooth version.
+
+01:41:22.520 --> 01:41:28.580
+See it's, it's more technology and then, then the job is to create the need and the desire
+
+01:41:28.580 --> 01:41:30.600
+for that higher Bluetooth version.
+
+01:41:30.600 --> 01:41:31.600
+Right.
+
+01:41:31.600 --> 01:41:32.600
+Yeah.
+
+01:41:32.600 --> 01:41:38.480
+Well, haven't you bought like the same brand of car, even the same model, like a couple
+
+01:41:38.480 --> 01:41:41.760
+of years later and you're like, what did I just buy?
+
+01:41:41.760 --> 01:41:45.320
+I really loved the one from five years before.
+
+01:41:45.320 --> 01:41:51.440
+My, my first job out of school was in Motorola, which had a great engineering culture.
+
+01:41:51.440 --> 01:41:59.560
+But there came a time when, uh, they, they brought in automotive designers to shape,
+
+01:41:59.560 --> 01:42:02.720
+uh, the shape, the physical shape of the products.
+
+01:42:02.720 --> 01:42:08.600
+And we had some very sexy, beautiful looking things that those guys left the company and
+
+01:42:08.600 --> 01:42:13.560
+they hired a bunch of people pretty much out of college, you know, who had studied the
+
+01:42:13.560 --> 01:42:14.680
+field.
+
+01:42:14.680 --> 01:42:21.080
+And all of a sudden we had like these blocky kinds of things that like, nobody would want
+
+01:42:21.080 --> 01:42:26.440
+to hold in their hand and, uh, and I'm like, what, wait, what just happened?
+
+01:42:26.440 --> 01:42:29.080
+Didn't they document any of their work or anything?
+
+01:42:29.080 --> 01:42:35.220
+But that's, you know, we really do need the knowledge base inside people's head because
+
+01:42:35.220 --> 01:42:38.600
+we're nowhere near documenting it well enough.
+
+01:42:38.600 --> 01:42:44.320
+Uh, the design principles that people use, you know, you look at, you can see it in Apple
+
+01:42:44.320 --> 01:42:46.220
+a little bit too, right?
+
+01:42:46.220 --> 01:42:51.640
+Since Johnny Ive left, it's like, yeah, where's, where's the next design language?
+
+01:42:51.640 --> 01:42:58.320
+I just got an update to my iPhone and I noticed they changed some of the icons, but they just
+
+01:42:58.320 --> 01:43:06.600
+made like the time on my home screen, like three times as thick, the font width, you
+
+01:43:06.600 --> 01:43:12.400
+know, it's like ultra bold and I'm like, yeah, that it doesn't really look right.
+
+01:43:12.400 --> 01:43:18.440
+It just looks like it's in my face and I'm like, well, somebody, you know, got that through
+
+01:43:18.440 --> 01:43:24.760
+whatever they're running there now, but I've would have tossed that on the, you know, the
+
+01:43:24.760 --> 01:43:25.760
+bad idea pile.
+
+01:43:25.760 --> 01:43:26.760
+I think.
+
+01:43:26.760 --> 01:43:27.760
+Huh?
+
+01:43:27.760 --> 01:43:34.000
+It seems like a bit of an obnoxious change to make it for something that is so supposed
+
+01:43:34.000 --> 01:43:37.520
+to be, it's when you want it, you really want it and when you don't want it, it's supposed
+
+01:43:37.520 --> 01:43:38.520
+to be unobtrusive.
+
+01:43:38.520 --> 01:43:42.800
+I don't know that way.
+
+01:43:42.800 --> 01:43:43.800
+Yeah.
+
+01:43:43.800 --> 01:43:44.800
+Oh.
+
+01:43:44.800 --> 01:43:45.800
+Yeah.
+
+01:43:45.800 --> 01:43:54.480
+I wonder if that uses more power since it's, if it's white using all your, all your pixels
+
+01:43:54.480 --> 01:43:55.480
+there.
+
+01:43:55.480 --> 01:43:57.080
+Oh yeah.
+
+01:43:57.080 --> 01:43:59.280
+So I guess we have time in the end.
+
+01:43:59.280 --> 01:44:05.080
+I mean that like, you know, we all have these crazy deadlines, but in the end to actually
+
+01:44:05.080 --> 01:44:10.480
+move the needle forward, it's going to take a while and there's going to be certain steps
+
+01:44:10.480 --> 01:44:11.480
+backwards.
+
+01:44:11.480 --> 01:44:16.800
+And I think Emacs is sort of our shared community knowledge base, right?
+
+01:44:16.800 --> 01:44:21.140
+As long as we have these libraries, even if they get a little out of date, we can update
+
+01:44:21.140 --> 01:44:24.320
+them to the next generation when we're ready.
+
+01:44:24.320 --> 01:44:27.440
+And that's something that a lot of people don't have, right?
+
+01:44:27.440 --> 01:44:33.140
+They're just going from application to applications and they're losing all the core capabilities
+
+01:44:33.140 --> 01:44:36.760
+every time they transition.
+
+01:44:36.760 --> 01:44:41.080
+Well I think that's the, like when I was talking about the themes and the modularity and just
+
+01:44:41.080 --> 01:44:46.840
+using all that stuff is, if you can use all that stuff and especially if you can use a
+
+01:44:46.840 --> 01:44:53.380
+whole bunch of really old code, that's, that's the tricky question of how do you use as many
+
+01:44:53.380 --> 01:45:00.600
+things as you, as possible at once without everything clobbering each other?
+
+01:45:00.600 --> 01:45:13.060
+Well, I learned this lesson, don't, don't add a date created entry to your code files
+
+01:45:13.060 --> 01:45:21.440
+if you don't also include a last modified date, because we had 1991 entries in hyperbole
+
+01:45:21.440 --> 01:45:26.640
+files and people would download it and they look and they're like, this thing is ancient.
+
+01:45:26.640 --> 01:45:33.360
+I'm not going to use this because we had pulled out the modified because you need certain
+
+01:45:33.360 --> 01:45:37.400
+code to update the modified automatically when you save it.
+
+01:45:37.400 --> 01:45:41.240
+And you know, not every developer would necessarily have that.
+
+01:45:41.240 --> 01:45:46.680
+So, but when that started happening, I said, we'll put this back because they didn't want
+
+01:45:46.680 --> 01:45:54.560
+to get rid of the create date and lose that, that you sort of know how far back it goes.
+
+01:45:54.560 --> 01:46:02.520
+Yeah, yeah, I've, I've always gotten a little, I always find it interesting when I see working
+
+01:46:02.520 --> 01:46:06.400
+with something and I, and I realized that it hasn't been touched for, or it appears
+
+01:46:06.400 --> 01:46:12.040
+not to have been touched for a couple of decades and I think, oh my gosh, either I, if I found
+
+01:46:12.040 --> 01:46:15.080
+a problem, I'm thinking, oh, I, this can't be right.
+
+01:46:15.080 --> 01:46:18.080
+I must be missing something here because there's no way that this problem could have existed
+
+01:46:18.080 --> 01:46:22.680
+for 20 years and no one ever noticed it or cared about it.
+
+01:46:22.680 --> 01:46:24.120
+And sometimes I'm wrong.
+
+01:46:24.120 --> 01:46:25.120
+Sometimes I'm right.
+
+01:46:25.120 --> 01:46:26.120
+It's not a problem.
+
+01:46:26.120 --> 01:46:32.200
+Well, you have this quote for Emacs, it's like Emacs is you want editors, like you want
+
+01:46:32.200 --> 01:46:33.200
+wine.
+
+01:46:33.200 --> 01:46:34.200
+I think it's wine.
+
+01:46:34.200 --> 01:46:41.040
+It's like, the older it is, the better it gets because you get that composite of all
+
+01:46:41.040 --> 01:46:50.080
+these philosophies, workflows, workflows and forming packages and if you're going to be
+
+01:46:50.080 --> 01:46:57.600
+on the cutting edge, 95% of the ideas will probably not be good, 5% of the ideas will
+
+01:46:57.600 --> 01:47:05.280
+be good, but versus looking at the older stuff where a lot more of the ideas will be good
+
+01:47:05.280 --> 01:47:08.460
+and you'll get all like matured packages.
+
+01:47:08.460 --> 01:47:13.160
+Like you were talking about how you have all the window control with the Mac stuff.
+
+01:47:13.160 --> 01:47:19.000
+You just get the stuff, uh, Streamlint.
+
+01:47:19.000 --> 01:47:25.760
+And maybe like, you know, if we look at Richard Stallman's Emacs environment and maybe yours,
+
+01:47:25.760 --> 01:47:30.200
+John, you'd like to keep it simple, like you said, not beaming it because you've gotten,
+
+01:47:30.200 --> 01:47:32.920
+you know, to a steady state that works well for you.
+
+01:47:32.920 --> 01:47:40.440
+I visited Xerox park years ago and when I went around looking at all of the workstations,
+
+01:47:40.440 --> 01:47:48.300
+they were all using like 10 year old window managers, just like the oldest look and feel.
+
+01:47:48.300 --> 01:47:50.940
+Nobody was touching anything, right?
+
+01:47:50.940 --> 01:47:59.280
+Because they were creating the future, they thought, and they really didn't care about
+
+01:47:59.280 --> 01:48:02.760
+keeping up to date on, on their packages.
+
+01:48:02.760 --> 01:48:04.840
+They had to write their own stuff.
+
+01:48:04.840 --> 01:48:10.840
+So I thought that was kind of fascinating to learn that a lot of, you know, high level
+
+01:48:10.840 --> 01:48:18.120
+thinkers don't necessarily treat their tooling environments the same way.
+
+01:48:18.120 --> 01:48:21.240
+At least not, not every day.
+
+01:48:21.240 --> 01:48:30.520
+They probably say finish whatever they're doing or, you know, reach five years or something.
+
+01:48:30.520 --> 01:48:35.120
+That's what I'm sticking with this one Subaru car and I've had a bunch of other things,
+
+01:48:35.120 --> 01:48:39.840
+but this one has an engine that they don't make anymore, a V6.
+
+01:48:39.840 --> 01:48:45.920
+Now they're sort of like turboizing things to get the equivalent power and it doesn't
+
+01:48:45.920 --> 01:48:47.120
+perform the same way.
+
+01:48:47.120 --> 01:48:52.880
+So I'm like, well, I got to wait until the bottom of this car rusts out before I replace
+
+01:48:52.880 --> 01:48:56.600
+it because I like so much about it.
+
+01:48:56.600 --> 01:49:04.440
+Even though I'm missing some of the new technology, I just don't want to change it out.
+
+01:49:04.440 --> 01:49:12.040
+One of the things I like a lot about how Emacs looks as it looks to me, really nice in a
+
+01:49:12.040 --> 01:49:20.120
+real bullshit, ultra functional way where it's like, I like that it doesn't do the smooth
+
+01:49:20.120 --> 01:49:25.880
+scrolling that it scrolls line by line by line, even though that's not as modern and
+
+01:49:25.880 --> 01:49:34.960
+hip because it's more down or down to earth functional, I don't know, like a more engineering
+
+01:49:34.960 --> 01:49:40.160
+or something that's just not as flashy normal way.
+
+01:49:40.160 --> 01:49:44.920
+Yeah, no, I agree.
+
+01:49:44.920 --> 01:49:52.240
+And it affects, it really affects how it feels like you're somewhere in your brain, you're
+
+01:49:52.240 --> 01:49:55.480
+some kind of object that your brain thinks that you're dealing with, even if it's not
+
+01:49:55.480 --> 01:49:59.840
+really an object, you know, part of your brain just has to really to the world that way.
+
+01:49:59.840 --> 01:50:04.200
+And I think that's just one of those things is that if you can, your brain can actually
+
+01:50:04.200 --> 01:50:09.640
+feel like you're, you can almost feel each line like passing past, you're going past
+
+01:50:09.640 --> 01:50:12.640
+your scrolling action.
+
+01:50:12.640 --> 01:50:18.840
+Your brain is like, you keep helps keep you oriented, like you can, it's like, it's your
+
+01:50:18.840 --> 01:50:24.200
+visual experience creates a tactile experience for you.
+
+01:50:24.200 --> 01:50:31.200
+I think that's one of the the VR problems that the industry is suffering from is that
+
+01:50:31.200 --> 01:50:40.160
+it's so easy to program things that will entirely screw up somebody's, what do you call this
+
+01:50:40.160 --> 01:50:45.760
+subconscious parts of our, our nerve nervous systems.
+
+01:50:45.760 --> 01:50:50.800
+So right, I mean, they can scare the hell out of people, they can make them sense something
+
+01:50:50.800 --> 01:50:52.720
+that's not there.
+
+01:50:52.720 --> 01:50:58.680
+And it's like, you know, it's just, we're not ready for that in so many ways, and it's
+
+01:50:58.680 --> 01:51:00.280
+just too easy.
+
+01:51:00.280 --> 01:51:09.060
+And so if you can't depend that like physics will keep you from like flying off the earth,
+
+01:51:09.060 --> 01:51:12.400
+you know, anything can happen.
+
+01:51:12.400 --> 01:51:18.120
+I don't know how many people will want to really, you know, experience that for any
+
+01:51:18.120 --> 01:51:20.400
+continual amount of time.
+
+01:51:20.400 --> 01:51:24.280
+The other thing you don't get is like, you don't have to worry about how much time it
+
+01:51:24.280 --> 01:51:25.280
+does a scroll.
+
+01:51:25.280 --> 01:51:27.760
+So it's going to be a lot more performant, faster.
+
+01:51:27.760 --> 01:51:32.720
+I love turn, as a counter example, I love turning off the animations on my phone because
+
+01:51:32.720 --> 01:51:38.640
+it makes it snappier, faster, and I don't want to just insert animations on my phone
+
+01:51:38.640 --> 01:51:43.920
+just to slow it down and you open up your contacts, it's like, I want to make, I turn
+
+01:51:43.920 --> 01:51:51.240
+the DPI on my Android phone down, down, so that I can see more contacts at once.
+
+01:51:51.240 --> 01:51:59.600
+So I don't have to scroll as many times and I want, I make the home screen have more icons
+
+01:51:59.600 --> 01:52:01.680
+on it because I'm accurate with my thumbs.
+
+01:52:01.680 --> 01:52:09.520
+So I want to see as many icons as I can so I don't, so I can much faster see and click
+
+01:52:09.520 --> 01:52:12.960
+the right one I want to, I scroll less pages.
+
+01:52:12.960 --> 01:52:19.920
+Yeah, and you probably have a hard time making it do what you want, I'm guessing too, because
+
+01:52:19.920 --> 01:52:29.780
+it's just the one area where, for phones especially, it's just one area where you are not respected.
+
+01:52:29.780 --> 01:52:34.920
+You're going to take whatever experience they figured was the right one that week and force
+
+01:52:34.920 --> 01:52:39.160
+you to eat it, like a head of cattle.
+
+01:52:39.160 --> 01:52:44.480
+You're eating that experience like it's feed and it'll change whenever you want, whenever
+
+01:52:44.480 --> 01:52:49.880
+they want, and it's going to, I don't know if you feel the same way.
+
+01:52:49.880 --> 01:52:55.040
+My first phone was a Windows mobile phone that the person was selling because they wanted
+
+01:52:55.040 --> 01:53:05.240
+an Android phone and I've always been on custom ROMs, although lately I've been getting annoyed
+
+01:53:05.240 --> 01:53:11.760
+about it because they've been losing all the, let's see, I remember reading this blog post
+
+01:53:11.760 --> 01:53:16.320
+about somebody liking custom ROMs and they were saying that Android was becoming more
+
+01:53:16.320 --> 01:53:22.280
+restrictive because they would be putting an image through the USB port so you could
+
+01:53:22.280 --> 01:53:29.320
+have a Linux ISO connected to your computer through your phone and they wanted SE Linux
+
+01:53:29.320 --> 01:53:34.600
+but they'd have to compile the kernel in a different way and have the patch and all that
+
+01:53:34.600 --> 01:53:42.680
+type of stuff is just becoming more and more of a nightmare and you're not able to do that.
+
+01:53:42.680 --> 01:53:46.560
+Right now I'm messing with a Linux phone.
+
+01:53:46.560 --> 01:53:59.440
+Do you guys agree with Stallman and GNU thinking for FFF philosophy in general or sort of like
+
+01:53:59.440 --> 01:54:03.600
+you're more middle of the road about it?
+
+01:54:03.600 --> 01:54:11.880
+I mean I personally, I think there's a need for that philosophy.
+
+01:54:11.880 --> 01:54:22.440
+I don't, at least now, I don't personally 100% dedicate my beliefs and actions to it.
+
+01:54:22.440 --> 01:54:32.720
+I'm not certain about anything to be honest but I'm not ready to say that everything outside
+
+01:54:32.720 --> 01:54:41.280
+of it has no place for me or has no place at all but I think about the commonalities.
+
+01:54:41.280 --> 01:54:47.600
+I think that there's good that will come, there's a truth to it and there's a good that
+
+01:54:47.600 --> 01:54:56.360
+it will do and there's certainly no reason to not offer.
+
+01:54:56.360 --> 01:54:59.720
+You don't have to agree that it's the only way to agree that there's something good about
+
+01:54:59.720 --> 01:55:00.720
+it.
+
+01:55:00.720 --> 01:55:04.760
+That's my point of view.
+
+01:55:04.760 --> 01:55:11.760
+I think that you have the philosophy, like the Emacs is a great example of an ecosystem
+
+01:55:11.760 --> 01:55:17.080
+informed by that philosophy and it's an artifact of that philosophy because you look at an
+
+01:55:17.080 --> 01:55:22.840
+Emacs package, chances are if you look at any of the Zettelkasten systems, they're not
+
+01:55:22.840 --> 01:55:29.520
+going to be trying to, it's not going to be, let's see, you have org.roam.
+
+01:55:29.520 --> 01:55:36.240
+It's not Roam because Roam requires you to pay for a Sass subscription and it's only
+
+01:55:36.240 --> 01:55:40.520
+accessible online and it's like any Emacs package you use, generally you're going to
+
+01:55:40.520 --> 01:55:46.120
+have all the data on your local machine and it's...
+
+01:55:46.120 --> 01:55:50.560
+Is that, I think there was something called Roam, is that Roam research, is that what
+
+01:55:50.560 --> 01:55:51.560
+you're talking about?
+
+01:55:51.560 --> 01:55:52.560
+Yes.
+
+01:55:52.560 --> 01:55:53.560
+That's right.
+
+01:55:53.560 --> 01:55:55.560
+I thought Roam was just a verb.
+
+01:55:55.560 --> 01:55:56.560
+Sorry.
+
+01:55:56.560 --> 01:56:03.480
+They built the interface to be like that, yeah.
+
+01:56:03.480 --> 01:56:05.000
+It's interesting, right?
+
+01:56:05.000 --> 01:56:10.080
+Because yeah, you hear all these terms and you don't always know.
+
+01:56:10.080 --> 01:56:18.400
+Like a lot of people are like, hyperbole has adopted this org thing because they don't
+
+01:56:18.400 --> 01:56:27.920
+know it existed before org because the org obviously has a much broader reach right now.
+
+01:56:27.920 --> 01:56:35.400
+So yeah, understanding that history and that Emacs is tied into the FSF philosophy, there's
+
+01:56:35.400 --> 01:56:42.280
+probably a fraction of the Emacs users that even are very aware of that.
+
+01:56:42.280 --> 01:56:51.840
+But I think, yeah, Stallman, he's seen a lot and he's somebody who does think a lot from
+
+01:56:51.840 --> 01:56:55.720
+first principles and is very logical.
+
+01:56:55.720 --> 01:57:02.000
+He doesn't necessarily want to deal with parts of the world that exist.
+
+01:57:02.000 --> 01:57:09.440
+But if he makes a statement, it's usually fairly true.
+
+01:57:09.440 --> 01:57:17.520
+So the fact that he's concluded this and been very definitive about it for decades tells
+
+01:57:17.520 --> 01:57:22.200
+you that there's some truth in there that you should look into.
+
+01:57:22.200 --> 01:57:23.200
+Yeah.
+
+01:57:23.200 --> 01:57:30.120
+I think if I think of like today's earlier session where some of the questions were exposed
+
+01:57:30.120 --> 01:57:35.920
+some tension there and I think one of the reasons why we see that tension is because
+
+01:57:35.920 --> 01:57:43.040
+of the success and the kind of the more broad appeal of that org mode has brought Emacs
+
+01:57:43.040 --> 01:57:46.040
+and it's a healthy sign.
+
+01:57:46.040 --> 01:57:52.120
+It's a sign that there's people coming into the community who may not be familiar with
+
+01:57:52.120 --> 01:57:57.000
+the origins, the philosophical origins of the tools that they're using.
+
+01:57:57.000 --> 01:58:01.640
+I also think that you have a lot of the people who are interested in Emacs are probably interested
+
+01:58:01.640 --> 01:58:04.640
+in the Free Software Foundation.
+
+01:58:04.640 --> 01:58:09.080
+So it's something like the philosophy.
+
+01:58:09.080 --> 01:58:15.800
+I mean, maybe, but right, they could just be interested in what, which is what Stallman
+
+01:58:15.800 --> 01:58:17.240
+talks about too a lot.
+
+01:58:17.240 --> 01:58:22.080
+It's like you may just want the functionality that some software has and you may not care
+
+01:58:22.080 --> 01:58:26.240
+about free licensing, but you should.
+
+01:58:26.240 --> 01:58:32.080
+And here's why, you know, so yeah, but you start using all the, you start using all the
+
+01:58:32.080 --> 01:58:37.520
+packages and then the philosophy, then it kicks you into the philosophy from the reverse
+
+01:58:37.520 --> 01:58:39.800
+direction.
+
+01:58:39.800 --> 01:58:45.160
+And so I think as if you, if you start resonating with that philosophy, Emacs is the place to
+
+01:58:45.160 --> 01:58:46.160
+be.
+
+01:58:46.160 --> 01:58:55.760
+So we'll all be slanted towards wanting the GPL license or at least the BSD license because
+
+01:58:55.760 --> 01:59:05.920
+it's the place that it's the place in philosophy that exploits all those advantages practically.
+
+01:59:05.920 --> 01:59:12.600
+It's interesting because maybe, I don't know how many years ago, 10, 15 years ago, there
+
+01:59:12.600 --> 01:59:18.040
+was that big debate about open source and versus free software.
+
+01:59:18.040 --> 01:59:24.840
+And you know, it was just raging and it doesn't even seem like it's a topic anymore.
+
+01:59:24.840 --> 01:59:29.680
+It's like the GPL has done very well.
+
+01:59:29.680 --> 01:59:38.680
+Other licenses have too, but the model of software being free and open is established
+
+01:59:38.680 --> 01:59:45.780
+at all levels in the economy and in the technical world.
+
+01:59:45.780 --> 01:59:54.920
+So you know, Stallman is sort of playing the long game and what did they say, like the
+
+01:59:54.920 --> 02:00:03.120
+justice system bends towards right, but it's over a really long period of time or something.
+
+02:00:03.120 --> 02:00:04.760
+Eventually it gets to the right answer.
+
+02:00:04.760 --> 02:00:08.480
+I think it's sort of like that, you know, it's that we're going to have all these ups
+
+02:00:08.480 --> 02:00:15.760
+and downs, but eventually you'll have dictators and such, but eventually freedom will win.
+
+02:00:15.760 --> 02:00:22.440
+People win out over, you know, being crushed under the boot like the Russians are today.
+
+02:00:22.440 --> 02:00:28.120
+You know, what comes out of their society after they get crushed by the Ukrainians,
+
+02:00:28.120 --> 02:00:36.920
+I think will be hopefully for them, you know, because they had such great intellectual capacity,
+
+02:00:36.920 --> 02:00:41.260
+but they've had this broken culture for over a hundred years.
+
+02:00:41.260 --> 02:00:46.460
+And so if you don't, going back to Engelbart again, if you just evolve your technology
+
+02:00:46.460 --> 02:00:52.920
+without your process, your culture, you're left with something that may not work well
+
+02:00:52.920 --> 02:00:54.600
+at all for you.
+
+02:00:54.600 --> 02:00:57.640
+You have to take stock every now and then you need that time.
+
+02:00:57.640 --> 02:01:00.960
+And that's another point that I wanted to make in my talk, but I just couldn't find
+
+02:01:00.960 --> 02:01:10.600
+room for it is that if you know that you're going to make that time in the future, then
+
+02:01:10.600 --> 02:01:14.480
+you can focus on the present.
+
+02:01:14.480 --> 02:01:19.040
+But if you never make that time, and I don't mean, you know, it could apply to anything,
+
+02:01:19.040 --> 02:01:27.880
+but whether it's societal or technical, but don't stop and really think about what you
+
+02:01:27.880 --> 02:01:36.160
+are, you know, am I doing what I represent or are my actions representing myself and
+
+02:01:36.160 --> 02:01:40.440
+my needs and my goals?
+
+02:01:40.440 --> 02:01:47.240
+Every person, every organization of people, every society should really think about that.
+
+02:01:47.240 --> 02:01:54.500
+And it seems like it just, there's certain ways that society can grow where it becomes,
+
+02:01:54.500 --> 02:01:58.560
+you can't think about that because when you start to think about that is when you become
+
+02:01:58.560 --> 02:02:07.080
+vulnerable or you, I don't know, I'm not a philosopher, I'm not an international scholar.
+
+02:02:07.080 --> 02:02:14.800
+Does ZMAX rank up there on your hierarchy of needs, it's like number two or take that
+
+02:02:14.800 --> 02:02:19.960
+away from me and my survival will be jeopardized.
+
+02:02:19.960 --> 02:02:25.840
+And as much as my digital self is, absolutely, it's probably very close to, I mean, it really
+
+02:02:25.840 --> 02:02:33.320
+did, I think, save me from destruction in terms of organization personally.
+
+02:02:33.320 --> 02:02:38.680
+I think it was, what was it, it must have been 2008 or so, I was just so disorganized
+
+02:02:38.680 --> 02:02:46.000
+and I was, you know, missing bills and things like that, just because I had a pile of papers
+
+02:02:46.000 --> 02:02:50.760
+and I said, you know what, I need to be able to take notes, and I was taking notes, but
+
+02:02:50.760 --> 02:02:56.080
+I had just a bunch of flat text files and I said, I need to be able to collapse my text
+
+02:02:56.080 --> 02:03:03.000
+and I want to be able to take outline notes and I ended up, sorry, go ahead, I just ended
+
+02:03:03.000 --> 02:03:08.880
+up finding, I think it was work mode at the time, I think it was still a separate package
+
+02:03:08.880 --> 02:03:15.880
+and I was like, okay, finally, just this ability to collapse my notes into hierarchical structure
+
+02:03:15.880 --> 02:03:19.680
+so that I could have one thing, that I could think about multiple, one file, think about
+
+02:03:19.680 --> 02:03:24.560
+multiple things and collapse them when I didn't need to think about them anymore, and I was
+
+02:03:24.560 --> 02:03:30.640
+just like, okay, finally, this is the thing that's going to help me stay organized and
+
+02:03:30.640 --> 02:03:38.800
+from there on out, it worked, so in terms of whatever I am today, you know, I couldn't
+
+02:03:38.800 --> 02:03:45.920
+undo that anymore, like that's committed to my identity at this point, so yeah, yeah.
+
+02:03:45.920 --> 02:03:49.800
+That's a great explanation of it, you know.
+
+02:03:49.800 --> 02:03:56.080
+Have you looked at the ARG narrowing at all, or Emacs narrowing stuff?
+
+02:03:56.080 --> 02:04:03.720
+Yeah, I do that a lot, it helps me, it helped me focus on writing some of my notes for the
+
+02:04:03.720 --> 02:04:04.720
+talk.
+
+02:04:04.720 --> 02:04:12.560
+Yeah, that's very important because you can end up capturing so much, it makes it so easy
+
+02:04:12.560 --> 02:04:18.360
+to capture and then you one day said, okay, I captured too much, I need to, you know,
+
+02:04:18.360 --> 02:04:24.000
+that outline, having all those stars and whatever in your outline can be very distracting and
+
+02:04:24.000 --> 02:04:30.200
+I use very old stuff, so I still have, you know, just regular, a series of asterisks
+
+02:04:30.200 --> 02:04:39.120
+aligned to my left side, so I have a lot of visual noise in there, but yeah, yeah, I mean,
+
+02:04:39.120 --> 02:04:46.960
+do you have any special ways that you use it, like in terms of the narrowing or anything?
+
+02:04:46.960 --> 02:04:56.240
+I like using the VertiCo package because it allows you to set up different commands to
+
+02:04:56.240 --> 02:05:01.800
+either like be in a buffer or mini buffer or various things like that, so I can choose
+
+02:05:01.800 --> 02:05:07.920
+how to do that or change that over time.
+
+02:05:07.920 --> 02:05:14.720
+For me with Emacs, I think that is the most useful about it is I generally like trying
+
+02:05:14.720 --> 02:05:22.560
+out new things and Emacs is a program that got onto my computer, never left because anytime
+
+02:05:22.560 --> 02:05:28.220
+I want to try something new, I can just try out the packages or parts of the configs or
+
+02:05:28.220 --> 02:05:34.220
+variables and I get to try that stuff out, some stuff has stayed, a lot of stuff doesn't
+
+02:05:34.220 --> 02:05:40.800
+necessarily stay, draw up my files and...
+
+02:05:40.800 --> 02:05:47.240
+The first time when I'm bringing up a new system is I always like get some micro Emacs
+
+02:05:47.240 --> 02:05:53.960
+version just so I can edit my config files and then I get the OS stable enough and then
+
+02:05:53.960 --> 02:06:02.400
+I install a new Emacs and it's like I never used VI, I never learned VI, I was lucky,
+
+02:06:02.400 --> 02:06:10.640
+I guess, you know, they taught us first year of college we used Emacs, so all these people
+
+02:06:10.640 --> 02:06:16.640
+I bet they've gone through 7 to 10 editors and I'm like, well, I've gone through versions
+
+02:06:16.640 --> 02:06:19.800
+of Emacs and that's it.
+
+02:06:19.800 --> 02:06:26.080
+So it's been a little different and it is, it's crept into my subconscious, you know,
+
+02:06:26.080 --> 02:06:34.480
+so much so that the talk about getting Emacs, using Emacs to fill in your web form fields
+
+02:06:34.480 --> 02:06:42.080
+was very interesting to me because years ago I did that, when Sun was popular there was
+
+02:06:42.080 --> 02:06:49.600
+also Apollo which had a better networking and a better OS and so we were using some
+
+02:06:49.600 --> 02:06:58.560
+of their workstations and they had every shell and every window had an editing capability,
+
+02:06:58.560 --> 02:07:05.400
+was essentially an editor field but it was their own editor so I modified it so it was
+
+02:07:05.400 --> 02:07:12.040
+Emacs and you know everywhere on Apollo and it was a really beautiful environment and
+
+02:07:12.040 --> 02:07:20.240
+like then HP bought them and killed the OS in favor of HP UX so that went away and I
+
+02:07:20.240 --> 02:07:25.160
+couldn't use it anymore but we had built a really cool environment on there but that
+
+02:07:25.160 --> 02:07:31.360
+again, I wouldn't hand over the workstations, I was setting them up for a research team
+
+02:07:31.360 --> 02:07:36.120
+and I wouldn't hand them over until I had built this environment so that they all had
+
+02:07:36.120 --> 02:07:40.800
+the consistent editing experience and they wouldn't go off and just do something random
+
+02:07:40.800 --> 02:07:43.800
+with it.
+
+02:07:43.800 --> 02:07:48.760
+It's funny how you describe that bootstrap process because the way that I think about
+
+02:07:48.760 --> 02:07:54.920
+it is that a lot of times you end up, what's the path they talk about is that you need
+
+02:07:54.920 --> 02:08:02.240
+to learn enough bash to install Python or something like that and that's the joke is
+
+02:08:02.240 --> 02:08:10.280
+that that's the only amount of bash that you need to know but if you go to the Emacs path,
+
+02:08:10.280 --> 02:08:12.160
+you might not even need Python.
+
+02:08:12.160 --> 02:08:15.840
+You mentioned having it installed to edit configs and things like that and edit what
+
+02:08:15.840 --> 02:08:20.880
+you need to do to get another version of Emacs installed but I could see, I would love, maybe
+
+02:08:20.880 --> 02:08:27.840
+that'll be my inspiration for next year's talk is to find a way to, yeah, everything,
+
+02:08:27.840 --> 02:08:31.520
+just use Emacs as a substitute for Python and Ansible.
+
+02:08:31.520 --> 02:08:37.760
+I could probably use some of the packages that were out there like, what was it, Anthony
+
+02:08:37.760 --> 02:08:44.320
+or Tropin, Andrew Tropin, he had the RD, the reproducible Emacs, I could look at that and
+
+02:08:44.320 --> 02:08:45.320
+use that.
+
+02:08:45.320 --> 02:08:51.880
+It tells me about living through, we're always manipulating JSON now and I'm like, why does
+
+02:08:51.880 --> 02:08:59.680
+JavaScript have such a crappy format, it could just be S expressions and then we get rid
+
+02:08:59.680 --> 02:09:08.460
+of all this noise that we have to keep dealing with and it represents the same things but
+
+02:09:08.460 --> 02:09:13.420
+instead we settled on this crappier thing that's a little closer to the way we would
+
+02:09:13.420 --> 02:09:21.920
+have done it in C probably and because it is JavaScript's object format and it's like
+
+02:09:21.920 --> 02:09:28.120
+it's annoying to know and of course you could write a processor so it converts bi-directionally
+
+02:09:28.120 --> 02:09:30.140
+but nobody will do it.
+
+02:09:30.140 --> 02:09:37.740
+If you've ever used Lisp to replace your HTML, same sort of thing, you don't have to deal
+
+02:09:37.740 --> 02:09:43.840
+with your closing tags and you get all the auto editing and it's just like even without
+
+02:09:43.840 --> 02:09:50.680
+abstracting above any of the tags, just replacing them one for one, it's so much better but
+
+02:09:50.680 --> 02:09:53.380
+can you get anybody to do it?
+
+02:09:53.380 --> 02:10:00.040
+You look at Gix and you have the init system, that's written in Guile or scheme and then
+
+02:10:00.040 --> 02:10:07.680
+you got the cron program, it's mcron, that's written in Guile and you can use the normal
+
+02:10:07.680 --> 02:10:12.360
+cron syntax for that or a different one where you can do that and you can start labeling
+
+02:10:12.360 --> 02:10:15.700
+it with like say how many hours I want to do.
+
+02:10:15.700 --> 02:10:21.320
+I think the example they give in their documentation is like I want it to do the first Wednesday
+
+02:10:21.320 --> 02:10:28.160
+of every month or you could put if statements in there or a whole bunch of interesting things
+
+02:10:28.160 --> 02:10:35.400
+like that and it's like their package definitions are in Guile so it's like the whole operating
+
+02:10:35.400 --> 02:10:37.200
+system is in Guile.
+
+02:10:37.200 --> 02:10:39.000
+That's what we're trying to do, right?
+
+02:10:39.000 --> 02:10:46.120
+That was going to be the scripting language for Canoe, was going to be Guile and they
+
+02:10:46.120 --> 02:10:50.760
+were doing that which again, this is all like from MIT, right?
+
+02:10:50.760 --> 02:10:57.600
+Stallman's from the MIT AI lab, all this stuff, scheme, it's all evolved from that environment
+
+02:10:57.600 --> 02:11:03.600
+and they were right, this stuff is pretty good but it's like it's interesting to listen
+
+02:11:03.600 --> 02:11:11.600
+to him say if we were to update Emacs and allow another language to be the programming
+
+02:11:11.600 --> 02:11:16.360
+language, it would be scheme.
+
+02:11:16.360 --> 02:11:24.760
+It's not even on the radar of anybody in the industry to do that but he doesn't care.
+
+02:11:24.760 --> 02:11:32.880
+He's like he's the Mekana class, he sees the value, he sees what's technically good.
+
+02:11:32.880 --> 02:11:39.000
+Have you ever read any of his compiler code or something, I mean read his Emacs code,
+
+02:11:39.000 --> 02:11:48.120
+it's so clean, it's so beautiful, it's not like super abstract but it's like even the
+
+02:11:48.120 --> 02:11:52.580
+C code to implement the list of primitives, I mean now you don't know what he wrote versus
+
+02:11:52.580 --> 02:11:58.160
+somebody else and you can see in Emacs that it's gone away from the sort of stuff you
+
+02:11:58.160 --> 02:12:06.360
+used to write but his mind is just like so clear when doing things like that, that like
+
+02:12:06.360 --> 02:12:12.440
+you can learn an infinite number of things from kind of looking at the way he structures
+
+02:12:12.440 --> 02:12:13.440
+stuff.
+
+02:12:13.440 --> 02:12:17.920
+I'm going to have to, I'm making a note for myself to go seek that out specifically because
+
+02:12:17.920 --> 02:12:22.360
+I don't think I've ever, I've seen some of the code that he's written, I've just never
+
+02:12:22.360 --> 02:12:30.880
+seen it in that context of specifically going in to try to get a sense of what it is.
+
+02:12:30.880 --> 02:12:37.340
+I mean when you read, like read the Emacs manual, right, I mean at least through version
+
+02:12:37.340 --> 02:12:48.120
+19 he wrote that, right, and it's like step by step he takes you from what a point is
+
+02:12:48.120 --> 02:12:55.800
+to marks to windows and it's just, it's very thoughtful and you're like well he's been
+
+02:12:55.800 --> 02:13:00.120
+embedded in this for years and like this is second nature to him, he doesn't even think
+
+02:13:00.120 --> 02:13:07.640
+about it but when he talks about it, it all comes out from first principle and I think
+
+02:13:07.640 --> 02:13:14.120
+that's what made him a master programmer and some of the stuff that they tried to do, build
+
+02:13:14.120 --> 02:13:18.320
+an operating system from scratch even though they didn't have all the success they wanted
+
+02:13:18.320 --> 02:13:26.220
+but you look at how good they made the Unix tools compared to what they were in Berkeley
+
+02:13:26.220 --> 02:13:33.400
+and elsewhere and you know it's fabulous programming as well, I think very impressive.
+
+02:13:33.400 --> 02:13:39.960
+Cool, I know that he got, at least I saw some people praising that C manual that he recently
+
+02:13:39.960 --> 02:13:48.720
+published, I think it was in the last, somewhere in the last year, probably more like six months
+
+02:13:48.720 --> 02:13:57.120
+he released some kind of C documentation so I would wonder if he would ever consider doing
+
+02:13:57.120 --> 02:14:01.640
+something for Elisp or for Emacs or anything like that.
+
+02:14:01.640 --> 02:14:07.360
+Yeah he did talk about, that was one of the things he wanted, to update the Emacs list
+
+02:14:07.360 --> 02:14:16.080
+but I mean I think the intro of it if I remember, right, Chiselle's book right, I wanted to
+
+02:14:16.080 --> 02:14:24.880
+read it, I think the manual is pretty good but yeah, I mean there's so much to keep up
+
+02:14:24.880 --> 02:14:32.360
+with, I mean Ellie is so productive and I mean the rate at which they're adding stuff
+
+02:14:32.360 --> 02:14:39.480
+to Emacs is pretty, and that I mean if you ever look at the developer list it's a massive
+
+02:14:39.480 --> 02:14:44.720
+number, it's the same with the org, I don't know how people get anything done, they have
+
+02:14:44.720 --> 02:14:53.400
+so many, and Ehor processes like every message on there, this must be his job to some extent
+
+02:14:53.400 --> 02:15:01.360
+because it just, it would be so much time and like the hyperbole list, there's nothing,
+
+02:15:01.360 --> 02:15:06.800
+I mean it's no problem at all, it doesn't take any time but they have so many topics
+
+02:15:06.800 --> 02:15:11.160
+that people are talking about, it's very impressive.
+
+02:15:11.160 --> 02:15:18.000
+I don't understand how they get by without a better tracking system, I mean DevBugs is
+
+02:15:18.000 --> 02:15:28.000
+certainly good but it's not as, trying to find the right words here, I don't think I'm
+
+02:15:28.000 --> 02:15:35.600
+not trying to insult it but it's like a backlog, like a more kind of elaborate tracking system
+
+02:15:35.600 --> 02:15:40.520
+that kind of like separates, all right let's put this in our backlog, let's prioritize
+
+02:15:40.520 --> 02:15:48.520
+it, let's analyze it, but no, it just comes in and gets immediately handled and gets resolved,
+
+02:15:48.520 --> 02:15:54.880
+whether it's a no or a yes, things tend to be addressed and finished very quickly.
+
+02:15:54.880 --> 02:15:58.920
+So you're saying it's topics that concern me, I should bring up with them and they'll
+
+02:15:58.920 --> 02:16:04.120
+actually get dealt with pretty quickly?
+
+02:16:04.120 --> 02:16:11.680
+Whether to your satisfaction or not, I think so, my sense is in general that things don't
+
+02:16:11.680 --> 02:16:18.520
+come in and then get planned, they come in and they get done or they don't get done ever.
+
+02:16:18.520 --> 02:16:25.440
+My issues with the org, I think they've done a lot of great stuff from a user perspective,
+
+02:16:25.440 --> 02:16:32.960
+my issues have been with the way it was written, was very sloppy code for a long time, now
+
+02:16:32.960 --> 02:16:39.020
+they've spent a lot of time rewriting stuff so I think it's a lot better but I was looking
+
+02:16:39.020 --> 02:16:45.080
+at something the other day and it was clear that this should be at least a separate function
+
+02:16:45.080 --> 02:16:49.960
+or abstracted out and it was all hard coded in the function, so I think they sort of do
+
+02:16:49.960 --> 02:16:57.680
+that on a piecemeal basis because they've got a lot of legacy code from the way it started
+
+02:16:57.680 --> 02:17:03.280
+and they knew that it wasn't written the way they wanted, like having to write a totally
+
+02:17:03.280 --> 02:17:08.600
+new parser is a good example and yeah, we all go through that refactoring and stuff
+
+02:17:08.600 --> 02:17:16.160
+but I think it's because it was a quick and dirty solution for Karsten to solve, the same
+
+02:17:16.160 --> 02:17:24.960
+way the web was, right, I mean they just wanted a publishing platform for physicists, so now
+
+02:17:24.960 --> 02:17:36.300
+the guy who wrote that is a true genius, what's his name, the web inventor, so he took a broader
+
+02:17:36.300 --> 02:17:41.480
+approach to it but basically they had to get something up fast and running and that just
+
+02:17:41.480 --> 02:17:49.120
+sort of proved the concept and then you had to have the whole engineering team at Mosaic
+
+02:17:49.120 --> 02:17:56.800
+come in and actually do a lot more with it but they lost, the original web had full editing
+
+02:17:56.800 --> 02:18:03.740
+capabilities like in wikis and they lost that almost immediately when they went to the graphical
+
+02:18:03.740 --> 02:18:11.060
+web and so we've been hurting, you know, like every time I used to go when I was, early
+
+02:18:11.060 --> 02:18:18.000
+days of the web, I'd look and I'd look at this form and I'd say okay, so this is like
+
+02:18:18.000 --> 02:18:22.800
+you enter this data and then it runs this program and it does this thing, so how do
+
+02:18:22.800 --> 02:18:31.920
+I see what the program does, how does it process the form, it was never connected, the code
+
+02:18:31.920 --> 02:18:39.520
+was never connected to the form of like why would you want this set of inputs that is
+
+02:18:39.520 --> 02:18:46.920
+totally disconnected from the way it's processed, right, it was hidden in the back end, right,
+
+02:18:46.920 --> 02:18:52.680
+which you had no access to, it's like I guess good for proprietary vendors but it's like
+
+02:18:52.680 --> 02:18:58.400
+so for engineers to understand the system, it was very, very difficult, what if I have
+
+02:18:58.400 --> 02:19:05.480
+a hundred forms, so I see, yeah, that there's like one function that's referred to in the
+
+02:19:05.480 --> 02:19:11.440
+form but I don't know anything about that, I can't even see it's calling invocation
+
+02:19:11.440 --> 02:19:18.960
+a lot of times, right, so it's like that's just broken architecture and nobody cared,
+
+02:19:18.960 --> 02:19:24.240
+they just like let it go on and now you have all these, what, I mean was there an alternative
+
+02:19:24.240 --> 02:19:31.720
+to that, did it start somewhere else and then, well you encapsulate it as like the processing
+
+02:19:31.720 --> 02:19:39.800
+is part of the form abstraction, that it's an active entity and they can be separated
+
+02:19:39.800 --> 02:19:45.480
+if they live, right, like you have the front end and the back end piece of the form behavior
+
+02:19:45.480 --> 02:19:51.320
+but maybe you want that abstraction to be able to migrate front end to back end across
+
+02:19:51.320 --> 02:19:59.120
+time and so you need to have these two parts and we see this in building things now, right,
+
+02:19:59.120 --> 02:20:04.680
+what are we using, we're using TypeScript on the front end and we're using C sharp on
+
+02:20:04.680 --> 02:20:12.080
+the back end, so I imagine there's some impedance mismatches going on around there but we actually
+
+02:20:12.080 --> 02:20:17.580
+introduced a Python validation framework, I don't want to get into this too much but
+
+02:20:17.580 --> 02:20:23.960
+we are using those technologies and we can share those now across the front end and back
+
+02:20:23.960 --> 02:20:34.520
+end and so, you know, a lot of languages that you need to understand and I just think, so
+
+02:20:34.520 --> 02:20:40.140
+like closures, right, you're familiar with closures, right, so I mean that's what you're
+
+02:20:40.140 --> 02:20:49.080
+doing is you're passing around the environment so that you can interpret the data properly
+
+02:20:49.080 --> 02:20:57.400
+because you have the closure which wraps around it and so many things get, when you want to
+
+02:20:57.400 --> 02:21:05.380
+deal with unwinding state, you know, through many levels, having the closures allows you
+
+02:21:05.380 --> 02:21:12.200
+to do that easily, sort of the lexical binding versus the dynamic binding and so, you know,
+
+02:21:12.200 --> 02:21:20.920
+the callback hell that they talk about in Node.js is reflective of not having a good
+
+02:21:20.920 --> 02:21:29.880
+closure-based environment, when you look at most of the list-based web environments are
+
+02:21:29.880 --> 02:21:36.920
+closure-based and they can do much more interesting application building without dealing with
+
+02:21:36.920 --> 02:21:41.000
+a lot of the plumbing than if they didn't have that.
+
+02:21:41.000 --> 02:21:49.480
+Interesting and when you refer to closures, are you saying that there's a certain paradigm
+
+02:21:49.480 --> 02:21:56.760
+of form processing on the web that's more like a closure-based solution?
+
+02:21:56.760 --> 02:22:04.480
+That's right, yeah, look at the common Lisp, like Hutchin2 and frameworks built on top
+
+02:22:04.480 --> 02:22:07.400
+of that and you'll see.
+
+02:22:07.400 --> 02:22:12.480
+I definitely will do that but I meant more like when you're talking about the early days
+
+02:22:12.480 --> 02:22:20.600
+and how they separated the form from the actions, are you saying that that's a situation where
+
+02:22:20.600 --> 02:22:26.960
+like something that would be like a closure is more or are you just strictly talking about
+
+02:22:26.960 --> 02:22:27.960
+that?
+
+02:22:27.960 --> 02:22:32.640
+That would help solve that problem, I would say, because it gives you, you know, sort
+
+02:22:32.640 --> 02:22:38.040
+of you're seeing some of it in React now, they're like, oh, we've discovered components
+
+02:22:38.040 --> 02:22:46.040
+and so, you know, we only have to do partial updates now because we can like walk our tree
+
+02:22:46.040 --> 02:22:54.080
+and know that only this subcomponent, you know, and it's like, yeah, by building all
+
+02:22:54.080 --> 02:23:02.400
+these abstractions, you simplify your state management a lot and you simplify that and
+
+02:23:02.400 --> 02:23:06.720
+you localize where any of your issues can be.
+
+02:23:06.720 --> 02:23:15.140
+And so, if I have my processing engine totally disconnected from my input state, you know,
+
+02:23:15.140 --> 02:23:19.600
+it's going to cause a lot of problems and you saw it in the early days of the web where
+
+02:23:19.600 --> 02:23:26.200
+everything was, what was it, CGI, is that what it was, right?
+
+02:23:26.200 --> 02:23:32.240
+You just sort of, you had a totally separate back end and there was just this very thin
+
+02:23:32.240 --> 02:23:39.480
+kind of connection to the front end and everybody's rediscovered, they rediscovered sockets, okay,
+
+02:23:39.480 --> 02:23:45.160
+we need sockets and then everybody's fighting, well, I have to replicate the data on the
+
+02:23:45.160 --> 02:23:53.120
+front end and the back end, you know, just handling tables is such a bear on the web
+
+02:23:53.120 --> 02:23:54.920
+for similar reasons, right?
+
+02:23:54.920 --> 02:24:02.360
+So you had, what was that company Apollo or that was one of their frameworks who was trying
+
+02:24:02.360 --> 02:24:11.360
+to do real time front end, back end framework so that you can do all these pushes to a million
+
+02:24:11.360 --> 02:24:18.160
+clients, right, of any change and you could get like real time updates.
+
+02:24:18.160 --> 02:24:23.320
+You know, that seems fundamental to me if you're going to have a Facebook like kind
+
+02:24:23.320 --> 02:24:29.820
+of environment and you look at how much money Facebook had to spend to just build their
+
+02:24:29.820 --> 02:24:33.560
+basic application that scales at the level that they needed it.
+
+02:24:33.560 --> 02:24:35.540
+I mean, it's just nymph.
+
+02:24:35.540 --> 02:24:38.760
+You're talking about hot reloading, right, of data?
+
+02:24:38.760 --> 02:24:46.560
+Yeah, yeah, but I'm talking about like how it flows and where it's maintained and, you
+
+02:24:46.560 --> 02:24:50.040
+know, is there a single source of truth, right?
+
+02:24:50.040 --> 02:24:51.360
+That's what we really want.
+
+02:24:51.360 --> 02:24:57.000
+So people try to push stuff to the back end, but then you get all of this problem of the
+
+02:24:57.000 --> 02:24:58.960
+front ends out of date.
+
+02:24:58.960 --> 02:25:00.640
+So what's your method?
+
+02:25:00.640 --> 02:25:07.440
+You keep web sockets open, you know, it's like, well, then I have too many of those.
+
+02:25:07.440 --> 02:25:17.360
+So yeah, and what's your programming model for pushing all that data around anyway, right?
+
+02:25:17.360 --> 02:25:25.000
+Pushing, pulling, it's complex stuff, but if you solve it, there's a guy who wrote a
+
+02:25:25.000 --> 02:25:32.120
+web server, like tiny, tiny WB or something.
+
+02:25:32.120 --> 02:25:38.720
+I could look it up, but it's like, and he shows benchmarks of what he can process from
+
+02:25:38.720 --> 02:25:41.100
+this one like C-based program.
+
+02:25:41.100 --> 02:25:48.860
+And it's like five times the speed of other things just based on the algorithms that he
+
+02:25:48.860 --> 02:25:55.840
+implemented and so, you know, so you get your scale right like that and then you keep adding
+
+02:25:55.840 --> 02:26:00.600
+on some abstraction layers because now you can afford it.
+
+02:26:00.600 --> 02:26:06.200
+And then you simplify your programming model and like, we could be building the kinds of
+
+02:26:06.200 --> 02:26:12.240
+web applications that we want, you know, with menus even without, have you ever figured
+
+02:26:12.240 --> 02:26:16.640
+out how to do a good menu on a web app, you know?
+
+02:26:16.640 --> 02:26:22.920
+It's so much energy, right, when like in Emacs it would be just, here's my menu item and
+
+02:26:22.920 --> 02:26:23.920
+I'm done.
+
+02:26:23.920 --> 02:26:32.220
+So I think the baseline of what your programming model is matters so much from the syntax down
+
+02:26:32.220 --> 02:26:40.320
+to like the lexical scoping and, you know, and we're just lucky that Lisp got a lot of
+
+02:26:40.320 --> 02:26:45.780
+things right, that we have that as sort of like the thinking man's programming environment
+
+02:26:45.780 --> 02:26:52.460
+while all these other people were stuffed into Java, you know, in the 80s and they built
+
+02:26:52.460 --> 02:27:01.560
+Java beans and if you've ever looked at J2EE, I mean, that was such a monstrosity that it
+
+02:27:01.560 --> 02:27:04.880
+just collapsed literally of its own weight sort of.
+
+02:27:04.880 --> 02:27:11.440
+I mean, people are still using Java but it's like nobody wants to field a new web app,
+
+02:27:11.440 --> 02:27:16.760
+you know, in J2EE, it's just not done.
+
+02:27:16.760 --> 02:27:23.340
+So unless you have, you know, a ton of legacy investment that you have to keep up.
+
+02:27:23.340 --> 02:27:30.480
+So I think these design choices matter a lot and I think Apple's renaissance has been based
+
+02:27:30.480 --> 02:27:36.860
+on, you know, really saying, well, we'll iterate through our designs before we subject the
+
+02:27:36.860 --> 02:27:38.360
+users to them.
+
+02:27:38.360 --> 02:27:45.840
+We're not going to just make everybody one big beta test like Facebook or Microsoft and,
+
+02:27:45.840 --> 02:27:52.280
+you know, you see that like people have, you know, certainly in the consumer space have,
+
+02:27:52.280 --> 02:27:58.760
+you know, the shops are always full, I mean, wherever Apple store you go to and, you know,
+
+02:27:58.760 --> 02:28:04.480
+Microsoft is trying, Sony tries to have stores and stuff but you don't, they're not filled
+
+02:28:04.480 --> 02:28:10.480
+with this traffic, you know, because people aren't attached to the design aesthetic the
+
+02:28:10.480 --> 02:28:11.480
+same way.
+
+02:28:11.480 --> 02:28:12.480
+True, yeah.
+
+02:28:12.480 --> 02:28:17.120
+Yeah, they got something, they certainly have something that people want.
+
+02:28:17.120 --> 02:28:24.760
+Every program grows until it's a half a common list implementation or it's got a mail server
+
+02:28:24.760 --> 02:28:31.120
+in it, like you got those two sayings, oh, have you seen this at all?
+
+02:28:31.120 --> 02:28:36.240
+It's kind of lets you make desktop like apps with Common Lisp.
+
+02:28:36.240 --> 02:28:44.160
+I like the name though, Omnificent GUI Builder, you're giving us a lot of great links today,
+
+02:28:44.160 --> 02:28:45.160
+it's making me happy.
+
+02:28:45.160 --> 02:28:53.880
+It's for a YouTube video but they also have a GitHub page somewhere.
+
+02:28:53.880 --> 02:29:02.560
+I wish I did more Common Lisp but this is, and this is pretty new too, this is about
+
+02:29:02.560 --> 02:29:04.440
+a half a year old only.
+
+02:29:04.440 --> 02:29:09.320
+Well, does it look decent?
+
+02:29:09.320 --> 02:29:10.880
+Is it real or is it like?
+
+02:29:10.880 --> 02:29:18.160
+Well, it seems kind of like React.js where you're not writing, where you're, it's not
+
+02:29:18.160 --> 02:29:26.320
+the pure HTML post Git model where it's more like an application and like if you look at
+
+02:29:26.320 --> 02:29:30.240
+the screen, like you have the applications, you can move them around like it is in this
+
+02:29:30.240 --> 02:29:31.240
+up.
+
+02:29:31.240 --> 02:29:40.440
+It certainly looks functional, that would be my way to say it.
+
+02:29:40.440 --> 02:29:45.920
+And then you just write it in all one language.
+
+02:29:45.920 --> 02:29:50.040
+Just like Smalltalk, like what their environment used to look like.
+
+02:29:50.040 --> 02:29:57.640
+Oh yeah, and that, the glorious toolkits is the thing I was...
+
+02:29:57.640 --> 02:30:03.840
+Well there was a time when we had single UI builder environments and then you would just
+
+02:30:03.840 --> 02:30:11.160
+say what theme you wanted, Windows, Mac OS, and instantly it would look like the other
+
+02:30:11.160 --> 02:30:14.600
+environment and you had to do no work to get that.
+
+02:30:14.600 --> 02:30:22.560
+It's like, wow, that would be nice these days.
+
+02:30:22.560 --> 02:30:27.720
+Another thing with that philosophy of the copying the programs, you had Keanu Reeves
+
+02:30:27.720 --> 02:30:34.200
+talking about NFTs and it's like, what do you think about these NFTs with the matrix?
+
+02:30:34.200 --> 02:30:40.000
+You mean we're gonna have a computer, let's see, you mean we're gonna spend all this,
+
+02:30:40.000 --> 02:30:47.080
+you mean we're gonna have, you want me to be on board with charging people for these
+
+02:30:47.080 --> 02:30:55.320
+digital things on a computer that's designed to make copies?
+
+02:30:55.320 --> 02:31:01.520
+The whole person just like completely stopped because they're trying to, yeah, showed you
+
+02:31:01.520 --> 02:31:04.720
+how the idea was fundamentally wrong.
+
+02:31:04.720 --> 02:31:09.360
+Yeah, get your baseline, right?
+
+02:31:09.360 --> 02:31:18.880
+I mean, I've had to, I'm very pro-Ukraine and so I've learned a lot more about Russian
+
+02:31:18.880 --> 02:31:19.880
+history.
+
+02:31:19.880 --> 02:31:27.520
+I also have a number of Russian workmates who are very nice people, but they left Russia
+
+02:31:27.520 --> 02:31:38.560
+as well and a lot of what's going on seems to be from decisions that were made eons ago
+
+02:31:38.560 --> 02:31:44.280
+in the back to the Mongols and the way they ran their systems.
+
+02:31:44.280 --> 02:31:49.760
+So it's like when everybody says we've got to run so fast and we don't have time to really
+
+02:31:49.760 --> 02:31:57.520
+think through the design, they can't see the impact that that's gonna have on their enterprise
+
+02:31:57.520 --> 02:31:58.520
+or anything else.
+
+02:31:58.520 --> 02:32:05.520
+And if you're a long-term person, you obviously have to do things fast enough so the company
+
+02:32:05.520 --> 02:32:11.560
+can survive, but you have to think about that strategic level as well.
+
+02:32:11.560 --> 02:32:14.960
+Those who don't know history are doomed to repeat it.
+
+02:32:14.960 --> 02:32:17.520
+Yeah, exactly.
+
+02:32:17.520 --> 02:32:19.120
+Sometimes very badly.
+
+02:32:19.120 --> 02:32:27.080
+So how do we get Lisp to be something again?
+
+02:32:27.080 --> 02:32:28.760
+People are worried about Emacs dying out.
+
+02:32:28.760 --> 02:32:35.680
+I don't think that's happening so much, but certainly Lisp missed its position in web
+
+02:32:35.680 --> 02:32:42.680
+development, it seems, even though it can be quite capable there, but because of its
+
+02:32:42.680 --> 02:32:53.640
+image model and lack of focus on threading, it seems like you can't get anybody to even
+
+02:32:53.640 --> 02:32:58.400
+look at it now, right?
+
+02:32:58.400 --> 02:33:04.360
+I mean, unless you're talking about Clojure, like you talked about.
+
+02:33:04.360 --> 02:33:09.280
+You're talking about how Scheme would have been a lot better for JavaScript when JavaScript
+
+02:33:09.280 --> 02:33:15.560
+was first released, or like Emacs, because Emacs is good for a platform for distributing
+
+02:33:15.560 --> 02:33:25.280
+apps versus HTML as a document reader that they shoved applications into.
+
+02:33:25.280 --> 02:33:28.800
+I like the way you describe things.
+
+02:33:28.800 --> 02:33:34.080
+Yeah, I can't argue with that.
+
+02:33:34.080 --> 02:33:37.520
+But it is interesting to me.
+
+02:33:37.520 --> 02:33:45.120
+A lot of people don't know certain systems that are Lisp based that have been super successful,
+
+02:33:45.120 --> 02:33:55.240
+like Orbitz was based on the technology of a Cambridge company that implemented the bulk
+
+02:33:55.240 --> 02:34:05.000
+of their flight scheduling software in Lisp, and they had a very active kind of Lisp community.
+
+02:34:05.000 --> 02:34:07.280
+So you know, it's still-
+
+02:34:07.280 --> 02:34:10.040
+Hacker News is another one.
+
+02:34:10.040 --> 02:34:14.080
+Hacker News, yeah, that's built in Lisp?
+
+02:34:14.080 --> 02:34:21.040
+Yeah, the person who founded it was using Lisp and Paul Graham.
+
+02:34:21.040 --> 02:34:23.880
+Sam Altman?
+
+02:34:23.880 --> 02:34:25.440
+Paul Graham?
+
+02:34:25.440 --> 02:34:27.440
+Paul Graham.
+
+02:34:27.440 --> 02:34:28.440
+He founded it.
+
+02:34:28.440 --> 02:34:29.440
+Oh, I didn't know he was-
+
+02:34:29.440 --> 02:34:31.440
+Or at least he was involved in it anyway.
+
+02:34:31.440 --> 02:34:32.440
+Yeah, yeah, yeah.
+
+02:34:32.440 --> 02:34:33.440
+It was either that or Reddit.
+
+02:34:33.440 --> 02:34:34.440
+It was one or the other.
+
+02:34:34.440 --> 02:34:44.400
+He had an interesting Yahoo shopping experience where he wrote about that, how he leveraged
+
+02:34:44.400 --> 02:34:46.840
+Lisp to his advantage.
+
+02:34:46.840 --> 02:34:51.840
+So yeah, I think Python was that way until it got discovered.
+
+02:34:51.840 --> 02:35:02.640
+I worked with those guys back in Silicon Valley for a little while, and when we were trying
+
+02:35:02.640 --> 02:35:09.680
+to show the world that Python was something good, but it hadn't been noticed yet.
+
+02:35:09.680 --> 02:35:17.000
+So there's a lot of leverage that you can get if you're careful about it.
+
+02:35:17.000 --> 02:35:23.920
+One thing that I thought was interesting is you look at the- Google did some survey of
+
+02:35:23.920 --> 02:35:32.160
+the most efficient programming languages to run, and I think C was number one, and you
+
+02:35:32.160 --> 02:35:39.280
+look at the list, and the only one that even looks remotely high level is Common Lisp,
+
+02:35:39.280 --> 02:35:51.200
+where it's sent per the TDP or whatever that would be called, sent per execution or whatever.
+
+02:35:51.200 --> 02:35:53.760
+Everything else is more like C.
+
+02:35:53.760 --> 02:35:59.200
+Have you heard of Pico Lisp?
+
+02:35:59.200 --> 02:36:01.160
+A little bit.
+
+02:36:01.160 --> 02:36:09.840
+On RosettaCode, where they write the different implementations of algorithms in different
+
+02:36:09.840 --> 02:36:16.720
+languages, look at any sort of algorithm and the Pico Lisp implementation next to all the
+
+02:36:16.720 --> 02:36:25.600
+others, and it's always super tiny, and you've got just a ton more code and everything else.
+
+02:36:25.600 --> 02:36:32.920
+And then Pico Lisp is like Lisp with a database, maybe a triplet database built in, and it's
+
+02:36:32.920 --> 02:36:35.880
+pretty small and efficient.
+
+02:36:35.880 --> 02:36:39.160
+But I don't think anybody uses it.
+
+02:36:39.160 --> 02:36:46.200
+But it's an interesting example of a special case Lisp that you could embed in other things
+
+02:36:46.200 --> 02:36:48.200
+or use.
+
+02:36:48.200 --> 02:36:53.720
+One guy in Germany has been doing it for many years.
+
+02:36:53.720 --> 02:36:57.480
+Is that like an internet rule or a computing rule that we could come up with?
+
+02:36:57.480 --> 02:37:01.720
+No matter what you could think of, no matter what you find, there's one guy in Germany
+
+02:37:01.720 --> 02:37:07.440
+who's already done it.
+
+02:37:07.440 --> 02:37:09.760
+Well, I knew some Dutch people.
+
+02:37:09.760 --> 02:37:12.080
+I was in embedded systems at Motorola.
+
+02:37:12.080 --> 02:37:16.560
+We were working with very small microcontrollers with no memory.
+
+02:37:16.560 --> 02:37:21.960
+So we needed these super efficient cross compilers to build anything for us.
+
+02:37:21.960 --> 02:37:27.520
+And this company in Amsterdam seemed to have some skills.
+
+02:37:27.520 --> 02:37:31.600
+And so we started talking to them, and then we flew over there to do due diligence and
+
+02:37:31.600 --> 02:37:32.600
+check them out.
+
+02:37:32.600 --> 02:37:38.040
+And God, if they did not have one of the most advanced software development operations I'd
+
+02:37:38.040 --> 02:37:42.620
+ever seen, total quality assurance, great people.
+
+02:37:42.620 --> 02:37:46.860
+But everything was like to the T. This is how we do it, boom, boom, boom.
+
+02:37:46.860 --> 02:37:54.600
+So that's the only way you could get the efficiency out of compilers at the time.
+
+02:37:54.600 --> 02:37:56.920
+And so we worked with them.
+
+02:37:56.920 --> 02:38:06.680
+But they had that German kind of culture of the fit and finish has to be just so.
+
+02:38:06.680 --> 02:38:14.800
+So we used to have to do things like there was 256 bytes of memory.
+
+02:38:14.800 --> 02:38:18.360
+There's no K in there, of RAM.
+
+02:38:18.360 --> 02:38:28.400
+And so you would like to use overlays where you're repeating what you store in each word
+
+02:38:28.400 --> 02:38:33.840
+at different times in the program, and you had to manually keep track of the lifetime
+
+02:38:33.840 --> 02:38:34.840
+of objects.
+
+02:38:34.840 --> 02:38:36.720
+And it was a nightmare.
+
+02:38:36.720 --> 02:38:41.280
+But it was the only way to kind of squeeze some of the stuff in there.
+
+02:38:41.280 --> 02:38:47.560
+And we started in assembler, and then we went to C. And then we had this one time that was
+
+02:38:47.560 --> 02:38:55.040
+really fun that we had, God, I'm really dating myself now, but some of the people in product
+
+02:38:55.040 --> 02:39:02.980
+had these terminals, like 12 inch terminals with eight inch floppy disks on the terminal.
+
+02:39:02.980 --> 02:39:11.800
+And they were using those to interface to the microcontroller boards for emulator boards,
+
+02:39:11.800 --> 02:39:17.080
+where we would test out new software for a board that hadn't been released to production
+
+02:39:17.080 --> 02:39:18.080
+yet.
+
+02:39:18.080 --> 02:39:20.600
+And we would be able to iterate on that.
+
+02:39:20.600 --> 02:39:26.960
+And right next to these things were sun workstations that the engineers used for their normal development.
+
+02:39:26.960 --> 02:39:30.400
+So I was moved from research to product.
+
+02:39:30.400 --> 02:39:34.960
+And they said, so this is how you're going to have to do your code on this monochrome
+
+02:39:34.960 --> 02:39:35.960
+terminal.
+
+02:39:35.960 --> 02:39:40.200
+And I'm like, well, what about using the sun workstation?
+
+02:39:40.200 --> 02:39:43.880
+And it's just a serial port, so we'll just interface it.
+
+02:39:43.880 --> 02:39:45.760
+No, we tried that two years ago.
+
+02:39:45.760 --> 02:39:46.760
+It didn't work.
+
+02:39:46.760 --> 02:39:48.760
+We can't do it.
+
+02:39:48.760 --> 02:39:55.080
+I'm like, I am not going to sit here and use this dumpy thing for a week.
+
+02:39:55.080 --> 02:40:01.200
+So that afternoon, I figured out the protocol and got the thing, the sun workstation, talking
+
+02:40:01.200 --> 02:40:02.200
+to it.
+
+02:40:02.200 --> 02:40:09.760
+And then I wrote a disassembler tool so I could work the assembly, the math, behind
+
+02:40:09.760 --> 02:40:11.320
+it at a higher level.
+
+02:40:11.320 --> 02:40:13.920
+And I had all that going the first week.
+
+02:40:13.920 --> 02:40:18.440
+But people came over, and they're like, what are you doing?
+
+02:40:18.440 --> 02:40:21.600
+How is this possible?
+
+02:40:21.600 --> 02:40:26.600
+They just had started from the vantage point that they really had to live here, and they
+
+02:40:26.600 --> 02:40:29.600
+hadn't done enough of an assessment.
+
+02:40:29.600 --> 02:40:36.760
+So I would just look back at that when people say, this is the only way to do something.
+
+02:40:36.760 --> 02:40:42.660
+That's one of the great things about computers is it can speak too many languages.
+
+02:40:42.660 --> 02:40:48.280
+So if you want to just speak Lisp, you can just speak Lisp, relatively, anyway.
+
+02:40:48.280 --> 02:40:56.520
+Or if everybody else wants to speak that worst language that you don't like as much, you
+
+02:40:56.520 --> 02:41:03.800
+don't necessarily have to speak that, I guess, except for the www, but anyway.
+
+02:41:03.800 --> 02:41:11.720
+Omnificent web development language, and tell everybody that this is the be all and all.
+
+02:41:11.720 --> 02:41:15.320
+I think what I like the most about that is that I don't believe that omnificent is actually
+
+02:41:15.320 --> 02:41:23.680
+a word, so that can be accused of being incorrect, because there is no definition of omnificent
+
+02:41:23.680 --> 02:41:26.040
+that they can be shown not to conform to.
+
+02:41:26.040 --> 02:41:29.720
+I could be talking about that, but that's...
+
+02:41:29.720 --> 02:41:30.800
+There's a Latin word.
+
+02:41:30.800 --> 02:41:36.720
+That's why you know what it means, is because omni is everything, efficient is something
+
+02:41:36.720 --> 02:41:44.440
+about knowing, or everywhere, like the all-knowing GUI builder.
+
+02:41:44.440 --> 02:41:46.440
+Isn't that kind of how you read the omni-efficient?
+
+02:41:46.440 --> 02:41:49.080
+I think that's actually omniscient.
+
+02:41:49.080 --> 02:41:50.080
+I think...
+
+02:41:50.080 --> 02:41:51.080
+Omniscient, yeah.
+
+02:41:51.080 --> 02:41:52.080
+Oh, omniscient.
+
+02:41:52.080 --> 02:41:53.080
+Yeah, that's right.
+
+02:41:53.080 --> 02:41:54.080
+You're close.
+
+02:41:54.080 --> 02:41:55.080
+I think, yeah.
+
+02:41:55.080 --> 02:42:00.520
+C-L-O-G, so it's the clog builder.
+
+02:42:00.520 --> 02:42:02.960
+That sounds like a Lisp-y kind of thing, you know?
+
+02:42:02.960 --> 02:42:09.680
+It doesn't have any sexiness to it, but we've invented the clog builder.
+
+02:42:09.680 --> 02:42:10.680
+You know, that's funny.
+
+02:42:10.680 --> 02:42:12.480
+That was another thing I wanted to mention when I was writing this.
+
+02:42:12.480 --> 02:42:15.120
+It's just to clog how everybody else does things.
+
+02:42:15.120 --> 02:42:16.120
+Just clog it up.
+
+02:42:16.120 --> 02:42:19.120
+No, you don't have to do it that way.
+
+02:42:19.120 --> 02:42:24.800
+Is that something that is real?
+
+02:42:24.800 --> 02:42:32.140
+I feel like a lot of Emacs users are maybe just that type of person in general.
+
+02:42:32.140 --> 02:42:38.400
+We want things that look, not look, but sound, like clog.
+
+02:42:38.400 --> 02:42:47.360
+We prefer things that are awkward and are stupid acronyms, and if it seems like effort
+
+02:42:47.360 --> 02:42:53.720
+has been put into something to make it sound sick or market or anything, it's like, I don't
+
+02:42:53.720 --> 02:42:54.720
+know.
+
+02:42:54.720 --> 02:42:55.720
+I'm not sure.
+
+02:42:55.720 --> 02:43:00.480
+I think that goes back to what I was talking about with the scrolling down.
+
+02:43:00.480 --> 02:43:03.600
+I want it to not have animations.
+
+02:43:03.600 --> 02:43:10.600
+It's just spending CPU cycles to make my experience worse.
+
+02:43:10.600 --> 02:43:15.520
+Why would I want to scroll down half a line so I can read half of a text?
+
+02:43:15.520 --> 02:43:21.120
+Well, if you scroll half of a finger, that's what it would be, if you just do this.
+
+02:43:21.120 --> 02:43:22.400
+Oh, is this the guy?
+
+02:43:22.400 --> 02:43:26.960
+I think this is the guy, the one, the G toolkit, yeah, the glamorous toolkit.
+
+02:43:26.960 --> 02:43:28.920
+I read about this a while ago.
+
+02:43:28.920 --> 02:43:31.560
+This was one Google guy.
+
+02:43:31.560 --> 02:43:40.700
+We had a team, and then I think he left Google, and he's trying to do it, implemented in Faro,
+
+02:43:40.700 --> 02:43:43.000
+the pure object-oriented language.
+
+02:43:43.000 --> 02:43:45.760
+Yeah, this sounds like one of those things.
+
+02:43:45.760 --> 02:43:47.760
+Yeah, that's what it is.
+
+02:43:47.760 --> 02:43:52.200
+You know, there's, yeah, it's like, just get the base right, right?
+
+02:43:52.200 --> 02:43:53.240
+That's what Lisp did.
+
+02:43:53.240 --> 02:44:00.480
+Just give me Kar and Kutter and Lambda Calculus and go for it.
+
+02:44:00.480 --> 02:44:01.480
+What?
+
+02:44:01.480 --> 02:44:03.040
+And I will move the world.
+
+02:44:03.040 --> 02:44:04.040
+Yeah.
+
+02:44:04.040 --> 02:44:09.080
+Well, when you think, you know, I mean, look at the opportunity that was lost with Lisp
+
+02:44:09.080 --> 02:44:10.080
+machines.
+
+02:44:10.080 --> 02:44:11.920
+I was around for those too.
+
+02:44:11.920 --> 02:44:14.520
+I'm near dead, I guess.
+
+02:44:14.520 --> 02:44:24.520
+But I was young, at least then, and they microcoded Lisp, right?
+
+02:44:24.520 --> 02:44:29.480
+So everything atop that was Lisp.
+
+02:44:29.480 --> 02:44:33.800
+The Windows system was Lisp, you know, sort of like what Jobs was trying to do.
+
+02:44:33.800 --> 02:44:39.240
+He was trying to do, I don't know, well, when he did display PostScript, or he was trying
+
+02:44:39.240 --> 02:44:42.920
+to get common experience at different levels.
+
+02:44:42.920 --> 02:44:48.320
+But like, if you really have a consistent programming model across your whole damn system,
+
+02:44:48.320 --> 02:44:58.120
+you know, it's probably thousands of man years of work that you just eliminate right there
+
+02:44:58.120 --> 02:45:02.920
+if you have a decent language, right, and then a debugging environment.
+
+02:45:02.920 --> 02:45:09.520
+I mean, we still use stuff that there is no debugging environment for, right?
+
+02:45:09.520 --> 02:45:15.240
+Because it solves some problem that exists in the industry, and we haven't gotten rid
+
+02:45:15.240 --> 02:45:17.440
+of it yet.
+
+02:45:17.440 --> 02:45:22.320
+I want to set up some Raspberry Pi lights.
+
+02:45:22.320 --> 02:45:27.380
+If you have like that with an embedded controller, if you run that with Lisp, you're probably
+
+02:45:27.380 --> 02:45:33.720
+going to get a REPL for free that is going to allow you to remotely control your lights.
+
+02:45:33.720 --> 02:45:42.280
+You know, they have MicroPython for that, if you're into Python at all.
+
+02:45:42.280 --> 02:45:48.500
+That was a physicist, I don't know if he was German, but a physicist who implemented that
+
+02:45:48.500 --> 02:45:52.840
+to do controller hardware, and it's pretty good.
+
+02:45:52.840 --> 02:45:59.320
+He's moved a lot of, I think they actually got money behind it, and then started moving
+
+02:45:59.320 --> 02:46:01.680
+all the libraries into that too.
+
+02:46:01.680 --> 02:46:02.680
+So that runs pretty well.
+
+02:46:02.680 --> 02:46:08.340
+And you got stuff like CPython too, but I think part of the thing that makes Python
+
+02:46:08.340 --> 02:46:14.120
+appealing to people is you got all these libraries that people can use to build their apps with,
+
+02:46:14.120 --> 02:46:18.360
+and if you're running MicroPython or CPython, do you have access to those?
+
+02:46:18.360 --> 02:46:19.360
+Right.
+
+02:46:19.360 --> 02:46:24.120
+Well, that's what I'm saying, they like have been moving on that to get a lot more of the
+
+02:46:24.120 --> 02:46:31.200
+libraries available, because at first, that's right, that was part of what they were lacking.
+
+02:46:31.200 --> 02:46:36.720
+But just, you know, being able to put your language at the hardware level without a separate
+
+02:46:36.720 --> 02:46:41.760
+operating system is kind of an interesting concept too.
+
+02:46:41.760 --> 02:46:47.280
+And at that time with the Lisp machines, they were making the CPUs in line with, you had
+
+02:46:47.280 --> 02:46:53.800
+somebody making CPUs specifically for the Lisp machines, and ever since then, we've
+
+02:46:53.800 --> 02:46:59.960
+always been making CPUs to specifically target C, and I wonder how much that kind of like
+
+02:46:59.960 --> 02:47:07.800
+the philosophy and artifacts that you design, I wonder if like CPUs would look different
+
+02:47:07.800 --> 02:47:13.880
+and stuff like that, because we'd be optimizing them for Lambda calculus or something, and
+
+02:47:13.880 --> 02:47:17.760
+Reples, and if that would result in anything different.
+
+02:47:17.760 --> 02:47:25.120
+Well, I always ask my friend in London who knows everything, or he knows something about
+
+02:47:25.120 --> 02:47:38.720
+everything, why I remember the fastest computer I ever used was a DEC Alpha in the 80s, and
+
+02:47:38.720 --> 02:47:45.720
+it was, or maybe the beginning of the 90s, so it was a 64-bit machine at the time, and
+
+02:47:45.720 --> 02:47:52.760
+it used SCSI disks, and I would, you know, compilation took a while of programs, but
+
+02:47:52.760 --> 02:47:57.640
+I would go to compile, and I would just see these messages fly by me, and it would be
+
+02:47:57.640 --> 02:48:04.400
+like Go is today, right, be done in an instant, and like, how is that possible, I go over
+
+02:48:04.400 --> 02:48:11.520
+to this other machine, and they were emulating, I thought it had 128-bit data paths, but we
+
+02:48:11.520 --> 02:48:17.080
+looked it up, it was 64-bit, but they did have 128-bit words.
+
+02:48:17.080 --> 02:48:22.480
+You're talking about like boot up speed, and like how fast when you press a letter G on
+
+02:48:22.480 --> 02:48:26.680
+a keyboard, how fast it appears on your screen, and stuff like that, right?
+
+02:48:26.680 --> 02:48:32.840
+No, compilation of a complex application, how long that would take, and how long I would
+
+02:48:32.840 --> 02:48:38.560
+have to wait, and it was near instantaneous in many cases, and I had never experienced
+
+02:48:38.560 --> 02:48:39.600
+that before.
+
+02:48:39.600 --> 02:48:48.680
+So their disks were super fast, the throughput on the data buses was super fast, and I mean,
+
+02:48:48.680 --> 02:48:56.120
+it just worked like if you wanted a fast computer, it felt right, and I've not, you know, despite
+
+02:48:56.120 --> 02:49:02.700
+all the hardware I've had access to, I haven't had that same experience on any other machine
+
+02:49:02.700 --> 02:49:03.700
+to do.
+
+02:49:03.700 --> 02:49:11.240
+I know the Zig programming language has recently gotten an incremental compiler for it.
+
+02:49:11.240 --> 02:49:12.240
+Nice.
+
+02:49:12.240 --> 02:49:13.240
+So it would.
+
+02:49:13.240 --> 02:49:15.640
+Yeah, they're doing good work, they're doing good.
+
+02:49:15.640 --> 02:49:17.640
+Have you seen Vlang too?
+
+02:49:17.640 --> 02:49:19.760
+That's sort of interesting.
+
+02:49:19.760 --> 02:49:24.160
+I've seen that a little bit, but I haven't looked too much into it.
+
+02:49:24.160 --> 02:49:33.720
+There's this one Russian guy, and he's building his own Go-like replacement for C, because
+
+02:49:33.720 --> 02:49:40.000
+he likes Go a lot, but he wants to solve some other problems that he didn't like in Go,
+
+02:49:40.000 --> 02:49:43.280
+and the things he says about it are incredible.
+
+02:49:43.280 --> 02:49:47.640
+It doesn't, well, it didn't have garbage collection at first, right, because he wants to do all
+
+02:49:47.640 --> 02:49:54.760
+those machine-level things, but they seem to be able to build things that they promote
+
+02:49:54.760 --> 02:49:59.160
+as doing a lot, like an entire web framework they have already.
+
+02:49:59.160 --> 02:50:06.760
+They have their own graphics system and, you know, should be able to do very fast compositing.
+
+02:50:06.760 --> 02:50:13.040
+Who knows, you know, and so a lot of people say that he's over-promising, but he keeps
+
+02:50:13.040 --> 02:50:21.080
+delivering these snippets about, well, V, originally he had to translate V to C to get it to compile.
+
+02:50:21.080 --> 02:50:29.800
+Now it's self-hosting, and he can compile the whole language in 1.8 seconds from start,
+
+02:50:29.800 --> 02:50:39.120
+right, things like that, and so he's bootstrapping these super-efficient things to get to a very
+
+02:50:39.120 --> 02:50:45.680
+Rust-like systems programming language, but potentially cleaner.
+
+02:50:45.680 --> 02:50:51.640
+But it doesn't have, you know, people behind it like Rust, and you don't know if what he's
+
+02:50:51.640 --> 02:50:56.640
+saying is actually true, but if it is, you know, it might be like Zig and be something
+
+02:50:56.640 --> 02:50:58.640
+really interesting.
+
+02:50:58.640 --> 02:51:04.560
+Zig did cached compilations, so if you compiled something and then you changed a little bit
+
+02:51:04.560 --> 02:51:07.800
+and you compile it again, you're not going to compile very much.
+
+02:51:07.800 --> 02:51:11.680
+Right, so it'll be super-fast that way too.
+
+02:51:11.680 --> 02:51:20.000
+Yeah, I mean, memoization, that's caching if you can do it right, I'll save your ass
+
+02:51:20.000 --> 02:51:22.960
+every time, right, that's sort of.
+
+02:51:22.960 --> 02:51:27.240
+Then they have a self-hosted compiler, so I think that's one that will do the incremental
+
+02:51:27.240 --> 02:51:34.680
+compilations, so like that one will just be much faster and give you more debug stuff.
+
+02:51:34.680 --> 02:51:38.720
+But it is interesting, it's like, yeah, start with the REPL, right?
+
+02:51:38.720 --> 02:51:41.280
+Can you do a REPL in your language or not?
+
+02:51:41.280 --> 02:51:46.360
+Can you give me an interactive environment, even if everything has to be compiled?
+
+02:51:46.360 --> 02:51:50.280
+Like Julia, I guess, is going for some of this, right?
+
+02:51:50.280 --> 02:51:56.040
+They're taking some from LIST, they're taking all these efficient scientific libraries,
+
+02:51:56.040 --> 02:52:02.600
+and they're trying to meld them into a functional environment that gives you the most efficient
+
+02:52:02.600 --> 02:52:06.000
+code for any line that you write, right?
+
+02:52:06.000 --> 02:52:15.440
+Because it compiles it based on the dynamic types or something that it experiences, so
+
+02:52:15.440 --> 02:52:17.600
+it's very interesting.
+
+02:52:17.600 --> 02:52:19.920
+Have you seen the JANET Lisp language?
+
+02:52:19.920 --> 02:52:25.920
+It's kind of like V, where it's a very small language that has a web framework for it as
+
+02:52:25.920 --> 02:52:26.920
+well.
+
+02:52:26.920 --> 02:52:29.640
+No, I haven't seen that.
+
+02:52:29.640 --> 02:52:31.160
+I got a link on it right there.
+
+02:52:31.160 --> 02:52:34.840
+Yeah, I see it here, JANET Lisp, not too hard to find.
+
+02:52:34.840 --> 02:52:40.440
+I like their logo, 1950s JANET.
+
+02:52:40.440 --> 02:52:45.600
+Functional and imperative programming language runs on Windows, Linux, Mac OS, and Steam.
+
+02:52:45.600 --> 02:52:47.920
+Entire language is less than one megabyte.
+
+02:52:47.920 --> 02:52:58.000
+This sounds like REBOL, called Sasslerath, it did a lot of FORTH, and then he wrote REBOL,
+
+02:52:58.000 --> 02:53:02.560
+which has now evolved into REDLANG.
+
+02:53:02.560 --> 02:53:08.800
+It doesn't seem like a great language, but it's got that FORTH efficiency, and it's super
+
+02:53:08.800 --> 02:53:15.040
+small with its super small graphics, but it's not that easy to write, I think.
+
+02:53:15.040 --> 02:53:16.040
+This is cool.
+
+02:53:16.040 --> 02:53:17.660
+This sounds really interesting.
+
+02:53:17.660 --> 02:53:22.500
+So who's doing this, JANET?
+
+02:53:22.500 --> 02:53:27.360
+You know where it comes from?
+
+02:53:27.360 --> 02:53:28.360
+What source?
+
+02:53:28.360 --> 02:53:30.760
+They don't have about.
+
+02:53:30.760 --> 02:53:32.560
+Tell us about JANET.
+
+02:53:32.560 --> 02:53:37.240
+Oh, Calvin Rose and contributors.
+
+02:53:37.240 --> 02:53:41.920
+So again, we have one guy and contributor.
+
+02:53:41.920 --> 02:53:43.960
+That's well, you know, that's modern.
+
+02:53:43.960 --> 02:53:45.080
+That's how it is.
+
+02:53:45.080 --> 02:53:51.160
+You know, we talk about repeating the cycles of and how old problems are going to manifest
+
+02:53:51.160 --> 02:53:57.040
+with new technologies, maybe that's the problem that we're doing is that now everyone will
+
+02:53:57.040 --> 02:54:02.120
+have their own language and their own system and has become so satisfying and easy to do
+
+02:54:02.120 --> 02:54:08.240
+that that every single person will write their own programming language, their own architecture,
+
+02:54:08.240 --> 02:54:11.820
+and everyone will become it's like a it's like a monkey's paw or the genie granting
+
+02:54:11.820 --> 02:54:13.400
+you a curse.
+
+02:54:13.400 --> 02:54:18.120
+Everyone will become perfectly competent at this stuff, but not be able to communicate
+
+02:54:18.120 --> 02:54:20.920
+with each other because everyone's has their personal language.
+
+02:54:20.920 --> 02:54:23.960
+It's like the new Tower of Babel.
+
+02:54:23.960 --> 02:54:29.380
+You know, that's the claim that like my my guy in London makes about Lisp, that it's
+
+02:54:29.380 --> 02:54:35.040
+so efficient in making DSLs that nobody can communicate with each other.
+
+02:54:35.040 --> 02:54:43.720
+And I've heard that said about groups working in Lisp together, but I've never seen it.
+
+02:54:43.720 --> 02:54:52.560
+And it doesn't make a lot of sense to me because if you build your DSL for the domain, well,
+
+02:54:52.560 --> 02:54:58.920
+then it's like if people have any concept of the domain, it's going to be quite understandable.
+
+02:54:58.920 --> 02:55:04.720
+And because it's representative, you know, they're not going to struggle with it.
+
+02:55:04.720 --> 02:55:10.680
+It's only if you like, you know, make up terms that don't relate to anything and use that
+
+02:55:10.680 --> 02:55:11.680
+all over.
+
+02:55:11.680 --> 02:55:16.100
+Or if you take the scientists and they use their single character variable names, that's
+
+02:55:16.100 --> 02:55:21.440
+going to be a lot less understandable than something tailored for the domain that you're
+
+02:55:21.440 --> 02:55:22.440
+working in.
+
+02:55:22.440 --> 02:55:23.440
+Right?
+
+02:55:23.440 --> 02:55:24.440
+Good point.
+
+02:55:24.440 --> 02:55:25.440
+Yeah.
+
+02:55:25.440 --> 02:55:28.200
+I wonder how much of it has to do with going back and forth.
+
+02:55:28.200 --> 02:55:32.920
+You know, like if you can't spend all of your time or dedicate a long enough time, if you
+
+02:55:32.920 --> 02:55:38.760
+just go in and look at whatever this DSL is, switch back to idiomatic stuff.
+
+02:55:38.760 --> 02:55:44.520
+It's like, oh, you know, my brain is, you have to context switch all the time, maybe.
+
+02:55:44.520 --> 02:55:54.200
+One of the RACQ talk that was like the best talk for free software, and one of the observations
+
+02:55:54.200 --> 02:55:59.640
+they made was that most of everything was made by one person.
+
+02:55:59.640 --> 02:56:05.440
+And even if you look at a lot of the projects that have more than two people, you have one
+
+02:56:05.440 --> 02:56:07.960
+person and then a maintainer takes over.
+
+02:56:07.960 --> 02:56:10.760
+So it's still really one person working on it.
+
+02:56:10.760 --> 02:56:19.520
+It's like, that's going to be like 95% of everything out there, and everybody chooses
+
+02:56:19.520 --> 02:56:22.760
+a language that's not for that purpose.
+
+02:56:22.760 --> 02:56:25.460
+This was kind of the law of what they were.
+
+02:56:25.460 --> 02:56:28.700
+So if you're going to be doing that, you want to, if you're going to be working on a project
+
+02:56:28.700 --> 02:56:33.640
+over a long period of time, you want a language that has more features that you can master
+
+02:56:33.640 --> 02:56:39.200
+over a long period of time rather than how fast you can write hello world that can keep
+
+02:56:39.200 --> 02:56:44.760
+you interested in over a long period of, like Emacs for instance, Emacs can keep you interested
+
+02:56:44.760 --> 02:56:50.280
+in it for decades.
+
+02:56:50.280 --> 02:56:53.000
+And I think it's a cognitive mismatch.
+
+02:56:53.000 --> 02:56:54.000
+Go ahead.
+
+02:56:54.000 --> 02:57:02.440
+It's good to know that when given the freedom, like in software being such a new technology,
+
+02:57:02.440 --> 02:57:13.400
+to do whatever you want that humans will still recreate the Tower of Babel every single time.
+
+02:57:13.400 --> 02:57:20.840
+We'll never be able to agree on what's a good or right looking language.
+
+02:57:20.840 --> 02:57:25.280
+But I think the reality is that there are better ones.
+
+02:57:25.280 --> 02:57:35.320
+I think languages, written languages without accent marks are fundamentally better than
+
+02:57:35.320 --> 02:57:38.120
+those with accent marks.
+
+02:57:38.120 --> 02:57:44.200
+And so if you're stuck on one with there, you're probably going to get left behind even
+
+02:57:44.200 --> 02:57:47.120
+though you can produce the same meanings.
+
+02:57:47.120 --> 02:57:58.480
+And I think languages without Lisp type macros are never going to be able to solve the problems
+
+02:57:58.480 --> 02:58:07.640
+even though they're computationally equivalent that Lisp people attack because they just
+
+02:58:07.640 --> 02:58:10.840
+can't wrap the complexity in their mind enough.
+
+02:58:10.840 --> 02:58:19.680
+You'd have to have somebody who's 100 times better with a weaker language to do what the
+
+02:58:19.680 --> 02:58:29.600
+essentially average Lisp guy leveraging the macro capability could do.
+
+02:58:29.600 --> 02:58:36.840
+Like in hyperbole, one of the things that we solve that you can't do, I think very well
+
+02:58:36.840 --> 02:58:38.880
+in other languages.
+
+02:58:38.880 --> 02:58:47.880
+So we have our implicit button definitions look like regular defunds, but they have two
+
+02:58:47.880 --> 02:58:50.080
+parts in them.
+
+02:58:50.080 --> 02:58:54.640
+One which is the pattern match, am I in the right context?
+
+02:58:54.640 --> 02:58:59.600
+And then the one that calls the action.
+
+02:58:59.600 --> 02:59:07.400
+But you need, so to make it look the same, like there's only one path that you're running
+
+02:59:07.400 --> 02:59:13.480
+through this code, even though you have to do the pattern matching when you're called
+
+02:59:13.480 --> 02:59:18.040
+one time and you have to do the action invocation when you called another.
+
+02:59:18.040 --> 02:59:29.440
+There's a macro that we created called the hacked, H-A-C-T, and the macro actually takes
+
+02:59:29.440 --> 02:59:40.240
+a, there's a function that it uses that's implicit, that is set to different values
+
+02:59:40.240 --> 02:59:43.840
+at different states in the program.
+
+02:59:43.840 --> 02:59:50.800
+So when you're just looking for the pattern matching, that's all it does.
+
+02:59:50.800 --> 02:59:53.360
+And it sort of drops through the other behavior.
+
+02:59:53.360 --> 03:00:01.600
+And then when it comes back around and you're not doing pattern matching anymore, it executes
+
+03:00:01.600 --> 03:00:02.800
+the action.
+
+03:00:02.800 --> 03:00:09.320
+But looking at the code, you only see that one defund straight kind of path through it.
+
+03:00:09.320 --> 03:00:14.680
+So the engine handles all that, and I don't think you could write anything quite like
+
+03:00:14.680 --> 03:00:19.280
+that without the macro.
+
+03:00:19.280 --> 03:00:26.560
+It's magical, it's probably the closest thing to magic that we have, I guess.
+
+03:00:26.560 --> 03:00:35.360
+Well, you guys have filled up my brain, so I'm going to get some sleep, too.
+
+03:00:35.360 --> 03:00:36.360
+You deserve it.
+
+03:00:36.360 --> 03:00:42.720
+I'm a day ahead of you in that respect, so I'm amazed you've made it this long, to be
+
+03:00:42.720 --> 03:00:43.720
+honest.
+
+03:00:43.720 --> 03:00:51.040
+I don't know if I, did I, was there any, like, is there anything that you guys had, that
+
+03:00:51.040 --> 03:00:53.840
+I had neglected or anything that I should focus on?
+
+03:00:53.840 --> 03:00:57.320
+Well, I don't know, but I'm going to sign off.
+
+03:00:57.320 --> 03:01:04.500
+It's been a real pleasure talking to you guys, and John, I'll get in touch about, you know,
+
+03:01:04.500 --> 03:01:10.200
+give you a chance to take a look at Hyperbole a little bit, and then we could talk about,
+
+03:01:10.200 --> 03:01:15.160
+you know, how you could feedback some stuff, or if you want to interact with, meet some
+
+03:01:15.160 --> 03:01:19.040
+of the other guys in the team sometime, and just talk.
+
+03:01:19.040 --> 03:01:24.160
+Yeah, any of that, yeah, and you've got, I think, I mean, I'll email you if I, or you
+
+03:01:24.160 --> 03:01:26.360
+email me, email me either way.
+
+03:01:26.360 --> 03:01:33.280
+Okay, and on PlasmaStrike, if you're interested, it's open, too, I mean, we need smart people
+
+03:01:33.280 --> 03:01:42.080
+like yourself with lots of ideas and understanding of where things come from to just help out
+
+03:01:42.080 --> 03:01:43.080
+on that.
+
+03:01:43.080 --> 03:01:48.600
+If you have any cycles and you want to get involved, let me know.
+
+03:01:48.600 --> 03:01:56.840
+My email address is all over the Hyperbole code, so easy to find, just rsw.cadu.org will
+
+03:01:56.840 --> 03:01:57.840
+work as well.
+
+03:01:57.840 --> 03:02:03.640
+Yeah, if, yeah, and either of you guys feel free to, if you have any interesting ideas
+
+03:02:03.640 --> 03:02:10.840
+or anything, reach out and email me, I'm on the, I'm on the chatroom, thanks so much,
+
+03:02:10.840 --> 03:02:16.280
+I can't wait till they get this session, and they're like, wait, it's 180,000, it's the
+
+03:02:16.280 --> 03:02:27.600
+easiest thing I've got out of control, I guess, but, you know, they'll want to keep this because
+
+03:02:27.600 --> 03:02:31.800
+it's a great wide-ranging conversation, posterity.
+
+03:02:31.800 --> 03:02:36.520
+I have a feeling they won't run all of it through voice recognition.
+
+03:02:36.520 --> 03:02:39.280
+It definitely belongs with a 10-minute talk.
+
+03:02:39.280 --> 03:02:47.160
+Well, I'll tell you this, and I, not to prolong things, but this is, this is very representative
+
+03:02:47.160 --> 03:02:51.680
+of the amount of time that I, the proportional amount of effort and time that I spent preparing
+
+03:02:51.680 --> 03:02:57.000
+for this 10-minute talk, because for, I'll tell you something that, first, is when you
+
+03:02:57.000 --> 03:03:00.640
+realize that you have a 10-minute talk and you say, how am I going to get 10 minutes?
+
+03:03:00.640 --> 03:03:05.600
+Then you start preparing, and you start, and somehow you wind up with 100 minutes, and
+
+03:03:05.600 --> 03:03:11.640
+then it takes you 10 times as long to cut out, to choose which 90 minutes to cut out.
+
+03:03:11.640 --> 03:03:16.360
+So this is appropriate, it's appropriate for me, this is like my bookend, that I can talk
+
+03:03:16.360 --> 03:03:21.400
+for three hours about that, or at least starting with that time.
+
+03:03:21.400 --> 03:03:26.440
+You should give a talk about that, sort of like how Michelangelo went from the piece
+
+03:03:26.440 --> 03:03:32.000
+of marble to the David, and it's like, you know, I had this infinite amount of material
+
+03:03:32.000 --> 03:03:37.080
+coalescing it to 10 minutes is a 100-hour effort, because it's really true.
+
+03:03:37.080 --> 03:03:41.240
+I like it, because that's, that's a lot of what these tools do, is they allow you to
+
+03:03:41.240 --> 03:03:43.160
+capture your stuff.
+
+03:03:43.160 --> 03:03:47.200
+They allow you to organize it, and they allow you to formalize it, and that organizing part
+
+03:03:47.200 --> 03:03:52.840
+is what, is what gave me, well, isn't, isn't that what they say, that a professional programmer
+
+03:03:52.840 --> 03:03:59.880
+is somebody who will spend an hour automate, spend 100 hours automating something that
+
+03:03:59.880 --> 03:04:02.920
+only takes an hour, one time.
+
+03:04:02.920 --> 03:04:07.280
+I think that's what, I think maybe some professional programmers may say that.
+
+03:04:07.280 --> 03:04:11.160
+I don't know if their bosses would agree.
+
+03:04:11.160 --> 03:04:13.480
+There's some truth to it though, right?
+
+03:04:13.480 --> 03:04:18.520
+So have a great night guys, appreciate it.
+
+03:04:18.520 --> 03:04:22.120
+And yeah, and PlasmaStrike, I don't know if you, if you do end up posting anything of
+
+03:04:22.120 --> 03:04:27.700
+your, of your setup or anything, if you feel like it, just hit me up if you're interested
+
+03:04:27.700 --> 03:04:31.600
+in any of my shit, looking at it, because if you do, I'd, I'd be interested.
+
+03:04:31.600 --> 03:04:32.600
+That's all.
+
+03:04:32.600 --> 03:04:33.600
+No pressure.
+
+03:04:33.600 --> 03:04:34.600
+Yep.
+
+03:04:34.600 --> 03:04:35.600
+All right.
+
+03:04:35.600 --> 03:04:36.600
+Take it easy.
+
+03:04:36.600 --> 03:04:37.600
+Great, great meeting you.
+
+03:04:37.600 --> 03:04:38.600
+Great talking to you.
+
+03:04:38.600 --> 03:04:39.600
+Yep.
+
+03:04:39.600 --> 03:04:40.600
+You too.
+
+03:04:40.600 --> 03:04:41.600
+See ya.
+
+03:04:41.600 --> 03:04:42.600
+See ya.
+
+03:04:42.600 --> 03:04:58.280
+You're currently the only person in...
+
+03:04:58.280 --> 03:05:00.340
+you
+
+03:05:28.280 --> 03:05:30.340
+you
+
+03:05:58.280 --> 03:06:00.340
+you
+
diff --git a/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.vtt b/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.vtt
new file mode 100644
index 00000000..c50aa2bd
--- /dev/null
+++ b/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.vtt
@@ -0,0 +1,787 @@
+WEBVTT captioned by John Cummings
+
+00:00:00.000 --> 00:00:02.203
+Hello, my name is John Cummings, and I'm here today
+
+00:00:02.206 --> 00:00:04.849
+to play a Fanfare for the Common Emacs User.
+
+00:00:04.852 --> 00:00:07.263
+By "common", I mean the types of Emacs usage
+
+00:00:07.266 --> 00:00:09.685
+and comfort that are simpler, more mundane,
+
+00:00:09.689 --> 00:00:11.074
+and yes, even imperfect,
+
+00:00:11.075 --> 00:00:13.035
+that some may identify with more than others,
+
+00:00:13.037 --> 00:00:14.648
+or more at certain times.
+
+00:00:14.651 --> 00:00:16.911
+It's hard to use Emacs and not be aware of
+
+00:00:16.914 --> 00:00:18.700
+the impressive and interesting accomplishments
+
+00:00:18.703 --> 00:00:20.754
+of its community. And here at emacsconf
+
+00:00:20.756 --> 00:00:22.424
+we also get pumped up about those things,
+
+00:00:22.426 --> 00:00:25.563
+amplified by the energy of the other attendees.
+
+00:00:25.567 --> 00:00:27.727
+But this energy fades as we return focus
+
+00:00:27.730 --> 00:00:30.567
+to our day-to-day work. And in these circumstances,
+
+00:00:30.571 --> 00:00:32.990
+we may unfairly judge our own Emacs usage
+
+00:00:32.993 --> 00:00:34.995
+against the community highlights.
+
+00:00:34.997 --> 00:00:37.708
+So I want to identify and celebrate the ways
+
+00:00:37.712 --> 00:00:39.930
+that we common Emacs users use it,
+
+00:00:39.932 --> 00:00:42.285
+the reasons why it's a good fit for those ways,
+
+00:00:42.290 --> 00:00:45.427
+and some ways we could take advantage of that.
+
+00:00:45.430 --> 00:00:48.524
+What is Emacs to us common users? Well, we're consumers.
+
+00:00:48.528 --> 00:00:51.489
+We use whatever was available - whatever our OS gave us,
+
+00:00:51.493 --> 00:00:53.987
+or whatever we found when we searched the web.
+
+00:00:53.990 --> 00:00:55.709
+We're not even necessarily aware
+
+00:00:55.711 --> 00:00:58.088
+of what the latest version is, or what changes it has.
+
+00:00:58.091 --> 00:01:00.135
+We may not ever think about upgrading.
+
+00:01:00.138 --> 00:01:02.740
+We have what we have, and we use what we have.
+
+00:01:02.742 --> 00:01:05.145
+But I think, with this simple act, many of us
+
+00:01:05.149 --> 00:01:07.993
+achieve a very significant Emacs milestone:
+
+00:01:07.997 --> 00:01:10.275
+we've committed to having it in our toolkit
+
+00:01:10.278 --> 00:01:12.622
+and our skillset. We'll probably install it
+
+00:01:12.625 --> 00:01:14.802
+on every system that we can, eventually.
+
+00:01:14.804 --> 00:01:16.827
+We know it has a use for us today,
+
+00:01:16.827 --> 00:01:18.120
+and that it will solve some problems
+
+00:01:18.120 --> 00:01:19.588
+that we don't even know about yet.
+
+00:01:19.588 --> 00:01:22.215
+It will not just be one tool; it will be many.
+
+00:01:22.215 --> 00:01:24.368
+And we know that it will be more than just useful;
+
+00:01:24.368 --> 00:01:27.345
+it will also be challenging, puzzling, and frustrating.
+
+00:01:27.345 --> 00:01:28.630
+But we still keep it
+
+00:01:28.630 --> 00:01:29.873
+as a permanent part of our toolkit,
+
+00:01:29.873 --> 00:01:31.800
+and we should be proud of that.
+
+00:01:31.800 --> 00:01:34.136
+And regardless of what exactly we've installed,
+
+00:01:34.136 --> 00:01:35.337
+it was a good choice.
+
+00:01:35.337 --> 00:01:37.556
+It will almost certainly do what we need it to do.
+
+00:01:37.556 --> 00:01:39.766
+Old versions are not inert dead-ends;
+
+00:01:39.766 --> 00:01:41.134
+they're still functional tools.
+
+00:01:41.134 --> 00:01:43.979
+And that's a key aspect of Emacs - it's a tool
+
+00:01:43.979 --> 00:01:46.398
+to get our work done. That sounds obvious,
+
+00:01:46.398 --> 00:01:48.483
+but it's easy to get distracted by the great things
+
+00:01:48.483 --> 00:01:49.985
+that it can accomplish, and think
+
+00:01:49.985 --> 00:01:52.571
+that it requires the same accomplishments from us.
+
+00:01:52.571 --> 00:01:54.656
+But it requires no advanced state of mind,
+
+00:01:54.656 --> 00:01:56.867
+no level of expertise to start using it,
+
+00:01:56.867 --> 00:01:58.043
+or use it correctly.
+
+00:01:58.043 --> 00:02:00.754
+It just requires that we have it, and use it.
+
+00:02:00.754 --> 00:02:03.665
+And with a little effort, we can get results early on,
+
+00:02:03.665 --> 00:02:06.084
+and those results are not just preparations
+
+00:02:06.084 --> 00:02:07.586
+for better things to come later;
+
+00:02:07.586 --> 00:02:08.712
+they have value for us today,
+
+00:02:08.712 --> 00:02:12.049
+and we're already using it right.
+
+00:02:12.049 --> 00:02:14.551
+And when we do need to tweak whatever we installed,
+
+00:02:14.551 --> 00:02:16.803
+we might again be consumers, finding some snippets
+
+00:02:16.803 --> 00:02:19.581
+out on the web, pasting them in, and moving on.
+
+00:02:19.581 --> 00:02:21.933
+We don't necessarily understand what we did,
+
+00:02:21.933 --> 00:02:24.102
+but we got some value out of it. Over time,
+
+00:02:24.102 --> 00:02:26.114
+we may participate more, take it day by day,
+
+00:02:26.114 --> 00:02:28.357
+and one day we may find that our config
+
+00:02:28.357 --> 00:02:30.902
+has become a disorganized pile.
+
+00:02:30.902 --> 00:02:32.027
+Maybe it's mixed haphazardly
+
+00:02:32.027 --> 00:02:34.029
+with some output from the "customize" feature,
+
+00:02:34.029 --> 00:02:35.697
+and eventually we start to feel
+
+00:02:35.697 --> 00:02:37.991
+like it's a shameful mess. It's hard to manage;
+
+00:02:37.991 --> 00:02:40.960
+we may think of it as append-only or read-only.
+
+00:02:40.960 --> 00:02:42.829
+We can't deny there are problems here,
+
+00:02:42.829 --> 00:02:45.582
+but it happened for a good reason. It was quick,
+
+00:02:45.582 --> 00:02:47.250
+easy, and effective for us
+
+00:02:47.250 --> 00:02:50.062
+to enhance our experience this way, and then move on.
+
+00:02:50.062 --> 00:02:52.172
+We were using Emacs as it was designed here.
+
+00:02:52.172 --> 00:02:54.775
+It just wasn't sustainable indefinitely.
+
+00:02:54.775 --> 00:02:56.627
+We may continue doing things this way
+
+00:02:56.627 --> 00:02:59.596
+even though we realize it's not a good idea.
+
+00:02:59.596 --> 00:03:00.472
+But I think there are some ways
+
+00:03:00.472 --> 00:03:01.682
+to mitigate the downsides,
+
+00:03:01.682 --> 00:03:03.150
+that let us embrace our tendencies,
+
+00:03:03.150 --> 00:03:05.444
+and continue to benefit from them.
+
+00:03:05.444 --> 00:03:06.971
+If we allow and encourage ourselves
+
+00:03:06.971 --> 00:03:10.065
+to capture our thoughts and circumstances
+
+00:03:10.065 --> 00:03:11.700
+along with the work that we do on our config,
+
+00:03:11.700 --> 00:03:14.386
+and do so without judgment, or the responsibility
+
+00:03:14.386 --> 00:03:17.047
+to "do it right", we give ourselves the context
+
+00:03:17.047 --> 00:03:19.549
+to understand and manage it later.
+
+00:03:19.549 --> 00:03:21.618
+This should be done however works for us,
+
+00:03:21.618 --> 00:03:23.286
+whether it's rambling inline comments,
+
+00:03:23.286 --> 00:03:25.247
+keeping a separate journal or notes,
+
+00:03:25.247 --> 00:03:27.975
+or even a more advanced literate programming technique,
+
+00:03:27.975 --> 00:03:30.485
+if we want to make an investment like that.
+
+00:03:30.485 --> 00:03:32.629
+Or putting our config into source control,
+
+00:03:32.629 --> 00:03:34.214
+even if it's nothing more than a simple,
+
+00:03:34.214 --> 00:03:37.050
+daily record of changes along with our contextual notes,
+
+00:03:37.050 --> 00:03:41.221
+will make things a lot easier for our future selves.
+
+00:03:41.221 --> 00:03:43.974
+But regardless of how well, or sloppy, we manage it,
+
+00:03:43.974 --> 00:03:46.184
+we should also realize that our messy config
+
+00:03:46.184 --> 00:03:48.129
+is a personal artifact with inherent value,
+
+00:03:48.129 --> 00:03:51.565
+even if it's amusement value, or sentimental value.
+
+00:03:51.565 --> 00:03:54.401
+Emacs is not only a tool to get our work done,
+
+00:03:54.401 --> 00:03:56.978
+it can also be a very personalized experience.
+
+00:03:56.978 --> 00:03:59.366
+And if so, then our Emacs config
+
+00:03:59.366 --> 00:04:02.110
+is our experience in written form.
+
+00:04:02.110 --> 00:04:04.303
+You can see it as a log of your journey through Emacs,
+
+00:04:04.303 --> 00:04:06.663
+and the mark that you made on it along the way,
+
+00:04:06.663 --> 00:04:08.506
+mistakes and all.
+
+00:04:08.506 --> 00:04:10.676
+We may see our config as a record of failure,
+
+00:04:10.676 --> 00:04:12.886
+of things that we did wrong, the things that we repeated,
+
+00:04:12.886 --> 00:04:15.672
+or never finished. But it's important to realize
+
+00:04:15.672 --> 00:04:18.592
+that a record of failure is a record of persistence.
+
+00:04:18.592 --> 00:04:20.761
+In that sense, it's kind of like our genome:
+
+00:04:20.761 --> 00:04:23.197
+a set of unique, disorganized,
+
+00:04:23.197 --> 00:04:26.308
+somewhat accidental properties, that, on the whole,
+
+00:04:26.308 --> 00:04:29.394
+makes us fit to survive in our Emacs usage.
+
+00:04:29.394 --> 00:04:31.021
+It's also interesting to think of it
+
+00:04:31.021 --> 00:04:33.482
+as an archaeological record. Where we can sometimes
+
+00:04:33.482 --> 00:04:35.942
+get some insight into our "ancient times".
+
+00:04:35.942 --> 00:04:38.570
+Just being able to see what we were doing years ago
+
+00:04:38.570 --> 00:04:40.906
+is interesting -- to see how things changed,
+
+00:04:40.906 --> 00:04:43.158
+and hopefully grew over time. And sometimes
+
+00:04:43.158 --> 00:04:45.845
+we find some buried treasures that we forgot were there.
+
+00:04:45.845 --> 00:04:48.172
+And of course it's interesting to realize
+
+00:04:48.172 --> 00:04:50.874
+that when we start Emacs, this pile of config
+
+00:04:50.874 --> 00:04:52.959
+also executes in roughly the same order
+
+00:04:52.959 --> 00:04:56.438
+that we created it in. Our journey through Emacs
+
+00:04:56.438 --> 00:04:59.482
+happens again and again every time we start it up.
+
+00:04:59.482 --> 00:05:04.095
+And it's ready for us to keep working on it.
+
+00:05:04.095 --> 00:05:05.305
+And when it comes to packages,
+
+00:05:05.305 --> 00:05:09.050
+we may not make extensive use of them, if any at all.
+
+00:05:09.050 --> 00:05:10.602
+We probably have different reasons for this.
+
+00:05:10.602 --> 00:05:12.437
+We may feel like we need to reach
+
+00:05:12.437 --> 00:05:14.815
+some level of mastery before we start using them.
+
+00:05:14.815 --> 00:05:17.943
+We may not have the mental room to think about packages,
+
+00:05:17.943 --> 00:05:20.362
+or may not want to take on the administrative burden
+
+00:05:20.362 --> 00:05:22.989
+required to keep track of which packages we have,
+
+00:05:22.989 --> 00:05:25.834
+the dependencies and versions, and their compatibility.
+
+00:05:25.834 --> 00:05:27.694
+Some of us may just be uncomfortable
+
+00:05:27.694 --> 00:05:30.664
+letting new third-party code run in our environments.
+
+00:05:30.664 --> 00:05:31.832
+It could also just be the case
+
+00:05:31.832 --> 00:05:35.377
+that our needs haven't driven us to need a package yet.
+
+00:05:35.377 --> 00:05:36.871
+We're already doing what we need,
+
+00:05:36.871 --> 00:05:39.089
+and doing it efficiently enough.
+
+00:05:39.089 --> 00:05:40.215
+And here we find more alignment
+
+00:05:40.215 --> 00:05:42.592
+between Emacs the tool, and our common mindset:
+
+00:05:42.592 --> 00:05:44.977
+They work well when they stay needs-driven.
+
+00:05:44.977 --> 00:05:46.646
+We're not obligated to use
+
+00:05:46.646 --> 00:05:48.949
+as much of Emacs' functionality as we can,
+
+00:05:48.949 --> 00:05:51.159
+or every package that we're aware of
+
+00:05:51.159 --> 00:05:52.510
+if we don't have a need to.
+
+00:05:52.510 --> 00:05:54.971
+And in fact, that's a great way to stay overwhelmed.
+
+00:05:54.971 --> 00:05:57.700
+But if we stay aware of our needs, and then find
+
+00:05:57.700 --> 00:05:59.902
+that there is a package that might address them,
+
+00:05:59.902 --> 00:06:02.655
+then we can deal with it. And a need to explore,
+
+00:06:02.655 --> 00:06:05.823
+and a need to be curious, is a valid need.
+
+00:06:05.823 --> 00:06:09.327
+And if we do need extra confidence for that exploration,
+
+00:06:09.327 --> 00:06:10.912
+then the things we talked about before,
+
+00:06:10.912 --> 00:06:13.633
+like keeping good notes of our experiences and needs,
+
+00:06:13.633 --> 00:06:15.541
+or version controlling our config,
+
+00:06:15.541 --> 00:06:18.586
+will help us keep that connection to our needs,
+
+00:06:18.586 --> 00:06:20.922
+that gives us the freedom to experiment
+
+00:06:20.922 --> 00:06:23.008
+in the wide world of packages.
+
+00:06:23.008 --> 00:06:27.262
+And if we really do just need what's built in to Emacs,
+
+00:06:27.262 --> 00:06:29.514
+the vanilla out-of-the-box experience,
+
+00:06:29.514 --> 00:06:32.183
+then we can also be proud that we're making use
+
+00:06:32.183 --> 00:06:33.560
+of all the work that went into that experience,
+
+00:06:33.560 --> 00:06:35.021
+because a lot did.
+
+00:06:35.021 --> 00:06:37.256
+And when we report any problems that we find,
+
+00:06:37.256 --> 00:06:39.190
+we're also working to keep that experience
+
+00:06:39.190 --> 00:06:41.192
+smooth for future users.
+
+00:06:41.192 --> 00:06:43.987
+Of course, some of us may find this intimidating,
+
+00:06:43.987 --> 00:06:46.531
+and if so, feel free to reach out to me,
+
+00:06:46.531 --> 00:06:48.767
+and probably anyone in the community,
+
+00:06:48.767 --> 00:06:56.249
+that can help you navigate that process.
+
+00:06:56.249 --> 00:06:59.461
+So how do we use our Emacs installation?
+
+00:06:59.461 --> 00:07:01.838
+We often use it very simply: we get simple results
+
+00:07:01.838 --> 00:07:06.068
+in simple ways. Often we do things the same simple way
+
+00:07:06.068 --> 00:07:08.720
+for a very long time, and this is of course great,
+
+00:07:08.720 --> 00:07:10.513
+since we're getting done what we need to get done.
+
+00:07:10.513 --> 00:07:14.392
+There's no result or method too simple for Emacs.
+
+00:07:14.392 --> 00:07:16.853
+And we're not oblivious to the alternative.
+
+00:07:16.853 --> 00:07:19.356
+Many of us are at least aware that there are ways
+
+00:07:19.356 --> 00:07:20.649
+we could iterate on what we do,
+
+00:07:20.649 --> 00:07:22.734
+or some polish that we could apply,
+
+00:07:22.734 --> 00:07:24.569
+and we may even quite enjoy
+
+00:07:24.569 --> 00:07:27.113
+reading about more advanced Emacs possibilities,
+
+00:07:27.113 --> 00:07:28.215
+and thinking about how they could apply
+
+00:07:28.215 --> 00:07:30.951
+to our own workflow, but at the end of the day,
+
+00:07:30.951 --> 00:07:33.703
+we still keep our own usage the same, and basic.
+
+00:07:33.703 --> 00:07:36.998
+And this is another fundamental aspect of using Emacs.
+
+00:07:36.998 --> 00:07:38.959
+You can work simply and successfully,
+
+00:07:38.959 --> 00:07:40.502
+but you'll always be conscious of the possibility
+
+00:07:40.502 --> 00:07:43.213
+for far more complexity. And many of us
+
+00:07:43.213 --> 00:07:46.424
+do try to iterate on our ways, and sometimes succeed,
+
+00:07:46.424 --> 00:07:49.177
+but often we run into trouble and we stop or defer.
+
+00:07:49.177 --> 00:07:51.304
+A lot of times we're intimidated by the scope of things -
+
+00:07:51.304 --> 00:07:53.848
+we're not sure how to make measurable progress.
+
+00:07:53.848 --> 00:07:56.101
+We may find that the first ways we learned
+
+00:07:56.101 --> 00:07:59.312
+are so ingrained in us, that learning even a second way
+
+00:07:59.312 --> 00:08:01.147
+is many times harder.
+
+00:08:01.147 --> 00:08:03.191
+And sometimes we do make sudden progress
+
+00:08:03.191 --> 00:08:04.275
+after years of sameness,
+
+00:08:04.275 --> 00:08:06.260
+and wonder why we waited so long.
+
+00:08:06.260 --> 00:08:07.737
+And these are universal pains
+
+00:08:07.737 --> 00:08:11.324
+that everyone has to feel who wants to improve.
+
+00:08:11.324 --> 00:08:13.451
+But this is again where we can benefit
+
+00:08:13.451 --> 00:08:14.661
+from letting our needs drive us.
+
+00:08:14.661 --> 00:08:16.538
+Sometimes they'll tell us that it's OK
+
+00:08:16.538 --> 00:08:18.806
+keeping things the way they are, and sometimes
+
+00:08:18.806 --> 00:08:20.491
+they'll tell us that it's good to keep pushing,
+
+00:08:20.491 --> 00:08:21.767
+because there's a reason for it,
+
+00:08:21.767 --> 00:08:25.077
+and we'll be glad that we did.
+
+00:08:25.077 --> 00:08:27.507
+And what are the ways that we do learn,
+
+00:08:27.507 --> 00:08:30.635
+and grow, and create within Emacs? One constant
+
+00:08:30.635 --> 00:08:33.596
+is that we forget a lot. We learn something
+
+00:08:33.596 --> 00:08:35.682
+and then remember that we already learned
+
+00:08:35.682 --> 00:08:38.309
+and forgot it once before. Sometimes we just hope
+
+00:08:38.309 --> 00:08:39.769
+to learn more than we forget.
+
+00:08:39.769 --> 00:08:41.772
+And staying driven by our needs can also help here,
+
+00:08:41.772 --> 00:08:43.499
+because it's easier to learn something
+
+00:08:43.499 --> 00:08:46.317
+when we have a reason to, and an application for it.
+
+00:08:46.317 --> 00:08:49.071
+In Emacs, it can be tempting to do this backwards,
+
+00:08:49.071 --> 00:08:51.782
+and want to learn all there is about Emacs first,
+
+00:08:51.782 --> 00:08:53.992
+and then apply it. But again that's a surefire way
+
+00:08:53.992 --> 00:08:55.935
+to stay overwhelmed.
+
+00:08:55.935 --> 00:08:59.640
+And when we code and build things, we tend to create many small, quick things,
+
+00:08:59.640 --> 00:09:01.600
+but never really integrate them deeply
+
+00:09:01.600 --> 00:09:03.661
+into our environment or workflow.
+
+00:09:03.661 --> 00:09:05.462
+We leave things half-finished once we get bored,
+
+00:09:05.462 --> 00:09:07.088
+or find ourselves in over our head.
+
+00:09:07.088 --> 00:09:09.883
+And this is natural, because we're curious and creative,
+
+00:09:09.883 --> 00:09:12.677
+and Emacs makes it relatively easy, and actually fun,
+
+00:09:12.677 --> 00:09:14.845
+to experiment and get these quick results.
+
+00:09:14.845 --> 00:09:17.065
+But it's less clear how to see them through,
+
+00:09:17.065 --> 00:09:20.310
+and inherently less fun to do the follow-up gruntwork.
+
+00:09:20.310 --> 00:09:21.970
+But if we embrace our ways here,
+
+00:09:21.970 --> 00:09:23.897
+and structure our workflow to support them,
+
+00:09:23.897 --> 00:09:26.215
+we might find ourselves more satisfied.
+
+00:09:26.215 --> 00:09:28.926
+So let's give ourselves permission, and a logical place
+
+00:09:28.926 --> 00:09:31.571
+to put all our fun little quick experiments,
+
+00:09:31.571 --> 00:09:33.423
+without having to worry about integrating
+
+00:09:33.423 --> 00:09:35.700
+or polishing them, unless we find a need to later.
+
+00:09:35.700 --> 00:09:38.505
+Let's use source control wisely to give ourselves
+
+00:09:38.505 --> 00:09:41.447
+a place to experiment, and a place for stability.
+
+00:09:41.447 --> 00:09:42.968
+Let's stay needs-driven so that we know
+
+00:09:42.968 --> 00:09:46.186
+what we really do need to follow up on,
+
+00:09:46.186 --> 00:09:48.963
+and what's OK to drop. And let's remember
+
+00:09:48.963 --> 00:09:50.965
+that there is someone who will always appreciate
+
+00:09:50.965 --> 00:09:53.635
+any notes about our thought process we can take,
+
+00:09:53.635 --> 00:09:55.845
+no matter how rough or rambling they are:
+
+00:09:55.845 --> 00:09:58.788
+our future selves.
+
+00:09:58.788 --> 00:10:01.376
+And so I hope that some people can identify with
+
+00:10:01.376 --> 00:10:02.927
+at least some of what I've shared today.
+
+00:10:02.927 --> 00:10:05.021
+And I hope that we realize that,
+
+00:10:05.021 --> 00:10:06.964
+no matter how we see ourselves as Emacs users,
+
+00:10:06.964 --> 00:10:09.233
+and no matter what we see other people building,
+
+00:10:09.233 --> 00:10:11.569
+we're proud of the fact that we have built
+
+00:10:11.569 --> 00:10:15.865
+an experience that fits us. Thank you to everyone.
diff --git a/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.vtt b/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.vtt
new file mode 100644
index 00000000..7157036e
--- /dev/null
+++ b/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.vtt
@@ -0,0 +1,791 @@
+WEBVTT
+
+00:00.000 --> 00:02.060
+you
+
+01:00.000 --> 01:02.000
+You
+
+01:09.080 --> 01:13.280
+Wait, so there's a little something though. How are we gonna get the audio?
+
+01:16.240 --> 01:18.240
+Give me just a second
+
+01:18.240 --> 01:30.520
+Ah, so can we just get a confirmation? Can you start playing the talk now Samir, please?
+
+01:43.280 --> 01:47.080
+So for everyone on the stream bear with us just a little bit we're trying to get it working right now
+
+01:47.080 --> 01:49.180
+I'm not getting any audio from you Samir
+
+01:53.880 --> 01:59.600
+Samir you might want to unmute yourself onto BBB. So if you could pause the video go to BBB and unmute yourself
+
+02:09.320 --> 02:14.080
+Okay, Samir, can you hear me now? Yeah, okay, so
+
+02:14.080 --> 02:17.640
+Oh, let me start. Where is it? Okay. There we go
+
+02:23.320 --> 02:29.400
+That sounds great, okay, we'll give you just a second to get squared away here and thanks everybody on the stream for bearing with us
+
+02:30.780 --> 02:34.600
+Okay, sure Samir. Can you now start playing your talk? Yeah
+
+02:34.600 --> 02:42.440
+I'm Samir Pradhan from the Linguistic Data Consortium at the University of Pennsylvania. Can you pause the talk for a second?
+
+02:44.760 --> 02:46.760
+What happened?
+
+02:48.760 --> 02:52.600
+Oh, you don't have audio. The thing was no audio is
+
+02:54.760 --> 02:56.760
+Oh
+
+02:56.760 --> 03:02.760
+Okay, Samir, sorry, we were just doing some last-minute checks. So yes do exactly the same thing as you did will be fine and we'll manage on our end
+
+03:05.760 --> 03:08.760
+Sorry everyone on the stream. We're just trying to do some last-minute shuffling
+
+03:10.760 --> 03:14.760
+And you are muted on BBB right now, so you will probably need to pause the talk for a second
+
+03:14.760 --> 03:24.760
+And you are muted on BBB right now, so you will probably need to unmute yourself on BBB and then start the talk
+
+03:30.760 --> 03:35.760
+So Samir, right now, sorry, could you, no, it's not working. You need to unmute yourself on BBB
+
+03:35.760 --> 03:37.760
+So right now you need to click the button, the microphone
+
+03:37.760 --> 03:42.760
+Yes, you toggled it off again. Toggle it on again, please
+
+03:46.760 --> 03:48.760
+What am I doing wrong?
+
+03:49.760 --> 03:55.760
+So do not unmute yourself now. Leave your microphone on and press, go back to the beginning of your video and press play
+
+03:55.760 --> 03:57.760
+Yes, from various signals
+
+03:58.760 --> 04:01.760
+The work we present is limited to a limited number of people
+
+04:01.760 --> 04:06.760
+So do not unmute yourself now. Leave your microphone on and press, go back to the beginning of your video and press play
+
+04:06.760 --> 04:08.760
+Yes, from various signals
+
+04:09.760 --> 04:12.760
+The work we present is limited to text and speech
+
+04:12.760 --> 04:13.760
+Good approaching
+
+04:13.760 --> 04:14.760
+But it can be extended
+
+04:15.760 --> 04:22.760
+Thank you for joining me today. I am Samir Pradhan from the Linguistic Data Consortium at the University of Pennsylvania
+
+04:23.760 --> 04:26.760
+And founder of osmantics.org
+
+04:26.760 --> 04:33.760
+We research in computational linguistics, also known as natural language processing, a sub-area of artificial intelligence
+
+04:34.760 --> 04:40.760
+With a focus on modeling and predicting complex linguistic structures from various signals
+
+04:41.760 --> 04:47.760
+The work we present is limited to text and speech, but it can be extended to other signals
+
+04:47.760 --> 04:57.760
+We propose an architecture, and we call it GRAIL, which allows the representation and aggregation of such rich structures in a systematic fashion
+
+04:59.760 --> 05:11.760
+I'll demonstrate a proof of concept for representing and manipulating data and annotations for the specific purpose of building machine learning models that simulate understanding
+
+05:11.760 --> 05:20.760
+These technologies have the potential for impact in almost any conceivable field that generates and uses data
+
+05:22.760 --> 05:32.760
+We process human language when our brains receive and assimilate various signals, which are then manipulated and interpreted within a syntactic structure
+
+05:33.760 --> 05:39.760
+It's a complex process that I have simplified here for the purpose of comparison to machine learning
+
+05:39.760 --> 05:51.760
+Recent machine learning models tend to require a large amount of raw, naturally occurring data, and a varying amount of manually enriched data, commonly known as annotations
+
+05:52.760 --> 06:01.760
+Owing to the complex and numerous nature of linguistic phenomena, we have most often used a divide-and-conquer approach
+
+06:01.760 --> 06:09.760
+The strength of this approach is that it allows us to focus on a single or perhaps a few related linguistic phenomena
+
+06:10.760 --> 06:17.760
+The weaknesses are the universe of these phenomena keep expanding as language itself evolves and changes over time
+
+06:18.760 --> 06:26.760
+And second, this approach requires an additional task of aggregating annotations, creating more opportunities for computer error
+
+06:26.760 --> 06:40.760
+Our challenge then is to find the sweet spot that allows us to encode complex information without the use of manual annotation or without the additional task of aggregation by computers
+
+06:42.760 --> 06:45.760
+So what do I mean by annotation?
+
+06:45.760 --> 06:59.760
+In this talk, the word annotation refers to the manual assignment of certain attributes to portions of a signal which is necessary to perform the end task
+
+07:00.760 --> 07:11.760
+For example, in order for the algorithm to accurately interpret a pronoun, it needs to know what that pronoun refers back to
+
+07:11.760 --> 07:19.760
+We may find this task trivial, however, current algorithms repeatedly fail in this task
+
+07:20.760 --> 07:26.760
+So the complexities of understanding in computational linguistics require annotation
+
+07:27.760 --> 07:36.760
+The word annotation itself is a useful example because it also reminds us that words have multiple meanings, as annotation itself does
+
+07:36.760 --> 07:51.760
+Just as I needed to define it in this context so that my message won't be misinterpreted, so too must annotators do at least for algorithms through manual intervention
+
+07:52.760 --> 07:58.760
+Learning from raw data, commonly known as unsupervised learning, poses limitations for machine learning
+
+07:59.760 --> 08:04.760
+As I described, modeling complex phenomena need manual annotations
+
+08:04.760 --> 08:10.760
+The learning algorithm uses these annotations as examples to build statistical models
+
+08:11.760 --> 08:13.760
+This is called supervised learning
+
+08:13.760 --> 08:37.760
+Without going into too much detail, I'll simply note that the recent popularity of the concept of deep learning is an evolutionary step where we have learned to train models using trillions of parameters in ways that they can learn richer hierarchical structures from very large amounts of annotated data
+
+08:37.760 --> 08:49.760
+These models can then be fine-tuned using varying amounts of annotated examples, depending on the complexity of the task, to generate better predictions
+
+08:50.760 --> 09:01.760
+As you might imagine, manually annotating complex linguistic phenomena can be a very specific, labor-intensive task
+
+09:01.760 --> 09:09.760
+For example, imagine if we were to go back through this presentation and connect all the pronouns with the nouns to which they refer
+
+09:10.760 --> 09:14.760
+Even for a short, 18-minute presentation, this would require hundreds of annotations
+
+09:15.760 --> 09:20.760
+The models we build are only as good as the quality of the annotations we make
+
+09:20.760 --> 09:31.760
+We need guidelines that ensure that the annotations are done by at least two humans who have substantial agreement with each other in their interpretations
+
+09:32.760 --> 09:40.760
+We know that if we try to train a model using annotations that are very subjective or have more noise, we will receive poor predictions
+
+09:41.760 --> 09:47.760
+Additionally, there is the concern of introducing various unexpected biases into one's models
+
+09:47.760 --> 09:54.760
+So, annotation is really both an art and a science
+
+09:55.760 --> 09:59.760
+In the remaining time, we will turn to two fundamental questions
+
+10:00.760 --> 10:09.760
+First, how can we develop a unified representation of data and annotations that encompasses arbitrary levels of linguistic information?
+
+10:10.760 --> 10:14.760
+There is a long history of attempting to answer this first question
+
+10:14.760 --> 10:18.760
+This history is documented in our recent article
+
+10:19.760 --> 10:26.760
+It is as if we as a community have been searching for our own holy grail
+
+10:27.760 --> 10:35.760
+The second question we will pose on is what role might Emacs, along with Org Mode, play in this process?
+
+10:35.760 --> 10:46.760
+While the solution itself may not be tied to Emacs, Emacs has built-in capabilities that could be useful for evaluating potential solutions
+
+10:47.760 --> 10:55.760
+It is also one of the most extensively documented pieces of software and the most customizable piece of software that I have ever come across
+
+10:56.760 --> 11:00.760
+Many would agree with that
+
+11:00.760 --> 11:08.760
+In order to approach this second question, we turn to the complex structure of language itself
+
+11:09.760 --> 11:13.760
+At first glance, language appears to us as a series of words
+
+11:14.760 --> 11:20.760
+Words form sentences, sentences form paragraphs, and paragraphs form completed texts
+
+11:20.760 --> 11:30.760
+If this was a sufficient description of the complexity of language, all of us would be able to read at least 10 different languages
+
+11:31.760 --> 11:33.760
+We know it is much more complex than this
+
+11:34.760 --> 11:37.760
+There is a rich, underlying, recursive tree structure
+
+11:38.760 --> 11:45.760
+In fact, many possible tree structures, which makes a particular sequence, and many others
+
+11:45.760 --> 11:50.760
+One of the better understood tree structures is the syntactic structure
+
+11:51.760 --> 12:00.760
+While a natural language has rich ambiguities and complexities, programming languages are designed to be parsed and imprinted deterministically
+
+12:01.760 --> 12:10.760
+Emacs has been used for programming very effectively, so there is a potential for using Emacs as a tool for annotation
+
+12:10.760 --> 12:14.760
+This would significantly improve our current set of tools
+
+12:15.760 --> 12:26.760
+It is important to note that most of the annotation tools that have been developed over the past few decades have relied on graphical indices
+
+12:27.760 --> 12:30.760
+Even those used for enumerated textual indices
+
+12:30.760 --> 12:42.760
+Most of the tools in use are designed for a user to add very specific, very restricted information
+
+12:43.760 --> 12:51.760
+It has not really made use of the potential that an editor, rich editing environment like Emacs, can add to the mix
+
+12:51.760 --> 12:59.760
+Emacs has long been able to edit and manipulate complex, embedded tree structures dependent in source code
+
+13:00.760 --> 13:05.760
+It is difficult to imagine the capabilities that we represent naturally
+
+13:06.760 --> 13:13.760
+In fact, it always does that, with features that allow us to quickly navigate sentences and graphs with a few keystrokes
+
+13:13.760 --> 13:20.760
+Add various text studies, create overlays to name, etc.
+
+13:21.760 --> 13:33.760
+Emacs has built up way too many control units, so we don't have to worry about the complexity of managing more languages
+
+13:34.760 --> 13:41.760
+In fact, this is not the first time Emacs has used control linguistic sequences
+
+13:41.760 --> 13:56.760
+One of the true moments in language natural language processing was the creation of a newly created syntactic tree for a million word collection of Wall Street articles
+
+13:57.760 --> 14:03.760
+This was about 1990, before Java or Oracle interfaces were common
+
+14:03.760 --> 14:13.760
+The tool that was used to create that corpus was Emacs, and it was created by Penn, known as the Penn Treebank
+
+14:14.760 --> 14:26.760
+And in 1992, about when the Linguistic Consortium was established, it's been about 30 years that it has been creating various language related resources
+
+14:26.760 --> 14:36.760
+The first outlining mode, in particular the outlining mode, rather enhanced the outlining mode
+
+14:37.760 --> 14:49.760
+Allows us to create red outlines, attaching properties to nodes, and why this command is really customizing some of the various pieces of information as per one's requirement
+
+14:49.760 --> 14:56.760
+This is also a very useful tool
+
+14:57.760 --> 15:03.760
+This enhanced outlining mode provides more power to Emacs
+
+15:04.760 --> 15:13.760
+It provides command for easily customizing, entering information, and at the same time hiding unnecessary context
+
+15:13.760 --> 15:25.760
+It allows control editing, this could be a very useful tool when we are focused on a limited amount of data
+
+15:26.760 --> 15:37.760
+The tool together allows us to create a rich representation that can simultaneously capture multiple possible sequences
+
+15:37.760 --> 15:42.760
+Capture details necessary to read the original sources
+
+15:43.760 --> 15:52.760
+Allows us to create hierarchical representation, wide structural capabilities that can take advantage of the concept of editance within the tree structure
+
+15:53.760 --> 16:00.760
+Together allow local manipulance structure, thereby minimizing data coupling
+
+16:00.760 --> 16:06.760
+The concept of tag outlining mode complements the hierarchy pattern
+
+16:07.760 --> 16:12.760
+Hierarchies can be very rigid, but through tags on hierarchies we can have multi-faceted representations
+
+16:13.760 --> 16:19.760
+As a matter of fact, outlining mode has the ability for tags to do their own hierarchical structure
+
+16:20.760 --> 16:23.760
+Further enhances the representational power
+
+16:23.760 --> 16:29.760
+All of this can be done as sequence, mostly for functional transformation
+
+16:30.760 --> 16:36.760
+Because most capabilities can be configured and customized, it is not necessary to do everything at once
+
+16:37.760 --> 16:41.760
+It allows us to intervene in the complexity of the representation
+
+16:42.760 --> 16:46.760
+Finally, all of this can be done in plain tag representation
+
+16:47.760 --> 16:50.760
+It has its own advantages
+
+16:50.760 --> 16:55.760
+Now let's look at a simple example
+
+16:56.760 --> 17:02.760
+The sentence is the thought of the moon with a telescope
+
+17:03.760 --> 17:07.760
+Let's just make a view of the sentence
+
+17:07.760 --> 17:19.760
+What is interesting is that it has a noun phrase i followed by an arrow to star
+
+17:20.760 --> 17:27.760
+Then the moon is another phrase and the telescope is a positional phrase
+
+17:27.760 --> 17:42.760
+Now, one thing you might remember from grammar school syntax is that there is a syntactical structure
+
+17:42.760 --> 17:57.760
+And in this particular case
+
+18:12.760 --> 18:23.760
+Because we know that the moon is not something that can hold the telescope
+
+18:24.760 --> 18:37.760
+That seeing must be by me, or by eye, and the telescope must be in my hand, or I am viewing the moon with a telescope
+
+18:37.760 --> 18:48.760
+However, it is possible that in a different context, the moon could be referred to an animated picture
+
+18:48.760 --> 19:07.760
+And could hold the telescope, in that case, the situation might be that I am actually seeing a moon holding a telescope
+
+19:07.760 --> 19:24.760
+And this is one of the most complex linguistic phenomena that requires world knowledge
+
+19:24.760 --> 19:38.760
+And it is called the P-attachment problem, where the positional phrases can be ambiguous and various different cues have to be used to reduce the ambiguity
+
+19:39.760 --> 19:45.760
+So in this case, as you saw, both the readings are technically true depending on the context
+
+19:45.760 --> 19:55.760
+So one thing we could do is cut the tree and duplicate it, and then create another node and call it another node
+
+19:56.760 --> 20:02.760
+And because this is one of the two interpreters, let's call one division A
+
+20:02.760 --> 20:15.760
+And that division essentially is a tile of zone A, and it says that the moon is holding the telescope
+
+20:15.760 --> 20:31.760
+Now we create another representation, where we capture the other interpretation, where the moon, or I am holding the telescope
+
+20:32.760 --> 20:38.760
+Sorry everyone to interrupt the audio here. Sameer, can you move your mouse a little bit? Just move it to the corner of your screen, thank you
+
+20:38.760 --> 20:49.760
+Now we have two separate interpreters in the same structure, and all we have to do is very quickly add a few keystrokes
+
+20:49.760 --> 21:08.760
+Now let's add another interesting thing. This is two different interpreters. It can be A, it can be B, it can be C, it can be D, or it can be D
+
+21:08.760 --> 21:23.760
+Basically, any entity that has the ability to see can be substituted in this particular node
+
+21:23.760 --> 21:37.760
+And let's see what we have here. Now we are just getting a zoom view of the entire structure we have created
+
+21:37.760 --> 21:52.760
+Essentially, you can see that by just using a few keystrokes, we are able to capture two different interpretations of a simple sentence
+
+21:52.760 --> 22:06.760
+And we are also able to add various alternate pieces of information that could help machine algorithms generalize better
+
+22:06.760 --> 22:25.760
+Now let's go to the next thing. In a sense, we can use the power of functional constructors to represent very potentially conflicting and structured readings
+
+22:25.760 --> 22:38.760
+In addition to this, we can also create a text with different structure and have them in the same place. This allows us to address the interpretation of certain sentences that may be occurring in the world
+
+22:38.760 --> 23:03.760
+While simultaneously giving information that can be more valuable. This makes the enrichment process all very efficient. Additionally, we can enrich the power of users of the feature or button who can not only expand, but also add information into it
+
+23:03.760 --> 23:19.760
+In a way, that could help machine algorithms generalize better by making efficient use of their functions. Together, UX and Ardmo can speed the enrichment of nodes in a way that allows us to focus on certain aspects and ignore others
+
+23:20.760 --> 23:28.760
+Extremely complex landscape structures can be captured consistently in a function that allows computers to understand the language
+
+23:28.760 --> 23:35.760
+We can then use tools to enhance the tests that we do in our everyday life
+
+23:36.760 --> 23:49.760
+However, this is the acronym or the type of specification that we are creating to capture this new and present virtual adaptation
+
+23:49.760 --> 24:06.760
+We will now look at an example of spontaneous speech that occurs in spoken conversations. Conversations consistently contain interest in speech, interrupts, disfluency, verbal nouns such as talk or laugh, and other noises
+
+24:06.760 --> 24:22.760
+Since spontaneous speech is simply a functional stream, we cannot take back words that come out of our mouths. We tend to make mistakes and correct ourselves as soon as we realize that we have spoken
+
+24:22.760 --> 24:35.760
+This process manifests through a combination of a handful of mechanisms, including immediate action after an error, and we do this unconsciously
+
+24:35.760 --> 24:51.760
+What we've taught here is an example of a language that has various aspects of the representation
+
+24:51.760 --> 25:14.760
+We don't have time to go through many of the details. I would highly encourage you to play. I'm making some videos for ASCII cinemas that I'll be posting and if you're interested you can go through those
+
+25:14.760 --> 25:33.760
+The idea here is to try a slightly more complex use case, but given the time consumption and the amount of information that can fit in the screen, this should be very informative
+
+25:33.760 --> 25:46.760
+But at least you'll see some idea of what can be followed. In this particular case, you're saying that there's a sense which is what I am telling now
+
+25:47.760 --> 25:59.760
+Essentially, there is a repetition of the I am, then there is a proper word, nobody can try to say the same thing but start by saying true, and then correct themselves by telling now
+
+25:59.760 --> 26:13.760
+So in this case, we can capture a sequence of words
+
+26:13.760 --> 26:30.760
+The interesting thing is that in NLB, sometimes we have to typically use words that have this interpretation of the context of I am
+
+26:30.760 --> 26:55.760
+You can see that here, this view shows that with each of the words in the sentence or in the representation, you can have a lot of different properties that can attach to them
+
+26:55.760 --> 27:07.760
+And these properties are typical then, like in the earlier slide, but you can use the cues of all these properties to various kind of searches and filtering
+
+27:07.760 --> 27:27.760
+And the slide here is actually not a legitimate text, on the right are descriptions of what each of these present. This information is also available in the article and you can see there
+
+27:27.760 --> 27:38.760
+But it shows how rich a context you can capture, it's just a closer snapshot of the properties on the word
+
+27:39.760 --> 27:50.760
+And you can see we can have like whether the word is broken or not, it's incomplete, whether some words want to be filtered for parsing, and say this is ignored
+
+27:50.760 --> 28:00.760
+Or some words are restart marks, we can add a restart marker, sometimes some of these migrations
+
+28:01.760 --> 28:10.760
+The other fascinating thing about this presentation is that you can edit properties in the content view
+
+28:10.760 --> 28:20.760
+So you have this pillar data structure and combining hierarchical data structure, as you can see, you may not be able to see here
+
+28:20.760 --> 28:48.760
+What has also happened here is that some of the tags have been inherited from earlier groups, and so you get a much better picture of things, and essentially you can filter out things that you want to access, access them, and then integrate it into the model
+
+28:48.760 --> 29:04.760
+So in conclusion today we have posed and implemented the use of the architecture layout, which allows representation, manipulation, and recognition of rich linguistic structure in systematic fashion
+
+29:05.760 --> 29:15.760
+We've shown how Google advances tools available for building machine learning models to simulate understanding
+
+29:15.760 --> 29:22.760
+Thank you Verj for your attention and contact information on this slide
+
+29:23.760 --> 29:41.760
+If you are interested in an additional sample to demonstrate the representation of speech and retext together, continue, otherwise we'll stop here
+
+29:41.760 --> 29:46.760
+Is it okay to stop?
+
+29:47.760 --> 29:53.760
+Yes Amir, it's okay to stop now. Thank you so much for your talk. Are you able to see the pad on your end?
+
+29:54.760 --> 29:58.760
+In the etherpad?
+
+29:59.760 --> 30:01.760
+Yes, in the etherpad, do you have the link?
+
+30:02.760 --> 30:06.760
+I'm there, nothing has happened so far
+
+30:06.760 --> 30:16.760
+I'm going to put a link to the pad, give me just a second right now. Colwyn, feel free to interrupt me whenever you're here
+
+30:17.760 --> 30:23.760
+I'm actually looking at the pad, I don't think anything is added in
+
+30:23.760 --> 30:37.760
+There don't seem to be questions yet, yes. It's probably because of the audio problem people might have a little bit of trouble hearing you talk
+
+30:38.760 --> 30:46.760
+Do you have anything else you'd like to add on your talk maybe? Because I think it was an excruciating process to get it out to us
+
+30:47.760 --> 30:51.760
+You had to get a lot of darlings in the process didn't you?
+
+30:51.760 --> 30:59.760
+Yeah, in the process of preparing this talk you had to select a lot of stuff that you wanted to include in your talk
+
+31:00.760 --> 31:07.760
+Can I ask you to put on your webcam or something? Are you able to do this?
+
+31:07.760 --> 31:25.760
+I'm starting to see a few questions come in. Just let us know when you're ready
+
+31:26.760 --> 31:31.760
+Colwyn, I'll let you take over. Can you hear me?
+
+31:31.760 --> 31:39.760
+Yeah, I hear you, the audio is just a little bit choppy, but we'll just talk slowly and hopefully that will work fine
+
+31:40.760 --> 31:51.760
+Well thanks for the great talk, that was just kind of mind blowing actually, I'm looking forward to re-watching it probably two or three times
+
+31:52.760 --> 31:54.760
+Who is this?
+
+31:55.760 --> 31:57.760
+This is Colwyn again
+
+31:57.760 --> 32:04.760
+Okay, so we do have a few questions coming in
+
+32:05.760 --> 32:08.760
+I'm going to answer them
+
+32:09.760 --> 32:14.760
+Okay, well I can read them to you and then we'll transcribe your answers if you'd like to answer them live
+
+32:14.760 --> 32:29.760
+Oh, I see, let me do that. The identity you've come up as the pantry, that has been to depth and people are putting out perfect scores on that
+
+32:30.760 --> 32:35.760
+But that's not quite the point, I mean sometimes
+
+32:36.760 --> 32:39.760
+Oh, I should also speak slowly
+
+32:39.760 --> 32:54.760
+Sometimes the research community goes too far and reuses the evaluations and doesn't really transfer to domains
+
+32:54.760 --> 33:14.760
+But our richer and newer data that are available is always, we're in the process, I am currently and a couple of my colleagues, we're getting new data so that we can actually make sure the learning model is better
+
+33:14.760 --> 33:35.760
+Oh shoot, and then I failed to unmute myself on the stream here
+
+33:35.760 --> 33:43.760
+And I think you're answering in text right now one of these, so I'll just let you drive
+
+33:44.760 --> 33:51.760
+So one thing I'll add is, please read the question that you're answering when you read out your answers
+
+33:52.760 --> 33:55.760
+Oh, I see, yes
+
+33:55.760 --> 34:06.760
+And we're showing the pad on the stream so people are seeing the text and that's probably a good approach considering we're having a little shakiness with the audio
+
+34:25.760 --> 34:35.760
+In fact, I think my audio may be pretty stable, so I'll just start reading out both the questions and the answers
+
+34:36.760 --> 34:42.760
+But Samir, if you want to, you're welcome to interrupt me if you want to expand on your remarks at all
+
+34:43.760 --> 34:52.760
+So the first question was, has the 92U pin corpus of articles feat been reproduced over and over again using these tools
+
+34:52.760 --> 35:01.760
+The answer was not quite, that was sort of a first wave, the particular corpus was the first one that started a revolution, kind of
+
+35:02.760 --> 35:13.760
+But there are more corpus being made available, in fact I spent about 8 years, a decade ago, building a much larger corpus with more layers of information
+
+35:13.760 --> 35:27.760
+And it is called the Onto Notes, it covers Chinese and Arabic, DARPA funded, this is freely available for research to anyone, anywhere
+
+35:28.760 --> 35:32.760
+That was quite a feature, quite a feat
+
+35:32.760 --> 35:45.760
+The next question, is this only for natural languages like English or more general, would this be used for programming languages
+
+35:46.760 --> 35:54.760
+Samir said, I am using English as a use case, but the idea is to have it completely multilingual
+
+35:54.760 --> 36:12.760
+I cannot think why you would want to use it for programming languages, in fact the AST in programming languages is sort of what we are trying to build upon
+
+36:12.760 --> 36:29.760
+So that one can capture the abstract representation and help the models learn better
+
+36:29.760 --> 36:49.760
+These days the models are trained on a boatload of data, and so they tend to be overfitted to the data
+
+36:49.760 --> 37:13.760
+So if you have a smaller data set, which is not quite the same as the one that you had the training data for, then the models really do poorly
+
+37:13.760 --> 37:29.760
+It is sometimes compared to learning the sine function, using the points on the sine wave, as opposed to deriving the function itself
+
+37:29.760 --> 37:46.760
+You can get close, but then you cannot really do a lot better with that model
+
+37:47.760 --> 37:56.760
+This is sort of what is happening with the deep learning hype
+
+37:56.760 --> 38:13.760
+It is not to say that there hasn't been a significant advancement in the tech, in the technologies
+
+38:13.760 --> 38:28.760
+But to say that the models can learn is an extreme overstatement
+
+38:28.760 --> 38:46.760
+Awesome answer. I'm going to scroll my copy of the pad down just a little bit, and we'll just take a moment to start looking at the next question
+
+38:46.760 --> 38:57.760
+So I'll read that out. Reminds me of the advantages of pre-computer copy and paste, cut up paper and rearrange, but having more stuff with your pieces
+
+38:58.760 --> 39:11.760
+Right. Kind of like that, but more intelligent than copy-paste, because you could have various local constraints that would ensure the information is consistent with the whole
+
+39:11.760 --> 39:30.760
+I am also envisioning this as a use case of hooks
+
+39:30.760 --> 39:57.760
+And if you can have rich local dependencies, then you can be sure, as much as you can, that the information signal is not too corrupted
+
+39:57.760 --> 40:22.760
+Have you used it on real life situations? No. I am probably the only person who is doing this crazy thing
+
+40:22.760 --> 40:47.760
+It would be nice, or rather, I have a feeling that something like this, if worked upon for a while, by many people, by many, might lead to a really really potent tool for the masses
+
+40:47.760 --> 41:00.760
+I feel strongly about using, sorry, I feel strongly about giving such power to the users
+
+41:00.760 --> 41:17.760
+And be able to edit and share the data openly, so that they are not stuck in some corporate vault somewhere
+
+41:17.760 --> 41:31.760
+Amen. One thing at a time. Plus one for that as well.
+
+41:31.760 --> 41:47.760
+Alright, and I will read out the next question. Do you see this as a format for this type of annotation specifically, or something more general that can be used for interlinear glosses, lexicons, etc?
+
+41:47.760 --> 42:12.760
+Absolutely. In fact, the project I mentioned, One Notes, has multiple layers of annotation, one of them being the propositional structure, which it uses for a large lexicon that covers about 15k verbs, so 15,000 verbs, and nouns
+
+42:12.760 --> 42:25.760
+and all their argument structures that we have been seeing so far in the corpora
+
+42:26.760 --> 42:35.760
+This is about a million propositions that have been released recently
+
+42:35.760 --> 42:57.760
+We just recently celebrated a 20th birthday of the Corpus. It is called the Prop Bank.
+
+42:57.760 --> 43:19.760
+There is an interesting history of the banks. It started with Tree Bank, and then there was Prop Bank, with a capital B
+
+43:19.760 --> 43:47.760
+But then, when we were developing Onto Notes, which contains syntax, named entities, conference resolution, propositions, word sense, all in the same hole
+
+43:47.760 --> 43:57.760
+Sorry for the interruption. We have about 5 minutes and 15 seconds.
+
+43:58.760 --> 44:09.760
+That sounds good. If you want to just read it out, then. I think that would be the most important thing, that people can hear your answers, and I and the other volunteers will be going through and trying to transcribe this.
+
+44:09.760 --> 44:19.760
+So go for it.
+
+44:20.760 --> 44:25.760
+So, Samuel, just to make sure, did you have something to say right now?
+
+44:25.760 --> 44:39.760
+Oh, okay. I think these are all good questions, and there is a lot of it, and clearly the amount of time is not enough.
+
+44:39.760 --> 44:54.760
+But I am trying to figure out how to have a community that can help such a person.
+
+44:54.760 --> 45:12.760
+One of the things that I am thinking that this could make possible is to take all the disparate resources that have inconsistent or not quite compatible additions on them,
+
+45:12.760 --> 45:34.760
+and which are right now just iso of data, small island of data floating in the sea. But representation could really bring them all together, and then they could be much richer, full, and consistent.
+
+45:34.760 --> 45:46.760
+Like you said, one of you was asking about the islands and the subcorporas that have sentiment and information.
+
+45:46.760 --> 46:09.760
+I am, yeah, there's a lot of various. Common people, the way it could be used for common people is to potentially make them available that currently doesn't recognize the current models on dual land,
+
+46:09.760 --> 46:19.760
+so that more people can use the data and not be biased towards one or the other.
+
+46:19.760 --> 46:42.760
+And there are some things, when people train these models using huge amounts of data, no matter how big the data is, it is a small cross-section of the universe of data, and depending on what drop select will be your model, those will be the seconds for those.
+
+46:42.760 --> 46:56.760
+And some people will be interested in using them on purpose X, but somebody else might want to use them on purpose Y, and if the data is not in, then it's harder to do that.
+
+47:00.760 --> 47:09.760
+Okay, so I think we've got just about 100 seconds left, so if you have any closing remarks you want to share, and then we'll start transitioning.
+
+47:09.760 --> 47:17.760
+Thank you so much, I really appreciate, this was a great experience, frankly.
+
+47:17.760 --> 47:46.760
+I've never had a complete pre-related level of talk before, I guess, in a way it was for a different audience. It was extremely helpful, and I learned that planning sort of tried to create a community.
+
+47:47.760 --> 47:52.760
+Thank you so much.
+
+47:53.760 --> 47:58.760
+I'll take it over, we are going to move to the next talk. Thank you so much, Samir, and sorry for the technical difficulty.
+
+47:58.760 --> 48:23.760
+As Corbin said, we will try to manage as much of the information that was shared during this Q&A, we will file everything away where we can use it, and make captions and all this, so don't worry about the difficulty.
+
+48:28.760 --> 48:29.760
+Thank you.
+
diff --git a/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main--chapters.vtt b/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main--chapters.vtt
new file mode 100644
index 00000000..e907d8ec
--- /dev/null
+++ b/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main--chapters.vtt
@@ -0,0 +1,65 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:01:13.399
+Introduction
+
+00:01:13.400 --> 00:02:34.559
+Processing language
+
+00:02:34.560 --> 00:03:43.239
+Annotation
+
+00:03:43.240 --> 00:04:39.679
+Learning from data
+
+00:04:39.680 --> 00:05:44.399
+Manual annotation
+
+00:05:44.400 --> 00:06:22.519
+How can we develop a unified representation?
+
+00:06:22.520 --> 00:06:55.279
+What role might Emacs and Org mode play?
+
+00:06:55.280 --> 00:08:10.799
+The complex structure of language
+
+00:08:10.800 --> 00:10:22.359
+Annotation tools
+
+00:10:22.360 --> 00:12:45.479
+Org mode
+
+00:12:45.480 --> 00:17:36.239
+Example
+
+00:17:36.240 --> 00:19:17.679
+Different readings
+
+00:19:17.680 --> 00:23:31.999
+Spontaneous speech
+
+00:23:32.000 --> 00:24:20.279
+Editing properties in column view
+
+00:24:20.280 --> 00:25:15.279
+Conclusion
+
+00:25:15.280 --> 00:27:20.479
+Bonus material
+
+00:27:20.480 --> 00:28:39.279
+Syntactic analysis
+
+00:28:39.280 --> 00:30:12.599
+Forced alignment
+
+00:30:12.600 --> 00:31:42.879
+Alignment before tokenization
+
+00:31:42.880 --> 00:34:31.319
+Layers
+
+00:34:31.320 --> 00:36:17.000
+Variations
diff --git a/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.vtt b/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.vtt
new file mode 100644
index 00000000..a642f94a
--- /dev/null
+++ b/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.vtt
@@ -0,0 +1,1945 @@
+WEBVTT captioned by sameer
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:05.839
+Thank you for joining me today. I'm Sameer Pradhan
+
+00:00:05.840 --> 00:00:07.799
+from the Linguistic Data Consortium
+
+00:00:07.800 --> 00:00:10.079
+at the University of Pennsylvania
+
+00:00:10.080 --> 00:00:14.519
+and founder of cemantix.org .
+
+00:00:14.520 --> 00:00:16.879
+Today we'll be addressing research
+
+00:00:16.880 --> 00:00:18.719
+in computational linguistics,
+
+00:00:18.720 --> 00:00:22.039
+also known as natural language processing
+
+00:00:22.040 --> 00:00:24.719
+a sub area of artificial intelligence
+
+00:00:24.720 --> 00:00:27.759
+with a focus on modeling and predicting
+
+00:00:27.760 --> 00:00:31.919
+complex linguistic structures from various signals.
+
+00:00:31.920 --> 00:00:35.799
+The work we present is limited to text and speech signals.
+
+00:00:35.800 --> 00:00:38.639
+but it can be extended to other signals.
+
+00:00:38.640 --> 00:00:40.799
+We propose an architecture,
+
+00:00:40.800 --> 00:00:42.959
+and we call it GRAIL, which allows
+
+00:00:42.960 --> 00:00:44.639
+the representation and aggregation
+
+00:00:44.640 --> 00:00:50.199
+of such rich structures in a systematic fashion.
+
+00:00:50.200 --> 00:00:52.679
+I'll demonstrate a proof of concept
+
+00:00:52.680 --> 00:00:56.559
+for representing and manipulating data and annotations
+
+00:00:56.560 --> 00:00:58.519
+for the specific purpose of building
+
+00:00:58.520 --> 00:01:02.879
+machine learning models that simulate understanding.
+
+00:01:02.880 --> 00:01:05.679
+These technologies have the potential for impact
+
+00:01:05.680 --> 00:01:09.119
+in almost every conceivable field
+
+00:01:09.120 --> 00:01:13.399
+that generates and uses data.
+
+NOTE Processing language
+
+00:01:13.400 --> 00:01:15.039
+We process human language
+
+00:01:15.040 --> 00:01:16.719
+when our brains receive and assimilate
+
+00:01:16.720 --> 00:01:20.079
+various signals which are then manipulated
+
+00:01:20.080 --> 00:01:23.879
+and interpreted within a syntactic structure.
+
+00:01:23.880 --> 00:01:27.319
+it's a complex process that I have simplified here
+
+00:01:27.320 --> 00:01:30.759
+for the purpose of comparison to machine learning.
+
+00:01:30.760 --> 00:01:33.959
+Recent machine learning models tend to require
+
+00:01:33.960 --> 00:01:37.039
+a large amount of raw, naturally occurring data
+
+00:01:37.040 --> 00:01:40.199
+and a varying amount of manually enriched data,
+
+00:01:40.200 --> 00:01:43.199
+commonly known as "annotations".
+
+00:01:43.200 --> 00:01:45.959
+Owing to the complex and numerous nature
+
+00:01:45.960 --> 00:01:49.959
+of linguistic phenomena, we have most often used
+
+00:01:49.960 --> 00:01:52.999
+a divide and conquer approach.
+
+00:01:53.000 --> 00:01:55.399
+The strength of this approach is that it allows us
+
+00:01:55.400 --> 00:01:58.159
+to focus on a single, or perhaps a few related
+
+00:01:58.160 --> 00:02:00.439
+linguistic phenomena.
+
+00:02:00.440 --> 00:02:03.879
+The weaknesses are the universe of these phenomena
+
+00:02:03.880 --> 00:02:07.239
+keep expanding, as language itself
+
+00:02:07.240 --> 00:02:09.359
+evolves and changes over time,
+
+00:02:09.360 --> 00:02:13.119
+and second, this approach requires an additional task
+
+00:02:13.120 --> 00:02:14.839
+of aggregating the interpretations,
+
+00:02:14.840 --> 00:02:18.359
+creating more opportunities for computer error.
+
+00:02:18.360 --> 00:02:21.519
+Our challenge, then, is to find the sweet spot
+
+00:02:21.520 --> 00:02:25.239
+that allows us to encode complex information
+
+00:02:25.240 --> 00:02:27.719
+without the use of manual annotation,
+
+00:02:27.720 --> 00:02:34.559
+or without the additional task of aggregation by computers.
+
+NOTE Annotation
+
+00:02:34.560 --> 00:02:37.119
+So what do I mean by "annotation"?
+
+00:02:37.120 --> 00:02:39.759
+In this talk the word annotation refers to
+
+00:02:39.760 --> 00:02:43.519
+the manual assignment of certain attributes
+
+00:02:43.520 --> 00:02:48.639
+to portions of a signal which is necessary
+
+00:02:48.640 --> 00:02:51.639
+to perform the end task.
+
+00:02:51.640 --> 00:02:54.439
+For example, in order for the algorithm
+
+00:02:54.440 --> 00:02:57.439
+to accurately interpret a pronoun,
+
+00:02:57.440 --> 00:03:00.279
+it needs to know that pronoun,
+
+00:03:00.280 --> 00:03:03.799
+what that pronoun refers back to.
+
+00:03:03.800 --> 00:03:06.719
+We may find this task trivial, however,
+
+00:03:06.720 --> 00:03:10.599
+current algorithms repeatedly fail in this task.
+
+00:03:10.600 --> 00:03:13.319
+So the complexities of understanding
+
+00:03:13.320 --> 00:03:16.639
+in computational linguistics require annotation.
+
+00:03:16.640 --> 00:03:20.799
+The world annotation itself is a useful example,
+
+00:03:20.800 --> 00:03:22.679
+because it also reminds us
+
+00:03:22.680 --> 00:03:25.119
+that words have multiple meetings
+
+00:03:25.120 --> 00:03:27.519
+as annotation itself does—
+
+00:03:27.520 --> 00:03:30.559
+just as I needed to define it in this context,
+
+00:03:30.560 --> 00:03:33.799
+so that my message won't be misinterpreted.
+
+00:03:33.800 --> 00:03:39.039
+So, too, must annotators do this for algorithms
+
+00:03:39.040 --> 00:03:43.239
+through the manual intervention.
+
+NOTE Learning from data
+
+00:03:43.240 --> 00:03:44.759
+Learning from raw data
+
+00:03:44.760 --> 00:03:47.039
+(commonly known as unsupervised learning)
+
+00:03:47.040 --> 00:03:50.079
+poses limitations for machine learning.
+
+00:03:50.080 --> 00:03:53.039
+As I described, modeling complex phenomena
+
+00:03:53.040 --> 00:03:55.559
+need manual annotations.
+
+00:03:55.560 --> 00:03:58.559
+The learning algorithm uses these annotations
+
+00:03:58.560 --> 00:04:01.319
+as examples to build statistical models.
+
+00:04:01.320 --> 00:04:04.879
+This is called supervised learning.
+
+00:04:04.880 --> 00:04:06.319
+Without going into too much detail,
+
+00:04:06.320 --> 00:04:10.039
+I'll simply note that the recent popularity
+
+00:04:10.040 --> 00:04:12.519
+of the concept of deep learning
+
+00:04:12.520 --> 00:04:14.679
+is that evolutionary step
+
+00:04:14.680 --> 00:04:17.319
+where we have learned to train models
+
+00:04:17.320 --> 00:04:20.799
+using trillions of parameters in ways that they can
+
+00:04:20.800 --> 00:04:25.079
+learn richer hierarchical structures
+
+00:04:25.080 --> 00:04:29.399
+from very large amounts of annotate, unannotated data.
+
+00:04:29.400 --> 00:04:32.319
+These models can then be fine-tuned,
+
+00:04:32.320 --> 00:04:35.599
+using varying amounts of annotated examples
+
+00:04:35.600 --> 00:04:37.639
+depending on the complexity of the task
+
+00:04:37.640 --> 00:04:39.679
+to generate better predictions.
+
+NOTE Manual annotation
+
+00:04:39.680 --> 00:04:44.919
+As you might imagine, manually annotating
+
+00:04:44.920 --> 00:04:47.359
+complex, linguistic phenomena
+
+00:04:47.360 --> 00:04:51.719
+can be very specific, labor-intensive task.
+
+00:04:51.720 --> 00:04:54.279
+For example, imagine if we were
+
+00:04:54.280 --> 00:04:56.399
+to go back through this presentation
+
+00:04:56.400 --> 00:04:58.399
+and connect all the pronouns
+
+00:04:58.400 --> 00:04:59.919
+with the nouns to which they refer.
+
+00:04:59.920 --> 00:05:03.239
+Even for a short 18 min presentation,
+
+00:05:03.240 --> 00:05:05.239
+this would require hundreds of annotations.
+
+00:05:05.240 --> 00:05:08.519
+The models we build are only as good
+
+00:05:08.520 --> 00:05:11.119
+as the quality of the annotations we make.
+
+00:05:11.120 --> 00:05:12.679
+We need guidelines
+
+00:05:12.680 --> 00:05:15.759
+that ensure that the annotations are done
+
+00:05:15.760 --> 00:05:19.719
+by at least two humans who have substantial agreement
+
+00:05:19.720 --> 00:05:22.119
+with each other in their interpretations.
+
+00:05:22.120 --> 00:05:25.599
+We know that if we try to trade a model using annotations
+
+00:05:25.600 --> 00:05:28.519
+that are very subjective, or have more noise,
+
+00:05:28.520 --> 00:05:30.919
+we will receive poor predictions.
+
+00:05:30.920 --> 00:05:33.679
+Additionally, there is the concern of introducing
+
+00:05:33.680 --> 00:05:37.079
+various unexpected biases into one's models.
+
+00:05:37.080 --> 00:05:44.399
+So annotation is really both an art and a science.
+
+NOTE How can we develop a unified representation?
+
+00:05:44.400 --> 00:05:47.439
+In the remaining time,
+
+00:05:47.440 --> 00:05:49.999
+we will turn to two fundamental questions.
+
+00:05:50.000 --> 00:05:54.239
+First, how can we develop a unified representation
+
+00:05:54.240 --> 00:05:55.599
+of data and annotations
+
+00:05:55.600 --> 00:05:59.759
+that encompasses arbitrary levels of linguistic information?
+
+00:05:59.760 --> 00:06:03.839
+There is a long history of attempting to answer
+
+00:06:03.840 --> 00:06:04.839
+this first question.
+
+00:06:04.840 --> 00:06:08.839
+This history is documented in our recent article,
+
+00:06:08.840 --> 00:06:11.519
+and you can refer to that article.
+
+00:06:11.520 --> 00:06:16.719
+It will be on the website.
+
+00:06:16.720 --> 00:06:18.999
+It is as if we, as a community,
+
+00:06:19.000 --> 00:06:22.519
+have been searching for our own Holy Grail.
+
+NOTE What role might Emacs and Org mode play?
+
+00:06:22.520 --> 00:06:26.519
+The second question we will pose is
+
+00:06:26.520 --> 00:06:30.159
+what role might Emacs, along with Org mode,
+
+00:06:30.160 --> 00:06:31.919
+play in this process?
+
+00:06:31.920 --> 00:06:35.359
+Well, the solution itself may not be tied to Emacs.
+
+00:06:35.360 --> 00:06:38.359
+Emacs has built in capabilities
+
+00:06:38.360 --> 00:06:42.599
+that could be useful for evaluating potential solutions.
+
+00:06:42.600 --> 00:06:45.759
+It's also one of the most extensively documented
+
+00:06:45.760 --> 00:06:48.519
+pieces of software and the most customizable
+
+00:06:48.520 --> 00:06:51.599
+piece of software that I have ever come across,
+
+00:06:51.600 --> 00:06:55.279
+and many would agree with that.
+
+NOTE The complex structure of language
+
+00:06:55.280 --> 00:07:00.639
+In order to approach this second question,
+
+00:07:00.640 --> 00:07:03.919
+we turn to the complex structure of language itself.
+
+00:07:03.920 --> 00:07:07.679
+At first glance, language appears to us
+
+00:07:07.680 --> 00:07:09.879
+as a series of words.
+
+00:07:09.880 --> 00:07:13.439
+Words form sentences, sentences form paragraphs,
+
+00:07:13.440 --> 00:07:16.239
+and paragraphs form completed text.
+
+00:07:16.240 --> 00:07:19.039
+If this was a sufficient description
+
+00:07:19.040 --> 00:07:21.159
+of the complexity of language,
+
+00:07:21.160 --> 00:07:24.199
+all of us would be able to speak and read
+
+00:07:24.200 --> 00:07:26.559
+at least ten different languages.
+
+00:07:26.560 --> 00:07:29.279
+We know it is much more complex than this.
+
+00:07:29.280 --> 00:07:33.199
+There is a rich, underlying recursive tree structure--
+
+00:07:33.200 --> 00:07:36.439
+in fact, many possible tree structures
+
+00:07:36.440 --> 00:07:39.439
+which makes a particular sequence meaningful
+
+00:07:39.440 --> 00:07:42.079
+and many others meaningless.
+
+00:07:42.080 --> 00:07:45.239
+One of the better understood tree structures
+
+00:07:45.240 --> 00:07:47.119
+is the syntactic structure.
+
+00:07:47.120 --> 00:07:49.439
+While natural language
+
+00:07:49.440 --> 00:07:51.679
+has rich ambiguities and complexities,
+
+00:07:51.680 --> 00:07:55.119
+programming languages are designed to be parsed
+
+00:07:55.120 --> 00:07:56.999
+and interpreted deterministically.
+
+00:07:57.000 --> 00:08:02.159
+Emacs has been used for programming very effectively.
+
+00:08:02.160 --> 00:08:05.359
+So there is a potential for using Emacs
+
+00:08:05.360 --> 00:08:06.559
+as a tool for annotation.
+
+00:08:06.560 --> 00:08:10.799
+This would significantly improve our current set of tools.
+
+NOTE Annotation tools
+
+00:08:10.800 --> 00:08:16.559
+It is important to note that most of the annotation tools
+
+00:08:16.560 --> 00:08:19.639
+that have been developed over the past few decades
+
+00:08:19.640 --> 00:08:22.879
+have relied on graphical interfaces,
+
+00:08:22.880 --> 00:08:26.919
+even those used for enriching textual information.
+
+00:08:26.920 --> 00:08:30.399
+Most of the tools in current use
+
+00:08:30.400 --> 00:08:36.159
+are designed for a end user to add very specific,
+
+00:08:36.160 --> 00:08:38.639
+very restricted information.
+
+00:08:38.640 --> 00:08:42.799
+We have not really made use of the potential
+
+00:08:42.800 --> 00:08:45.639
+that an editor or a rich editing environment like Emacs
+
+00:08:45.640 --> 00:08:47.239
+can add to the mix.
+
+00:08:47.240 --> 00:08:52.479
+Emacs has long enabled the editing of, the manipulation of
+
+00:08:52.480 --> 00:08:56.359
+complex embedded tree structures abundant in source code.
+
+00:08:56.360 --> 00:08:58.599
+So it's not difficult to imagine that it would have
+
+00:08:58.600 --> 00:09:00.359
+many capabilities that we we need
+
+00:09:00.360 --> 00:09:02.599
+to represent actual language.
+
+00:09:02.600 --> 00:09:04.759
+In fact, it already does that with features
+
+00:09:04.760 --> 00:09:06.399
+that allow us to quickly navigate
+
+00:09:06.400 --> 00:09:07.919
+through sentences and paragraphs,
+
+00:09:07.920 --> 00:09:09.799
+and we don't need a few key strokes.
+
+00:09:09.800 --> 00:09:13.599
+Or to add various text properties to text spans
+
+00:09:13.600 --> 00:09:17.039
+to create overlays, to name but a few.
+
+00:09:17.040 --> 00:09:22.719
+Emacs figured out this way to handle Unicode,
+
+00:09:22.720 --> 00:09:26.799
+so you don't even have to worry about the complexity
+
+00:09:26.800 --> 00:09:29.439
+of managing multiple languages.
+
+00:09:29.440 --> 00:09:34.039
+It's built into Emacs. In fact, this is not the first time
+
+00:09:34.040 --> 00:09:37.399
+Emacs has been used for linguistic analysis.
+
+00:09:37.400 --> 00:09:41.159
+One of the breakthrough moments in language,
+
+00:09:41.160 --> 00:09:44.439
+natural language processing was the creation
+
+00:09:44.440 --> 00:09:48.639
+of manually created syntactic trees
+
+00:09:48.640 --> 00:09:50.439
+for a 1 million word collection
+
+00:09:50.440 --> 00:09:52.399
+of Wall Street Journal articles.
+
+00:09:52.400 --> 00:09:54.879
+This was else around 1992
+
+00:09:54.880 --> 00:09:59.279
+before Java or graphical interfaces were common.
+
+00:09:59.280 --> 00:10:03.279
+The tool that was used to create that corpus was Emacs.
+
+00:10:03.280 --> 00:10:08.959
+It was created at UPenn, and is famously known as
+
+00:10:08.960 --> 00:10:12.719
+the Penn Treebank. '92 was about when
+
+00:10:12.720 --> 00:10:16.439
+the Linguistic Data Consortium was also established,
+
+00:10:16.440 --> 00:10:18.039
+and it's been about 30 years
+
+00:10:18.040 --> 00:10:20.719
+that it has been creating various
+
+00:10:20.720 --> 00:10:22.359
+language-related resources.
+
+NOTE Org mode
+
+00:10:22.360 --> 00:10:28.519
+Org mode--in particular, the outlining mode,
+
+00:10:28.520 --> 00:10:32.399
+or rather the enhanced form of outlining mode--
+
+00:10:32.400 --> 00:10:35.599
+allows us to create rich outlines,
+
+00:10:35.600 --> 00:10:37.799
+attaching properties to nodes,
+
+00:10:37.800 --> 00:10:41.119
+and provides commands for easily customizing
+
+00:10:41.120 --> 00:10:43.879
+sorting of various pieces of information
+
+00:10:43.880 --> 00:10:45.639
+as per one's requirement.
+
+00:10:45.640 --> 00:10:50.239
+This can also be a very useful tool.
+
+00:10:50.240 --> 00:10:59.159
+This enhanced form of outline-mode adds more power to Emacs.
+
+00:10:59.160 --> 00:11:03.359
+It provides commands for easily customizing
+
+00:11:03.360 --> 00:11:05.159
+and filtering information,
+
+00:11:05.160 --> 00:11:08.999
+while at the same time hiding unnecessary context.
+
+00:11:09.000 --> 00:11:11.919
+It also allows structural editing.
+
+00:11:11.920 --> 00:11:16.039
+This can be a very useful tool to enrich corpora
+
+00:11:16.040 --> 00:11:20.919
+where we are focusing on limited amount of phenomena.
+
+00:11:20.920 --> 00:11:24.519
+The two together allow us to create
+
+00:11:24.520 --> 00:11:27.199
+a rich representation
+
+00:11:27.200 --> 00:11:32.999
+that can simultaneously capture multiple possible sequences,
+
+00:11:33.000 --> 00:11:38.759
+capture details necessary to recreate the original source,
+
+00:11:38.760 --> 00:11:42.079
+allow the creation of hierarchical representation,
+
+00:11:42.080 --> 00:11:44.679
+provide structural editing capabilities
+
+00:11:44.680 --> 00:11:47.439
+that can take advantage of the concept of inheritance
+
+00:11:47.440 --> 00:11:48.999
+within the tree structure.
+
+00:11:49.000 --> 00:11:54.279
+Together they allow local manipulations of structures,
+
+00:11:54.280 --> 00:11:56.199
+thereby minimizing data coupling.
+
+00:11:56.200 --> 00:11:59.119
+The concept of tags in Org mode
+
+00:11:59.120 --> 00:12:01.599
+complement the hierarchy part.
+
+00:12:01.600 --> 00:12:03.839
+Hierarchies can be very rigid,
+
+00:12:03.840 --> 00:12:06.039
+but to tags on hierarchies,
+
+00:12:06.040 --> 00:12:08.839
+we can have a multifaceted representations.
+
+00:12:08.840 --> 00:12:12.759
+As a matter of fact, Org mode has the ability for the tags
+
+00:12:12.760 --> 00:12:15.039
+to have their own hierarchical structure
+
+00:12:15.040 --> 00:12:18.639
+which further enhances the representational power.
+
+00:12:18.640 --> 00:12:22.639
+All of this can be done as a sequence
+
+00:12:22.640 --> 00:12:25.679
+of mostly functional data transformations,
+
+00:12:25.680 --> 00:12:27.439
+because most of the capabilities
+
+00:12:27.440 --> 00:12:29.759
+can be configured and customized.
+
+00:12:29.760 --> 00:12:32.799
+It is not necessary to do everything at once.
+
+00:12:32.800 --> 00:12:36.199
+Instead, it allows us to incrementally increase
+
+00:12:36.200 --> 00:12:37.919
+the complexity of the representation.
+
+00:12:37.920 --> 00:12:39.799
+Finally, all of this can be done
+
+00:12:39.800 --> 00:12:42.359
+in plain-text representation
+
+00:12:42.360 --> 00:12:45.479
+which comes with its own advantages.
+
+NOTE Example
+
+00:12:45.480 --> 00:12:50.679
+Now let's take a simple example.
+
+00:12:50.680 --> 00:12:55.999
+This is a a short video that I'll play.
+
+00:12:56.000 --> 00:12:59.679
+The sentence is "I saw the moon with a telescope,"
+
+00:12:59.680 --> 00:13:03.999
+and let's just make a copy of the sentence.
+
+00:13:04.000 --> 00:13:09.199
+What we can do now is to see:
+
+00:13:09.200 --> 00:13:11.879
+what does this sentence comprise?
+
+00:13:11.880 --> 00:13:13.679
+It has a noun phrase "I,"
+
+00:13:13.680 --> 00:13:17.479
+followed by a word "saw."
+
+00:13:17.480 --> 00:13:21.359
+Then "the moon" is another noun phrase,
+
+00:13:21.360 --> 00:13:24.839
+and "with the telescope" is a prepositional phrase.
+
+00:13:24.840 --> 00:13:30.759
+Now one thing that you might remember,
+
+00:13:30.760 --> 00:13:36.119
+from grammar school or syntax is that
+
+00:13:36.120 --> 00:13:41.279
+there is a syntactic structure.
+
+00:13:41.280 --> 00:13:44.359
+And if you in this particular case--
+
+00:13:44.360 --> 00:13:47.919
+because we know that the moon is not typically
+
+00:13:47.920 --> 00:13:51.679
+something that can hold the telescope,
+
+00:13:51.680 --> 00:13:56.239
+that the seeing must be done by me or "I,"
+
+00:13:56.240 --> 00:14:01.039
+and the telescope must be in my hand,
+
+00:14:01.040 --> 00:14:04.479
+or "I" am viewing the moon with a telescope.
+
+00:14:04.480 --> 00:14:13.519
+However, it is possible that in a different context
+
+00:14:13.520 --> 00:14:17.159
+the moon could be referring to an animated character
+
+00:14:17.160 --> 00:14:22.319
+in a animated series, and could actually hold the telescope.
+
+00:14:22.320 --> 00:14:23.479
+And this is one of the most--
+
+00:14:23.480 --> 00:14:24.839
+the oldest and one of the most--
+
+00:14:24.840 --> 00:14:26.319
+and in that case the situation might be
+
+00:14:26.320 --> 00:14:30.959
+that I'm actually seeing the moon holding a telescope...
+
+00:14:30.960 --> 00:14:36.079
+I mean. The moon is holding the telescope,
+
+00:14:36.080 --> 00:14:40.959
+and I'm just seeing the moon holding the telescope.
+
+00:14:40.960 --> 00:14:47.999
+Complex linguistic ambiguity or linguistic
+
+00:14:48.000 --> 00:14:53.599
+phenomena that requires world knowledge,
+
+00:14:53.600 --> 00:14:55.719
+and it's called the PP attachment problem
+
+00:14:55.720 --> 00:14:59.239
+where the propositional phrase attachment
+
+00:14:59.240 --> 00:15:04.599
+can be ambiguous, and various different contextual cues
+
+00:15:04.600 --> 00:15:06.879
+have to be used to resolve the ambiguity.
+
+00:15:06.880 --> 00:15:09.079
+So in this case, as you saw,
+
+00:15:09.080 --> 00:15:11.199
+both the readings are technically true,
+
+00:15:11.200 --> 00:15:13.959
+depending on different contexts.
+
+00:15:13.960 --> 00:15:16.599
+So one thing we could do is just
+
+00:15:16.600 --> 00:15:19.919
+to cut the tree and duplicate it,
+
+00:15:19.920 --> 00:15:21.599
+and then let's create another node
+
+00:15:21.600 --> 00:15:24.479
+and call it an "OR" node.
+
+00:15:24.480 --> 00:15:26.119
+And because we are saying,
+
+00:15:26.120 --> 00:15:28.359
+this is one of the two interpretations.
+
+00:15:28.360 --> 00:15:32.159
+Now let's call one interpretation "a",
+
+00:15:32.160 --> 00:15:36.159
+and that interpretation essentially
+
+00:15:36.160 --> 00:15:39.319
+is this child of that node "a"
+
+00:15:39.320 --> 00:15:41.799
+and that says that the moon
+
+00:15:41.800 --> 00:15:43.999
+is holding the telescope.
+
+00:15:44.000 --> 00:15:46.359
+Now we can create another representation "b"
+
+00:15:46.360 --> 00:15:53.919
+where we capture the other interpretation,
+
+00:15:53.920 --> 00:15:59.959
+where this, the act, the moon or--I am actually
+
+00:15:59.960 --> 00:16:00.519
+holding the telescope,
+
+00:16:00.520 --> 00:16:06.799
+and watching the moon using it.
+
+00:16:06.800 --> 00:16:09.199
+So now we have two separate interpretations
+
+00:16:09.200 --> 00:16:11.679
+in the same structure,
+
+00:16:11.680 --> 00:16:15.519
+and all we do--we're able to do is with this,
+
+00:16:15.520 --> 00:16:18.159
+with very quick key strokes now...
+
+00:16:18.160 --> 00:16:22.439
+While we are at it, let's add another interesting thing,
+
+00:16:22.440 --> 00:16:25.159
+this node that represents "I":
+
+00:16:25.160 --> 00:16:28.919
+"He." It can be "She".
+
+00:16:28.920 --> 00:16:35.759
+It can be "the children," or it can be "The people".
+
+00:16:35.760 --> 00:16:45.039
+Basically, any entity that has the capability to "see"
+
+00:16:45.040 --> 00:16:53.359
+can be substituted in this particular node.
+
+00:16:53.360 --> 00:16:57.399
+Let's see what we have here now.
+
+00:16:57.400 --> 00:17:01.239
+We just are getting sort of a zoom view
+
+00:17:01.240 --> 00:17:04.599
+of the entire structure, what we created,
+
+00:17:04.600 --> 00:17:08.039
+and essentially you can see that
+
+00:17:08.040 --> 00:17:11.879
+by just, you know, using a few keystrokes,
+
+00:17:11.880 --> 00:17:17.839
+we were able to capture two different interpretations
+
+00:17:17.840 --> 00:17:20.879
+of a a simple sentence,
+
+00:17:20.880 --> 00:17:23.759
+and they are also able to add
+
+00:17:23.760 --> 00:17:27.799
+these alternate pieces of information
+
+00:17:27.800 --> 00:17:30.559
+that could help machine learning algorithms
+
+00:17:30.560 --> 00:17:32.439
+generalize better.
+
+00:17:32.440 --> 00:17:36.239
+All right.
+
+NOTE Different readings
+
+00:17:36.240 --> 00:17:40.359
+Now, let's look at the next thing. So in a sense,
+
+00:17:40.360 --> 00:17:46.679
+we can use this power of functional data structures
+
+00:17:46.680 --> 00:17:50.239
+to represent various potentially conflicting
+
+00:17:50.240 --> 00:17:55.559
+and structural readings of that piece of text.
+
+00:17:55.560 --> 00:17:58.079
+In addition to that, we can also create more texts,
+
+00:17:58.080 --> 00:17:59.799
+each with different structure,
+
+00:17:59.800 --> 00:18:01.559
+and have them all in the same place.
+
+00:18:01.560 --> 00:18:04.239
+This allows us to address the interpretation
+
+00:18:04.240 --> 00:18:06.879
+of a static sentence that might be occurring in the world,
+
+00:18:06.880 --> 00:18:09.639
+while simultaneously inserting information
+
+00:18:09.640 --> 00:18:11.519
+that would add more value to it.
+
+00:18:11.520 --> 00:18:14.999
+This makes the enrichment process also very efficient.
+
+00:18:15.000 --> 00:18:19.519
+Additionally, we can envision
+
+00:18:19.520 --> 00:18:23.999
+a power user of the future, or present,
+
+00:18:24.000 --> 00:18:27.479
+who can not only annotate a span,
+
+00:18:27.480 --> 00:18:31.279
+but also edit the information in situ
+
+00:18:31.280 --> 00:18:34.639
+in a way that would help machine algorithms
+
+00:18:34.640 --> 00:18:36.879
+generalize better by making more efficient use
+
+00:18:36.880 --> 00:18:37.719
+of the annotations.
+
+00:18:37.720 --> 00:18:41.519
+So together, Emacs and Org mode can speed up
+
+00:18:41.520 --> 00:18:42.959
+the enrichment of the signals
+
+00:18:42.960 --> 00:18:44.519
+in a way that allows us
+
+00:18:44.520 --> 00:18:47.719
+to focus on certain aspects and ignore others.
+
+00:18:47.720 --> 00:18:50.839
+Extremely complex landscape of rich structures
+
+00:18:50.840 --> 00:18:53.039
+can be captured consistently,
+
+00:18:53.040 --> 00:18:55.639
+in a fashion that allows computers
+
+00:18:55.640 --> 00:18:56.759
+to understand language.
+
+00:18:56.760 --> 00:19:00.879
+We can then build tools to enhance the tasks
+
+00:19:00.880 --> 00:19:03.319
+that we do in our everyday life.
+
+00:19:03.320 --> 00:19:10.759
+YAMR is acronym, or the file's type or specification
+
+00:19:10.760 --> 00:19:15.239
+that we are creating to capture this new
+
+00:19:15.240 --> 00:19:17.679
+rich representation.
+
+NOTE Spontaneous speech
+
+00:19:17.680 --> 00:19:21.959
+We'll now look at an example of spontaneous speech
+
+00:19:21.960 --> 00:19:24.799
+that occurs in spoken conversations.
+
+00:19:24.800 --> 00:19:28.599
+Conversations frequently contain errors in speech:
+
+00:19:28.600 --> 00:19:30.799
+interruptions, disfluencies,
+
+00:19:30.800 --> 00:19:33.959
+verbal sounds such as cough or laugh,
+
+00:19:33.960 --> 00:19:35.039
+and other noises.
+
+00:19:35.040 --> 00:19:38.199
+In this sense, spontaneous speech is similar
+
+00:19:38.200 --> 00:19:39.799
+to a functional data stream.
+
+00:19:39.800 --> 00:19:42.759
+We cannot take back words that come out of our mouth,
+
+00:19:42.760 --> 00:19:47.239
+but we tend to make mistakes, and we correct ourselves
+
+00:19:47.240 --> 00:19:49.039
+as soon as we realize that we have made--
+
+00:19:49.040 --> 00:19:50.679
+we have misspoken.
+
+00:19:50.680 --> 00:19:53.159
+This process manifests through a combination
+
+00:19:53.160 --> 00:19:56.279
+of a handful of mechanisms, including immediate correction
+
+00:19:56.280 --> 00:20:00.959
+after an error, and we do this unconsciously.
+
+00:20:00.960 --> 00:20:02.719
+Computers, on the other hand,
+
+00:20:02.720 --> 00:20:06.639
+must be taught to understand these cases.
+
+00:20:06.640 --> 00:20:12.799
+What we see here is a example document or outline,
+
+00:20:12.800 --> 00:20:18.119
+or part of a document that illustrates
+
+00:20:18.120 --> 00:20:22.919
+various different aspects of the representation.
+
+00:20:22.920 --> 00:20:25.919
+We don't have a lot of time to go through
+
+00:20:25.920 --> 00:20:28.239
+many of the details.
+
+00:20:28.240 --> 00:20:31.759
+I would highly encourage you to play a...
+
+00:20:31.760 --> 00:20:39.159
+I'm planning on making some videos, or ascii cinemas,
+
+00:20:39.160 --> 00:20:42.559
+that I'll be posting, and you can,
+
+00:20:42.560 --> 00:20:46.759
+if you're interested, you can go through those.
+
+00:20:46.760 --> 00:20:50.359
+The idea here is to try to do
+
+00:20:50.360 --> 00:20:54.599
+a slightly more complex use case.
+
+00:20:54.600 --> 00:20:57.639
+But again, given the time constraint
+
+00:20:57.640 --> 00:21:00.279
+and the amount of information
+
+00:21:00.280 --> 00:21:01.519
+that needs to fit in the screen,
+
+00:21:01.520 --> 00:21:05.559
+this may not be very informative,
+
+00:21:05.560 --> 00:21:08.399
+but at least it will give you some idea
+
+00:21:08.400 --> 00:21:10.439
+of what can be possible.
+
+00:21:10.440 --> 00:21:13.279
+And in this particular case, what you're seeing is that
+
+00:21:13.280 --> 00:21:18.319
+there is a sentence which is "What I'm I'm tr- telling now."
+
+00:21:18.320 --> 00:21:21.159
+Essentially, there is a repetition of the word "I'm",
+
+00:21:21.160 --> 00:21:23.279
+and then there is a partial word
+
+00:21:23.280 --> 00:21:25.159
+that somebody tried to say "telling",
+
+00:21:25.160 --> 00:21:29.599
+but started saying "tr-", and then corrected themselves
+
+00:21:29.600 --> 00:21:30.959
+and said, "telling now."
+
+00:21:30.960 --> 00:21:39.239
+So in this case, you see, we can capture words
+
+00:21:39.240 --> 00:21:44.919
+or a sequence of words, or a sequence of tokens.
+
+00:21:44.920 --> 00:21:52.279
+One thing to... An interesting thing to note is that in NLP,
+
+00:21:52.280 --> 00:21:55.319
+sometimes we have to break typically
+
+00:21:55.320 --> 00:22:01.199
+words that don't have spaces into two separate words,
+
+00:22:01.200 --> 00:22:04.119
+especially contractions like "I'm",
+
+00:22:04.120 --> 00:22:08.199
+so the syntactic parser needs needs two separate nodes.
+
+00:22:08.200 --> 00:22:11.199
+But anyway, so I'll... You can see that here.
+
+00:22:11.200 --> 00:22:15.759
+The other... This view. What this view shows is that
+
+00:22:15.760 --> 00:22:19.759
+with each of the nodes in the sentence
+
+00:22:19.760 --> 00:22:23.079
+or in the representation,
+
+00:22:23.080 --> 00:22:26.079
+you can have a lot of different properties
+
+00:22:26.080 --> 00:22:27.559
+that you can attach to them,
+
+00:22:27.560 --> 00:22:30.119
+and these properties are typically hidden,
+
+00:22:30.120 --> 00:22:32.719
+like you saw in the earlier slide.
+
+00:22:32.720 --> 00:22:35.599
+But you can make use of all these properties
+
+00:22:35.600 --> 00:22:39.439
+to do various kind of searches and filtering.
+
+00:22:39.440 --> 00:22:43.519
+And on the right hand side here--
+
+00:22:43.520 --> 00:22:48.799
+this is actually not a legitimate syntax--
+
+00:22:48.800 --> 00:22:51.279
+but on the right are descriptions
+
+00:22:51.280 --> 00:22:53.479
+of what each of these represent.
+
+00:22:53.480 --> 00:22:57.319
+All the information is also available in the article.
+
+00:22:57.320 --> 00:23:04.279
+You can see there... It shows how much rich context
+
+00:23:04.280 --> 00:23:05.879
+you can capture.
+
+00:23:05.880 --> 00:23:08.799
+This is just a closer snapshot
+
+00:23:08.800 --> 00:23:10.159
+of the properties on the node,
+
+00:23:10.160 --> 00:23:13.119
+and you can see we can have things like,
+
+00:23:13.120 --> 00:23:14.799
+whether the word is a token or not,
+
+00:23:14.800 --> 00:23:17.359
+or that it's incomplete, whether some words
+
+00:23:17.360 --> 00:23:19.959
+might want to be filtered out for parsing,
+
+00:23:19.960 --> 00:23:23.039
+and we can say this: PARSE_IGNORE,
+
+00:23:23.040 --> 00:23:25.519
+or some words or restart markers...
+
+00:23:25.520 --> 00:23:29.239
+We can mark, add a RESTART_MARKER, or sometimes,
+
+00:23:29.240 --> 00:23:31.999
+some of these might have durations. Things like that.
+
+NOTE Editing properties in column view
+
+00:23:32.000 --> 00:23:38.799
+The other fascinating thing of this representation
+
+00:23:38.800 --> 00:23:42.599
+is that you can edit properties in the column view.
+
+00:23:42.600 --> 00:23:45.399
+And suddenly, you have this tabular data structure
+
+00:23:45.400 --> 00:23:48.879
+combined with the hierarchical data structure.
+
+00:23:48.880 --> 00:23:53.119
+And as you can--you may not be able to see it here,
+
+00:23:53.120 --> 00:23:56.879
+but what has also happened here is that
+
+00:23:56.880 --> 00:24:01.159
+some of the tags have been inherited
+
+00:24:01.160 --> 00:24:02.479
+from the earlier nodes.
+
+00:24:02.480 --> 00:24:07.919
+And so you get a much fuller picture of things.
+
+00:24:07.920 --> 00:24:13.919
+Essentially you, can filter out things
+
+00:24:13.920 --> 00:24:15.319
+that you want to process,
+
+00:24:15.320 --> 00:24:20.279
+process them, and then reintegrate it into the whole.
+
+NOTE Conclusion
+
+00:24:20.280 --> 00:24:25.479
+So, in conclusion, today we have proposed and demonstrated
+
+00:24:25.480 --> 00:24:27.559
+the use of an architecture (GRAIL),
+
+00:24:27.560 --> 00:24:31.319
+which allows the representation, manipulation,
+
+00:24:31.320 --> 00:24:34.759
+and aggregation of rich linguistic structures
+
+00:24:34.760 --> 00:24:36.519
+in a systematic fashion.
+
+00:24:36.520 --> 00:24:41.359
+We have shown how GRAIL advances the tools
+
+00:24:41.360 --> 00:24:44.599
+available for building machine learning models
+
+00:24:44.600 --> 00:24:46.879
+that simulate understanding.
+
+00:24:46.880 --> 00:24:51.679
+Thank you very much for your time and attention today.
+
+00:24:51.680 --> 00:24:54.639
+My contact information is on this slide.
+
+00:24:54.640 --> 00:25:02.599
+If you are interested in an additional example
+
+00:25:02.600 --> 00:25:05.439
+that demonstrates the representation
+
+00:25:05.440 --> 00:25:08.039
+of speech and written text together,
+
+00:25:08.040 --> 00:25:10.719
+please continue watching.
+
+00:25:10.720 --> 00:25:12.199
+Otherwise, you can stop here
+
+00:25:12.200 --> 00:25:15.279
+and enjoy the rest of the conference.
+
+NOTE Bonus material
+
+00:25:15.280 --> 00:25:39.079
+Welcome to the bonus material.
+
+00:25:39.080 --> 00:25:43.959
+I'm glad for those of you who are stuck around.
+
+00:25:43.960 --> 00:25:46.559
+We are now going to examine an instance
+
+00:25:46.560 --> 00:25:49.159
+of speech and text signals together
+
+00:25:49.160 --> 00:25:51.479
+that produce multiple layers.
+
+00:25:51.480 --> 00:25:54.839
+When we have--when we take a spoken conversation
+
+00:25:54.840 --> 00:25:58.719
+and use the best language processing models available,
+
+00:25:58.720 --> 00:26:00.679
+we suddenly hit a hard spot
+
+00:26:00.680 --> 00:26:03.239
+because the tools are typically not trained
+
+00:26:03.240 --> 00:26:05.359
+to filter out the unnecessary cruft
+
+00:26:05.360 --> 00:26:07.559
+in order to automatically interpret
+
+00:26:07.560 --> 00:26:09.559
+the part of what is being said
+
+00:26:09.560 --> 00:26:11.799
+that is actually relevant.
+
+00:26:11.800 --> 00:26:14.639
+Over time, language researchers
+
+00:26:14.640 --> 00:26:17.719
+have created many interdependent layers of annotations,
+
+00:26:17.720 --> 00:26:21.039
+yet the assumptions underlying them are seldom the same.
+
+00:26:21.040 --> 00:26:25.039
+Piecing together such related but disjointed annotations
+
+00:26:25.040 --> 00:26:28.039
+on their predictions poses a huge challenge.
+
+00:26:28.040 --> 00:26:30.719
+This is another place where we can leverage
+
+00:26:30.720 --> 00:26:33.119
+the data model underlying the Emacs editor,
+
+00:26:33.120 --> 00:26:35.359
+along with the structural editing capabilities
+
+00:26:35.360 --> 00:26:38.519
+of Org mode to improve current tools.
+
+00:26:38.520 --> 00:26:42.839
+Let's take this very simple looking utterance.
+
+00:26:42.840 --> 00:26:48.039
+"Um \{lipsmack\} and that's it. (\{laugh\})"
+
+00:26:48.040 --> 00:26:50.319
+Looks like the person-- so this is--
+
+00:26:50.320 --> 00:26:54.519
+what you are seeing here is a transcript of an audio signal
+
+00:26:54.520 --> 00:27:00.759
+that has a lip smack and a laugh as part of it,
+
+00:27:00.760 --> 00:27:04.199
+and there is also a "Um" like interjection.
+
+00:27:04.200 --> 00:27:08.199
+So this has a few interesting noises
+
+00:27:08.200 --> 00:27:13.999
+and specific things that would be illustrative
+
+00:27:14.000 --> 00:27:20.479
+of what we are going to, how we are going to represent it.
+
+NOTE Syntactic analysis
+
+00:27:20.480 --> 00:27:25.839
+Okay. So let's say you want to have
+
+00:27:25.840 --> 00:27:28.879
+a syntactic analysis of this sentence or utterance.
+
+00:27:28.880 --> 00:27:30.959
+One common technique people use
+
+00:27:30.960 --> 00:27:32.879
+is just to remove the cruft, and, you know,
+
+00:27:32.880 --> 00:27:35.079
+write some rules, clean up the utterance,
+
+00:27:35.080 --> 00:27:36.719
+make it look like it's proper English,
+
+00:27:36.720 --> 00:27:40.239
+and then, you know, tokenize it,
+
+00:27:40.240 --> 00:27:43.079
+and basically just use standard tools to process it.
+
+00:27:43.080 --> 00:27:47.279
+But in that process, they end up eliminating
+
+00:27:47.280 --> 00:27:51.119
+valid pieces of signal that have meaning to others
+
+00:27:51.120 --> 00:27:52.799
+studying different phenomena of language.
+
+00:27:52.800 --> 00:27:56.479
+Here you have the rich transcript,
+
+00:27:56.480 --> 00:28:00.119
+the input to the syntactic parser.
+
+00:28:00.120 --> 00:28:05.919
+As you can see, there is a little tokenization happening
+
+00:28:05.920 --> 00:28:07.199
+where you'll be inserting space
+
+00:28:07.200 --> 00:28:12.119
+between "that" and the contracted is ('s),
+
+00:28:12.120 --> 00:28:15.599
+and between the period and the "it,"
+
+00:28:15.600 --> 00:28:18.199
+and the output of the syntactic parser is shown below.
+
+00:28:18.200 --> 00:28:21.639
+which (surprise) is a S-expression.
+
+00:28:21.640 --> 00:28:24.919
+Like I said, the parse trees, when they were created,
+
+00:28:24.920 --> 00:28:29.799
+and still largely when they are used, are S-expressions,
+
+00:28:29.800 --> 00:28:32.999
+and most of the viewers here
+
+00:28:33.000 --> 00:28:35.119
+should not have much problem reading it.
+
+00:28:35.120 --> 00:28:37.279
+You can see this tree structure
+
+00:28:37.280 --> 00:28:39.279
+of this syntactic parser here.
+
+NOTE Forced alignment
+
+00:28:39.280 --> 00:28:40.919
+Now let's say you want to integrate
+
+00:28:40.920 --> 00:28:44.479
+phonetic information or phonetic layer
+
+00:28:44.480 --> 00:28:49.119
+that's in the audio signal, and do some analysis.
+
+00:28:49.120 --> 00:28:57.519
+Now, it would need you to do a few-- take a few steps.
+
+00:28:57.520 --> 00:29:01.679
+First, you would need to align the transcript
+
+00:29:01.680 --> 00:29:06.479
+with the audio. This process is called forced alignment,
+
+00:29:06.480 --> 00:29:10.399
+where you already know what the transcript is,
+
+00:29:10.400 --> 00:29:14.599
+and you have the audio, and you can get a good alignment
+
+00:29:14.600 --> 00:29:17.599
+using both pieces of information.
+
+00:29:17.600 --> 00:29:20.119
+And this is typically a technique that is used to
+
+00:29:20.120 --> 00:29:23.079
+create training data for training
+
+00:29:23.080 --> 00:29:25.839
+automatic speech recognizers.
+
+00:29:25.840 --> 00:29:29.639
+One interesting thing is that in order to do
+
+00:29:29.640 --> 00:29:32.879
+this forced alignment, you have to keep
+
+00:29:32.880 --> 00:29:35.799
+the non-speech events in transcript,
+
+00:29:35.800 --> 00:29:39.079
+because they consume some audio signal,
+
+00:29:39.080 --> 00:29:41.399
+and if you don't have that signal,
+
+00:29:41.400 --> 00:29:44.399
+the alignment process doesn't know exactly...
+
+00:29:44.400 --> 00:29:45.759
+you know, it doesn't do a good job,
+
+00:29:45.760 --> 00:29:50.039
+because it needs to align all parts of the signal
+
+00:29:50.040 --> 00:29:54.999
+with something, either pause or silence or noise or words.
+
+00:29:55.000 --> 00:29:59.719
+Interestingly, punctuations really don't factor in,
+
+00:29:59.720 --> 00:30:01.559
+because we don't speak in punctuations.
+
+00:30:01.560 --> 00:30:04.239
+So one of the things that you need to do
+
+00:30:04.240 --> 00:30:05.679
+is remove most of the punctuations,
+
+00:30:05.680 --> 00:30:08.039
+although you'll see there are some punctuations
+
+00:30:08.040 --> 00:30:12.599
+that can be kept, or that are to be kept.
+
+NOTE Alignment before tokenization
+
+00:30:12.600 --> 00:30:15.319
+And the other thing is that the alignment has to be done
+
+00:30:15.320 --> 00:30:20.159
+before tokenization, as it impacts pronunciation.
+
+00:30:20.160 --> 00:30:24.399
+To show an example: Here you see "that's".
+
+00:30:24.400 --> 00:30:26.919
+When it's one word,
+
+00:30:26.920 --> 00:30:31.959
+it has a slightly different pronunciation
+
+00:30:31.960 --> 00:30:35.679
+than when it is two words, which is "that is",
+
+00:30:35.680 --> 00:30:38.399
+like you can see "is." And so,
+
+00:30:38.400 --> 00:30:44.279
+if you split the tokens or split the words
+
+00:30:44.280 --> 00:30:48.119
+in order for syntactic parser to process it,
+
+00:30:48.120 --> 00:30:51.599
+you would end up getting the wrong phonetic analysis.
+
+00:30:51.600 --> 00:30:54.239
+And if you have--if you process it
+
+00:30:54.240 --> 00:30:55.319
+through the phonetic analysis,
+
+00:30:55.320 --> 00:30:59.159
+and you don't know how to integrate it
+
+00:30:59.160 --> 00:31:02.719
+with the tokenized syntax, you can, you know,
+
+00:31:02.720 --> 00:31:07.519
+that can be pretty tricky. And a lot of time,
+
+00:31:07.520 --> 00:31:10.759
+people write one-off pieces of code that handle these,
+
+00:31:10.760 --> 00:31:14.279
+but the idea here is to try to have a general architecture
+
+00:31:14.280 --> 00:31:17.239
+that seamlessly integrates all these pieces.
+
+00:31:17.240 --> 00:31:21.319
+Then you do the syntactic parsing of the remaining tokens.
+
+00:31:21.320 --> 00:31:24.799
+Then you align the data and the two annotations,
+
+00:31:24.800 --> 00:31:27.959
+and then integrate the two layers.
+
+00:31:27.960 --> 00:31:31.359
+Once that is done, then you can do all kinds of
+
+00:31:31.360 --> 00:31:33.919
+interesting analysis, and test various hypotheses
+
+00:31:33.920 --> 00:31:35.279
+and generate the statistics,
+
+00:31:35.280 --> 00:31:39.359
+but without that you only are dealing
+
+00:31:39.360 --> 00:31:42.879
+with one or the other part.
+
+NOTE Layers
+
+00:31:42.880 --> 00:31:48.319
+Let's just take a quick look at how each of the layers
+
+00:31:48.320 --> 00:31:51.159
+that are involved look like.
+
+00:31:51.160 --> 00:31:56.719
+So this is "Um \{lipsmack\}, and that's it. \{laugh\}"
+
+00:31:56.720 --> 00:32:00.159
+This is the transcript, and on the right hand side,
+
+00:32:00.160 --> 00:32:04.199
+you see the same thing as a transcript
+
+00:32:04.200 --> 00:32:06.239
+listed in a vertical in a column.
+
+00:32:06.240 --> 00:32:08.199
+You'll see why, in just a second.
+
+00:32:08.200 --> 00:32:09.879
+And there are some place--
+
+00:32:09.880 --> 00:32:11.279
+there are some rows that are empty,
+
+00:32:11.280 --> 00:32:15.079
+some rows that are wider than the others, and we'll see why.
+
+00:32:15.080 --> 00:32:19.319
+The next is the tokenized sentence
+
+00:32:19.320 --> 00:32:20.959
+where you have space added,
+
+00:32:20.960 --> 00:32:23.599
+you know space between these two tokens:
+
+00:32:23.600 --> 00:32:26.599
+"that" and the apostrophe "s" ('s),
+
+00:32:26.600 --> 00:32:28.079
+and the "it" and the "period".
+
+00:32:28.080 --> 00:32:30.679
+And you see on the right hand side
+
+00:32:30.680 --> 00:32:33.559
+that the tokens have attributes.
+
+00:32:33.560 --> 00:32:36.439
+So there is a token index, and there are 1, 2,
+
+00:32:36.440 --> 00:32:38.839
+you know 0, 1, 2, 3, 4, 5 tokens,
+
+00:32:38.840 --> 00:32:41.479
+and each token has a start and end character,
+
+00:32:41.480 --> 00:32:45.799
+and space (sp) also has a start and end character,
+
+00:32:45.800 --> 00:32:50.399
+and space is represented by a "sp". And there are
+
+00:32:50.400 --> 00:32:54.319
+these other things that we removed,
+
+00:32:54.320 --> 00:32:56.239
+like the "\{LS\}" which is for "\{lipsmack\}"
+
+00:32:56.240 --> 00:32:59.399
+and "\{LG\}" which is "\{laugh\}" are showing grayed out,
+
+00:32:59.400 --> 00:33:02.439
+and you'll see why some of these things are grayed out
+
+00:33:02.440 --> 00:33:03.399
+in a little bit.
+
+00:33:03.400 --> 00:33:11.919
+This is what the forced alignment tool produces.
+
+00:33:11.920 --> 00:33:17.159
+Basically, it takes the transcript,
+
+00:33:17.160 --> 00:33:19.159
+and this is the transcript
+
+00:33:19.160 --> 00:33:24.119
+that has slightly different symbols,
+
+00:33:24.120 --> 00:33:26.239
+because different tools use different symbols
+
+00:33:26.240 --> 00:33:28.159
+and their various configurational things.
+
+00:33:28.160 --> 00:33:33.679
+But this is what is used to get an alignment
+
+00:33:33.680 --> 00:33:36.039
+or time alignment with phones.
+
+00:33:36.040 --> 00:33:40.079
+So this column shows the phones, and so each word...
+
+00:33:40.080 --> 00:33:43.879
+So, for example, "and" has been aligned with these phones,
+
+00:33:43.880 --> 00:33:46.879
+and these on the start and end
+
+00:33:46.880 --> 00:33:52.959
+are essentially temporal or time stamps that it aligned--
+
+00:33:52.960 --> 00:33:54.279
+that has been aligned to it.
+
+00:33:54.280 --> 00:34:00.759
+Interestingly, sometimes we don't really have any pause
+
+00:34:00.760 --> 00:34:05.159
+or any time duration between some words
+
+00:34:05.160 --> 00:34:08.199
+and those are highlighted as gray here.
+
+00:34:08.200 --> 00:34:12.759
+See, there's this space... Actually
+
+00:34:12.760 --> 00:34:17.799
+it does not have any temporal content,
+
+00:34:17.800 --> 00:34:21.319
+whereas this other space has some duration.
+
+00:34:21.320 --> 00:34:24.839
+So the ones that have some duration are captured,
+
+00:34:24.840 --> 00:34:29.519
+while the others are the ones that in the earlier diagram
+
+00:34:29.520 --> 00:34:31.319
+we saw were left out.
+
+NOTE Variations
+
+00:34:31.320 --> 00:34:37.639
+And the aligner actually produces multiple files.
+
+00:34:37.640 --> 00:34:44.399
+One of the files has a different, slightly different
+
+00:34:44.400 --> 00:34:46.679
+variation on the same information,
+
+00:34:46.680 --> 00:34:49.999
+and in this case, you can see
+
+00:34:50.000 --> 00:34:52.399
+that the punctuation is missing,
+
+00:34:52.400 --> 00:34:57.599
+and the punctuation is, you know, deliberately missing,
+
+00:34:57.600 --> 00:35:02.279
+because there is no time associated with it,
+
+00:35:02.280 --> 00:35:06.439
+and you see that it's not the tokenized sentence--
+
+00:35:06.440 --> 00:35:17.119
+a tokenized word. This... Now it gives you a full table,
+
+00:35:17.120 --> 00:35:21.239
+and you can't really look into it very carefully.
+
+00:35:21.240 --> 00:35:25.879
+But we can focus on the part that seems legible,
+
+00:35:25.880 --> 00:35:28.559
+or, you know, properly written sentence,
+
+00:35:28.560 --> 00:35:32.879
+process it and reincorporate it back into the whole.
+
+00:35:32.880 --> 00:35:35.879
+So if somebody wants to look at, for example,
+
+00:35:35.880 --> 00:35:39.679
+how many pauses the person made while they were talking,
+
+00:35:39.680 --> 00:35:42.919
+And they can actually measure the pause, the number,
+
+00:35:42.920 --> 00:35:46.279
+the duration, and make connections between that
+
+00:35:46.280 --> 00:35:49.639
+and the rich syntactic structure that is being produced.
+
+00:35:49.640 --> 00:35:57.279
+And in order to do that, you have to get these layers
+
+00:35:57.280 --> 00:35:59.039
+to align with each other,
+
+00:35:59.040 --> 00:36:04.359
+and this table is just a tabular representation
+
+00:36:04.360 --> 00:36:08.679
+of the information that we'll be storing in the YAMR file.
+
+00:36:08.680 --> 00:36:11.719
+Congratulations! You have reached
+
+00:36:11.720 --> 00:36:13.479
+the end of this demonstration.
+
+00:36:13.480 --> 00:36:17.000
+Thank you for your time and attention.
diff --git a/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.vtt b/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.vtt
new file mode 100644
index 00000000..b100ee27
--- /dev/null
+++ b/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.vtt
@@ -0,0 +1,815 @@
+WEBVTT
+
+00:00.000 --> 00:04.800
+say everyone can say hi to Sasha. Oh, we are recording now. Okay, great. But do say thanks
+
+00:04.800 --> 00:10.160
+to Sasha for being everywhere at once trying to make sure that the stream is working properly.
+
+00:10.160 --> 00:12.560
+She has the magic touch, yes, definitely.
+
+00:13.920 --> 00:18.640
+All right, Vala, sorry to do that. But now the floor is yours. You can take as many questions
+
+00:18.640 --> 00:22.720
+as you want. And I'll be making humorous comments when I'm not busy putting out fires in the
+
+00:22.720 --> 00:30.160
+background. Okay. All right. Thanks, folks. So thank you for the questions. I'll take one by one.
+
+00:30.160 --> 00:35.600
+How do you link the notes together so you could search through them in the future? Okay, this
+
+00:36.320 --> 00:44.560
+video I made before, or rather the experience that I shared with you was before I got into
+
+00:44.560 --> 00:51.600
+linking of notes and how to make sense of it. I'm still I mean, I'm thankful for guys like Leo for
+
+00:51.600 --> 00:59.120
+putting our room together. However, yes, you can take a bow. However, I'm still in the infancy of
+
+00:59.120 --> 01:07.200
+trying to link these topics. So the suggestion I have is once you convert your handwritten text
+
+01:07.200 --> 01:15.520
+into text, so handwritten stuff from your notebook into text, or if you write it, if you have a
+
+01:15.520 --> 01:24.640
+writing device, and you can convert it into text, input it into org rom and link it the way you
+
+01:24.640 --> 01:34.000
+would do it. So I have not yet gone into it. But having said that, I've started doing it like a
+
+01:34.000 --> 01:39.840
+week ago, I started linking these handwritten notes, which are converted into text, and then
+
+01:39.840 --> 01:47.760
+can be linked to any other note that you want. So that's that would be my response to the linking
+
+01:47.760 --> 01:54.640
+part. So which actually leads to the next question, is it necessary to OCR your handwriting?
+
+01:55.760 --> 02:00.720
+This is a necessary step, you have to do optical character recognition, as in convert all the
+
+02:00.720 --> 02:10.640
+handwritten stuff into text, because otherwise, indexing and linking becomes a problem later on.
+
+02:10.640 --> 02:16.240
+If it's only you going through the handwritten notes, so that you browse it and read it when
+
+02:16.240 --> 02:23.760
+you want it, that's okay. So you don't have to worry about OCR, just input the JPEG, the PNG,
+
+02:23.760 --> 02:31.600
+or whatever file you use, format you use, input it into under the org mode headline, or the org
+
+02:31.600 --> 02:40.720
+rom file, and you should be good to go. However, if you want the other stuff, then OCR becomes a
+
+02:40.720 --> 02:50.960
+necessity. So I'm unfamiliar with any package that does the OCR conversion inside of the Emacs
+
+02:50.960 --> 03:02.880
+ecosystem. So I use tools like OneNote, or I think Google Keep does that. I don't know of any other
+
+03:02.880 --> 03:10.240
+free slash open source tools which do that. I'm not familiar, but I use an external tool to convert
+
+03:10.240 --> 03:16.800
+handwritten text into notes, if you want the link again, read rating, if you want the linking and
+
+03:16.800 --> 03:24.560
+the indexing. If not, for me, sometimes screenshots and handwritten notes have to go together,
+
+03:24.560 --> 03:31.360
+so that I can find out, okay, this team or this student was talking about his project,
+
+03:31.360 --> 03:36.880
+or her project, and this is the screenshot of their presentation, and I write down my notes,
+
+03:36.880 --> 03:44.560
+and it goes along with that. That was for me a key to have that together, and not just hand
+
+03:44.560 --> 03:49.600
+typewritten notes, because I have no recollection later on, but handwritten notes I seem to recall
+
+03:49.600 --> 03:54.160
+better, and that's the whole idea of how to integrate. I was breaking my head over it.
+
+03:55.200 --> 04:01.840
+So those are the two responses to those two questions. What about searching notes? Notes
+
+04:01.840 --> 04:09.360
+to text while being offline? Oh my god, this is a related one as well. So yes, it is going to be
+
+04:09.360 --> 04:15.520
+searching has to be linked. If you want the searching facility, it has to be converted text.
+
+04:15.520 --> 04:22.320
+There are no two ways to that right now. Proprietary software like Google Keep seems to
+
+04:22.320 --> 04:31.120
+manage it. I think others, OneNote also, Dropbox also says that they can do it. I haven't tried it
+
+04:31.120 --> 04:37.600
+there, searching it inside these systems to look for handwritten text, because I don't use that for
+
+04:37.600 --> 04:44.160
+managing my projects or making sense of what I've written down. So when it comes to
+
+04:44.160 --> 04:53.200
+doing all those tasks, I use Org Mode. So I would say you absolutely mandatory for us to convert
+
+04:53.200 --> 05:00.160
+this, unless I've made that appeal at the end of my talk, saying if Org Mode, Emacs, Org Mode
+
+05:00.160 --> 05:06.080
+community can put their brains together. I don't know if I can help, but if you want me for
+
+05:06.080 --> 05:12.640
+testing your package, I certainly put my hands up for this for sure. I can do that. I'm keen on
+
+05:12.640 --> 05:21.680
+trying that out. I hope that answered the third question. These articles on, those articles are
+
+05:21.680 --> 05:28.960
+not taking seems interesting. Could you get a link for them? I'll definitely drop it in the Etherpad
+
+05:28.960 --> 05:38.800
+after this recording is done for sure. I will leave it there. It is my good friend in France
+
+05:38.800 --> 05:44.320
+who shared that with me saying when he saw the title of my talk, he sent me a whole bunch of
+
+05:44.320 --> 05:50.000
+articles saying, hey, this seems to support what you told me. And I have sort of shown you the
+
+05:50.000 --> 06:00.080
+screenshots in the video, but I'll definitely leave some of these links in the Etherpad after this.
+
+06:00.080 --> 06:05.360
+Oh yeah, I've used, the next question is, have you looked at taking handwritten notes on a tablet
+
+06:05.360 --> 06:13.920
+like, I don't know how to say that, journal with an X plus plus? So yes, I have started using it
+
+06:13.920 --> 06:22.560
+again. The only tools I used were OneNote and Google Keep because those were the only ones
+
+06:22.560 --> 06:30.080
+which would allow for writing using my stylus. I'm sure there are other apps which can do it,
+
+06:30.080 --> 06:35.600
+but do they convert it into text and how easy is it to input it into org mode is something that,
+
+06:35.600 --> 06:44.000
+so for now, the Dropbox method for me was I write notes, I take a mobile camera, take a picture,
+
+06:44.000 --> 06:51.440
+upload it to Dropbox. Why Dropbox? Because it allows JPEG to be uploaded. Whereas PDF,
+
+06:51.440 --> 07:00.080
+I find it very cumbersome from handwriting to get it in here. So JPEG, I can input it into
+
+07:00.080 --> 07:06.320
+org mode, I'm sorry, OneNote and that converts it into text and then I take it and put it into,
+
+07:07.200 --> 07:15.840
+the inbox has the image as well as the converted text. So I put it into my system,
+
+07:15.840 --> 07:22.240
+the org mode system. So that's how my workflow really is. I don't know if I answered that
+
+07:22.240 --> 07:30.720
+question very well. I've used X journal, but not a whole lot to give you intelligent advice.
+
+07:32.160 --> 07:36.560
+Have you tried out remarkable device to take handwritten notes as well? I haven't figured out
+
+07:36.560 --> 07:43.280
+how to link the files back into org mode in a constructive way yet. Okay, so yes, I've heard
+
+07:43.280 --> 07:50.160
+of remarkable devices. There's another one called Books, if I'm not wrong, and Amazon has also come
+
+07:50.160 --> 07:58.240
+up with a writing, I call it the writing Kindle. I don't know what it's called, a smarter name for
+
+07:58.240 --> 08:08.720
+that. So these devices do exist, but I'm not sure if they convert it into text and if they can put
+
+08:08.720 --> 08:15.760
+it in a repository, which is accessible on your computer, where you can import it into org mode.
+
+08:15.760 --> 08:24.560
+I'm not so sure about those things. So linking that would be nice if you can have access to
+
+08:24.560 --> 08:31.600
+where your Emacs org mode ecosystem is. For me, Dropbox works very well because it's on my mobile
+
+08:31.600 --> 08:38.480
+phone, smartphone, as well as on my computer. So the linking happens and I can just push it all
+
+08:38.480 --> 08:46.160
+into my org mode inbox and process them and refile the notes or do all the good stuff linking. If I
+
+08:46.160 --> 08:52.000
+have the text, I can link them, do all that I can. I can certainly do that. So that's my answer to
+
+08:52.880 --> 09:00.000
+the... where did it go? Remarkable stuff. That question is gone. I don't know. Okay, anyway,
+
+09:00.000 --> 09:03.200
+so that was... Yeah, I don't see it either anymore. It's disappeared, but thank you for
+
+09:03.200 --> 09:12.080
+taking the time to answer it. Okay. So next one. How are we on time, Leo? I can talk all day.
+
+09:13.360 --> 09:17.360
+You are completely good on time. Don't worry. We have until 45 at the current hour
+
+09:17.920 --> 09:22.480
+until we need to move on to the next box. It's very roomy. Take your time answering as many
+
+09:22.480 --> 09:27.520
+questions as you want. Okay. All right. So I won't have either. All right. Something to think about
+
+09:27.520 --> 09:33.440
+is handwritten and org transcribed notes, deduplication for searching. Do you want one or
+
+09:33.440 --> 09:39.360
+the other? Oh, okay. So this is wishlist. Oh, thank you so much for asking this question. Transcription
+
+09:39.360 --> 09:45.840
+for me has become important, not only handwritten, but also voice notes. So this is another thing
+
+09:45.840 --> 09:53.440
+that I've been... I have a couple of podcasts where I want a summary of my important points
+
+09:53.440 --> 10:01.760
+and I can grab the voice clips, but transcribing it, in spite of so many tools out there,
+
+10:01.760 --> 10:06.880
+I find it very difficult to transcribe them automatically. I can make the error corrections
+
+10:06.880 --> 10:13.680
+later on, but I find it extremely cumbersome to transcribe voice notes. So it would be nice
+
+10:13.680 --> 10:21.760
+if we can have voice transcription, one. Handwritten transcription also helps for sure.
+
+10:21.760 --> 10:29.360
+If it can be done, then it makes it... Actually, that's a great idea. Transcription. I wasn't
+
+10:29.360 --> 10:36.400
+thinking of inside. I was thinking of basically taking the notes and somehow linking it within
+
+10:36.400 --> 10:43.600
+the handwritten stuff itself. Maybe my limitation imagination, but transcription is definitely
+
+10:43.600 --> 10:51.200
+something that I would be very interested in. Voice as well as handwriting. I've seen it in
+
+10:51.200 --> 10:57.200
+some other software. I think it was OneNote where I saw that you can record yourself vocally and
+
+10:58.000 --> 11:03.360
+also there is a transcribe for paid packages. They have transcription as well. And then you
+
+11:03.360 --> 11:10.880
+could link text from there on. So if we can do it in our R mode system, nothing like that. I keep
+
+11:10.880 --> 11:21.920
+seeing it and notes keep coming up there. I keep writing it on my Wacom device or my remarkable
+
+11:21.920 --> 11:28.880
+device and it goes into my R mode as I write and as I speak. Unbelievable. This is important. This
+
+11:28.880 --> 11:35.120
+is really important. Thanks for the great idea. I hope this... Again, I volunteer myself to test
+
+11:35.120 --> 11:43.120
+this out as well. I have tons of... At least this year, I have produced 300 minutes of podcast
+
+11:43.120 --> 11:52.720
+content and I find it extremely cumbersome to transcribe it easily. So if this can do it for us,
+
+11:52.720 --> 12:01.280
+at least even a minute or two of the text, nothing like it. That's amazing. The last question I see
+
+12:01.280 --> 12:08.080
+is how often do you instead type in and summarize your notes? Would you consider that a suitable
+
+12:08.080 --> 12:17.120
+approach for yourself at the end of the day? That's a good idea of typing notes. When I'm in
+
+12:17.120 --> 12:26.400
+a hurry, I type. So when I'm in a tearing hurry or my notes is just lying somewhere and there's
+
+12:26.400 --> 12:32.400
+a meeting going on, I don't want to get up and go get my notes, I immediately go to my R mode and
+
+12:32.400 --> 12:39.680
+start typing there. So that's what I do. At the end of the day, I don't have that habit at all.
+
+12:39.680 --> 12:44.480
+I promised myself that I should do daily journaling and all that because it's... Everybody
+
+12:44.480 --> 12:50.240
+says it's a good habit. I've done it a few times and I found it to be good, but it's not a habit
+
+12:50.240 --> 13:00.400
+I'm yet on. So I mean, I also have a shortcut, a keyboard shortcut for the org-grown dailies.
+
+13:01.360 --> 13:05.440
+I do have that and it shows up on the calendar, the blue color. I love those features,
+
+13:05.440 --> 13:11.520
+but I'm not on it. I should make it a habit. As much as I look at my org agenda,
+
+13:11.520 --> 13:21.280
+you should have dailies as well. I type out when I'm in a hurry. Perhaps even writing
+
+13:22.240 --> 13:30.720
+your daily journal could be helpful. Particularly, I find that I'm comfortable typing English
+
+13:30.720 --> 13:40.080
+letters. If non-English, for example, my mother tongue has a different script, which I can't
+
+13:40.080 --> 13:46.560
+easily type using English. So perhaps writing is easier there for me rather than typing it out.
+
+13:46.560 --> 13:56.000
+It feels very weird. So perhaps that could help for non-English, non-Roman script. Perhaps
+
+13:56.000 --> 13:59.840
+writing is better for journaling as well. I guess that could help.
+
+14:02.320 --> 14:07.040
+Okay, Bala, if I can interrupt you for a second because don't worry, I'm not stopping you with
+
+14:07.040 --> 14:12.000
+the questions. I told you you have until 45 and I will honor what I said before. But I just wanted
+
+14:12.000 --> 14:17.440
+to let people know that we have opened up the BBB chat room. So if people want to join the room now
+
+14:17.440 --> 14:21.440
+and ask questions directly to Bala, who has already answered many of your questions on the
+
+14:21.440 --> 14:27.520
+pad, but if you have more questions or if you'd just like to chat with Bala, well, do feel free to
+
+14:28.320 --> 14:34.240
+join the room. The link has been pasted on the ISE channels. It's also available on the talk page at
+
+14:34.240 --> 14:39.040
+the top. So you should be able to find the link pretty easily. And even if we move to the next
+
+14:39.040 --> 14:42.960
+talk, if you're still there and still want to chat with Bala, provided Bala is available and does not
+
+14:42.960 --> 14:48.400
+need to sleep, by the way, with respect to the fact that it's really late over there, do feel free to
+
+14:48.400 --> 14:53.200
+hang around a little more and ask more questions and we'll be posting all of this on the website
+
+14:53.200 --> 14:58.000
+afterwards. So Bala, I think, do you have one more question on the pad or was it the last one?
+
+14:58.000 --> 15:04.080
+Let me check. I think that was the last one. Oh, there is a new question coming up just before that.
+
+15:04.800 --> 15:11.280
+Do take it then. Sure. I was going to say something of an experience I wanted to share,
+
+15:11.280 --> 15:18.720
+but anyway, I can answer this. How fancy has your handwritten notes import been?
+
+15:18.720 --> 15:28.800
+Okay, I'm going to wait for this. I'm not sure if we're talking about importing the notes into,
+
+15:28.800 --> 15:34.080
+like, is it merely importing the files or is it about importing it to your note-taking system,
+
+15:34.080 --> 15:42.720
+like, or whatnot? Okay, okay, okay. I get it. I get it. So I have a simple system for, yes,
+
+15:42.720 --> 15:50.240
+I absolutely agree with you. I mean, the birth of org-mode was that you wanted notes and you wanted
+
+15:50.240 --> 15:57.120
+tasks inside it, right? So that was the origin of that. So I think the same philosophy applies for
+
+15:57.120 --> 16:03.440
+handwritten notes as well because you're writing down notes and somebody says, hey Bala, can you
+
+16:03.440 --> 16:10.560
+send me this document by next Wednesday? And I write that down in my notes and then I send it
+
+16:10.560 --> 16:18.000
+and I write that down in my notes and that's a task. So I just put a star next to it. So I know
+
+16:18.000 --> 16:25.600
+when I am scanning, I don't think that shows up as a, I don't think star shows up as anything in my
+
+16:26.240 --> 16:34.320
+import, but I know when I'm scanning it that I need to keep track of that as a task. So in the
+
+16:34.320 --> 16:44.880
+talk about it is in OneNote, control-1 is the shortcut for ToDo and if it is converted into
+
+16:44.880 --> 16:54.720
+text, yes, of course, alt-enter in org-mode will work as well. So yes, so I think that is important
+
+16:54.720 --> 17:01.040
+even, so that's the only thing that I do is an asterisk or a star just before the note so that
+
+17:01.040 --> 17:09.360
+it tells me that it is a task that I have to keep track of. I even put a date so that the
+
+17:09.360 --> 17:18.160
+numbers also get imported into org-mode. But my wish list, this has gotten me into me wishing is
+
+17:18.880 --> 17:25.600
+if the handwriting notes, I mean the gadget, the device, the remarkable or the Amazon
+
+17:25.600 --> 17:34.160
+writing pads of the world, if we can actually write down notes with a star, an asterisk,
+
+17:34.160 --> 17:40.320
+and the headline and scheduled and all that and import it directly into org-mode, I think
+
+17:40.320 --> 17:47.840
+that's doing away with a whole bunch of in-between scanning, uploading, processing, and all that. This
+
+17:47.840 --> 17:54.000
+can go directly, you can start refiling into your system. So that would be nice. So somebody
+
+17:54.000 --> 18:01.520
+is asking me for a wish list, here's one more too, if we can do that. So that makes basically
+
+18:01.520 --> 18:08.960
+a writing org-mode rather than like as if it's a language, like a human language, rather than it
+
+18:08.960 --> 18:14.080
+being something restricted to a computer. So that's interesting. That's an interesting thought.
+
+18:15.440 --> 18:22.480
+Just to glorify handwriting, I don't know if it has anything to do with the questions. A few days
+
+18:22.480 --> 18:30.400
+ago, a client of mine asked me for a talk and I was going to give them the plain vanilla talk,
+
+18:31.280 --> 18:38.880
+but I decided to pause myself and write down what I was going to talk about. Actually that gave
+
+18:38.880 --> 18:48.080
+rise to a completely different idea and the whole thing was far more effective compared to what was
+
+18:48.080 --> 18:57.280
+my plain vanilla. According to me, that handwritten ideation that I did with a white space really
+
+18:57.280 --> 19:05.600
+helped me think beyond what was my plain vanilla talk. Of course, the talk went well, I think,
+
+19:06.160 --> 19:12.640
+and the audience did have fun because I even jotted down a few things that I wanted to crack
+
+19:12.640 --> 19:19.120
+jokes on. All that went into my notes. So I think handwriting is sort of under-marketed,
+
+19:19.120 --> 19:25.680
+underplayed so much with the advent of typing and these things becoming so efficient and easy
+
+19:25.680 --> 19:32.000
+that I think that all your ideas, if they come together, I think handwritten notes will become
+
+19:33.200 --> 19:40.160
+part and parcel of the org-mode system itself and an effective and efficient way of capturing our
+
+19:40.160 --> 19:49.280
+thoughts. All right, Bala. So I think you don't have any more questions currently. I don't see
+
+19:49.280 --> 19:53.040
+anyone with a microphone on. So by the way, if you're joining us on BBB and if you want to ask
+
+19:53.040 --> 19:57.120
+your questions, you do have to join with a microphone. It is interesting for you to join
+
+19:57.120 --> 20:02.960
+listening only, but if everyone does this and nobody turns on the microphone, it's going to be
+
+20:02.960 --> 20:07.200
+very lonely for Bala and myself. I can ask questions for you. I have plenty of questions
+
+20:07.200 --> 20:11.680
+that I'd love to ask. I did get my own tablet. Oh, actually, let me show the stream. Let me...
+
+20:11.680 --> 20:17.200
+Oops. Can I un-full screen this? Yes. Okay. Let me try to make the screen a little bigger so that
+
+20:17.200 --> 20:21.680
+you can see me. Okay. I was going to talk to you about, if we have a little more time, because I do
+
+20:21.680 --> 20:26.800
+have a tablet like this, which allows me to do handwritten notes. This is... Don't worry too much.
+
+20:26.800 --> 20:32.720
+This is a lead code exit slide that I was solving. And this is Yink, which allows me to type my
+
+20:32.720 --> 20:38.640
+stuff. And I bought this about two years ago. And I've really been struggling to find ways to...
+
+20:40.080 --> 20:44.720
+How do I work both in the Emacs and how do I work with my NVDA notes, which is why I was really
+
+20:44.720 --> 20:49.840
+interested with your talk, because honestly, right now, those are two completely separate
+
+20:49.840 --> 20:54.800
+collections of notes. What is in my machine, this device right there, is its own thing.
+
+20:56.080 --> 21:01.760
+It has its own quality. Do I do my journaling in it? I do my journaling, maybe. I also do my lead
+
+21:01.760 --> 21:09.040
+code exercise. But that's about it. And I wish it were easy for me to connect the dots between
+
+21:09.040 --> 21:14.400
+what I've got on this device and what I've got on my computer right in front of me. So I can talk
+
+21:14.400 --> 21:20.800
+some more about this, but people could also join and ask their own questions. I can talk to Bala
+
+21:20.800 --> 21:27.840
+whenever I want. I've been in touch with Bala for quite a while. And I'll be able to do this
+
+21:27.840 --> 21:32.640
+whenever. But this is your chance for you to do this, to have your question answered,
+
+21:32.640 --> 21:38.640
+and for the question to leave on EmacsConf forever and ever. All the talks for EmacsConf,
+
+21:38.640 --> 21:44.080
+all the questions since three years ago have been published. So it is your chance to,
+
+21:45.440 --> 21:50.160
+if you're not making a talk of your own, at least you have the questions of your own leaving on
+
+21:50.160 --> 21:59.920
+a website. So Bala, I believe you were a little interested with my little device. Do you actually
+
+21:59.920 --> 22:04.640
+have a device of your own that allows you to take notes like this? Or is it just written on paper?
+
+22:06.240 --> 22:14.800
+My computer is a touchscreen, so I can write. I have a stylus that I can use to write anywhere
+
+22:14.800 --> 22:22.080
+on the screen. So I take the laptop and actually fold it, and I can use it like a notebook. So this
+
+22:22.080 --> 22:29.840
+is my use case these days. So when I'm learning, I'm learning Japanese, by the way. And I tell you,
+
+22:30.480 --> 22:35.840
+there's no way I could have retained so much if I had not written Japanese out, the characters. So
+
+22:37.200 --> 22:44.400
+this is critical. Writing is critical. And their ideas, when they're externalized,
+
+22:44.400 --> 22:50.160
+you see it while you're writing it, there's a physical action, you feel the proximity to your
+
+22:50.800 --> 23:00.800
+ideas, what you're doing. So typing, yes, it is also physical. But for me, it's one step away from
+
+23:02.160 --> 23:07.760
+writing down. For me, that's going to make you laugh. I was also studying Japanese and I do have
+
+23:07.760 --> 23:14.800
+my own kanji that allows me to do my practice. So please don't look at it. If you're going to pause
+
+23:14.800 --> 23:18.640
+this video and check what I've written, you will be sorely disappointed because those are just
+
+23:18.640 --> 23:24.160
+collection of verbs. But this is how I practice my kanji as well. And it's been amazing. This is,
+
+23:25.040 --> 23:28.800
+you know, it is such a wonderful usage, because if you try learning kanji,
+
+23:28.800 --> 23:32.480
+just by seeing them and not putting them in your hand or embedding them in your hands,
+
+23:32.480 --> 23:38.400
+it's so complicated to do so. Oh, we have more things in common than I imagined. Okay.
+
+23:40.400 --> 23:45.760
+Yeah. So we happen to have someone in the room currently. Jack, I believe, is their nickname.
+
+23:46.480 --> 23:50.000
+Do you have a question? And do you want to maybe unmute yourself to ask the question?
+
+23:50.000 --> 23:53.520
+You are more than welcome to do so now. I might actually need to unmute you. Actually,
+
+23:53.520 --> 23:56.640
+I can't. Can you unmute yourself and ask the question if you want to?
+
+23:56.640 --> 24:06.640
+I'm just trying to get my headset set up. I'm having the similar struggle with this issue of
+
+24:06.640 --> 24:12.880
+handwriting my notes because that's the easiest way for me to write them quickly. It's also very,
+
+24:12.880 --> 24:20.880
+it does help me retain the information better. But then getting them back into org mode. I'm
+
+24:20.880 --> 24:26.480
+about to start experimenting with some of the iPad apps like Notability and GoodNotes to see
+
+24:26.480 --> 24:36.320
+if that can work or if I can use Apple Notes for that as well. My interests are probably similar
+
+24:36.320 --> 24:46.960
+to yours. I'm studying computer science, and I have two kinds of notes that are very difficult to
+
+24:46.960 --> 24:54.000
+transcribe. Mind maps, which is often the way I take class notes because it's a good outlining
+
+24:54.000 --> 25:04.960
+form. But the handwriting recognition blows if you're part of the expression. And equations,
+
+25:04.960 --> 25:16.000
+particularly involving proof steps for formal semantics. And I'm wondering if you have any ideas
+
+25:16.000 --> 25:22.720
+about mind mapping in particular and getting those incorporated from handwritten notes. I hate using
+
+25:22.720 --> 25:31.840
+the mind mapping tools that are available. I find that that replaces the bad methods that
+
+25:31.840 --> 25:42.240
+I use. It replaces the bad memory generation from typing with a bad memory generation for mind
+
+25:42.240 --> 25:53.440
+mapping. But if you have any thoughts, I'd love to hear them. Actually, I have used mind mapping
+
+25:53.440 --> 26:08.240
+tools. I use something called function maps, where you not only have interlinking relationships,
+
+26:08.240 --> 26:13.360
+this also has what is the relationship, what is the nature of relationships. All that I've been
+
+26:13.360 --> 26:23.760
+drawing it on my laptop screen. So that helps me internalize that. So I do not convert it into
+
+26:23.760 --> 26:31.920
+any other digital format. I leave it as a picture because every time I read it, but in the digital
+
+26:31.920 --> 26:40.160
+format itself, when you have new understanding, you can actually add another object and interlink
+
+26:40.160 --> 26:45.680
+them and add the relationship. So it's a lot easier if it's on this. But on a piece of paper,
+
+26:46.960 --> 26:55.040
+drawing a mind map and or function map and editing it and moving things around becomes a problem.
+
+26:55.040 --> 27:04.320
+So I find that doing it on a device and retaining it as such, not converting it into a free mind or
+
+27:04.320 --> 27:12.240
+any of those kind of XML or anything like that, doesn't help me at all, or a plan TML even. But
+
+27:12.240 --> 27:20.720
+I find that I leave it as such in the digital format. You can select it, like a lasso select,
+
+27:20.720 --> 27:27.440
+move it around and add new objects or remove it or shade it. You can do all those good stuff,
+
+27:27.440 --> 27:34.640
+if it is remaining in the same way. So I like it to be that way. Yeah, I've done that as well
+
+27:34.640 --> 27:44.560
+on the iPad. I'll use Nebo or something like that to give me a good way of rearranging the mind map
+
+27:45.600 --> 27:53.840
+directly in the iPad, exporting it as a JPEG and linking it to other notes documents that I have.
+
+27:53.840 --> 28:03.040
+But I do wish I had a better way of extracting the keywords that come out of it and having
+
+28:03.040 --> 28:09.840
+those searchable. But I get it. Okay, the answer is no, I don't have any. I usually link the live
+
+28:09.840 --> 28:17.840
+document itself into org mode. So for example, OneNote. OneNote colon and the entire... I just
+
+28:17.840 --> 28:22.640
+click on that and it goes, opens the exact document that I want and I can add more to it.
+
+28:22.640 --> 28:28.000
+I do something very simple.
+
+28:28.000 --> 28:33.200
+All right, folks, I'm really sorry for interrupting you, but we are getting close to time.
+
+28:33.200 --> 28:38.560
+Thank you so much for joining. We have four people on the scene right now, which is amazing.
+
+28:38.560 --> 28:45.440
+You can continue talking about this and people can still tune in. The link to the BBB room
+
+28:45.440 --> 28:50.640
+is still available on Bala's talk. You go to EmacsConf 2022, you go to the talk of Bala and
+
+28:50.640 --> 28:55.200
+you'll find the link at the top of the page. You can come in the room and chat with Bala some more.
+
+28:55.200 --> 28:58.960
+But for us on the stream, we're going to move on to the next talk in about 40 seconds.
+
+28:58.960 --> 29:02.400
+So Bala, thank you so much for taking all the time answering all the questions. And thank you,
+
+29:02.400 --> 29:08.240
+Gag, also for coming and asking also lovely questions. I suppose it was really good.
+
+29:08.960 --> 29:14.720
+Yeah, thank you. It was great seeing you. Sorry, I'm rushing because I'm being pressed for time.
+
+29:14.720 --> 29:21.360
+And I will see you both whenever I see you. OK, bye bye everyone.
+
+29:21.360 --> 29:23.280
+See you. Bye bye, Leo. Take care.
+
+29:28.000 --> 29:32.080
+Actually, I'm not sure. We are probably getting the next talk started currently,
+
+29:32.080 --> 29:36.000
+so you can probably still hear me on the stream, but it's going to take about
+
+29:36.000 --> 29:37.760
+three seconds. I'll see you after.
+
+29:37.760 --> 29:47.200
+OK, we are now off air. Thank you so much, Bala, for taking the time to answer all the questions.
+
+29:48.160 --> 29:49.120
+Thank you. Ciao.
+
+29:50.320 --> 29:54.800
+Yeah, I think no one is left in a BBB room, so I think people are probably not going to show up.
+
+29:54.800 --> 29:58.480
+So you've earned your well, your rest for tonight.
+
+29:59.920 --> 30:00.720
+OK, thanks.
+
+30:01.840 --> 30:05.040
+Mine will not come before a long time. I still have about seven hours to stream.
+
+30:05.040 --> 30:07.120
+Oh, my God. OK.
+
+30:09.360 --> 30:11.440
+All right. Well, thank you so much, Bala. See you next time.
+
+30:11.440 --> 30:14.400
+Thanks. Have a good day and I'll catch you soon. OK.
+
+30:14.960 --> 30:16.160
+Sure. Bye bye.
+
+30:16.160 --> 30:35.440
+Bye bye.
+
+30:46.960 --> 30:55.440
+Bye.
+
+30:55.440 --> 31:05.520
+Bye.
+
+31:05.520 --> 31:25.520
+Bye.
+
+31:35.520 --> 31:36.580
+Bye.
+
+32:05.520 --> 32:06.580
+Bye.
+
+32:35.520 --> 32:36.980
+Bye.
+
+33:05.520 --> 33:06.020
+Bye.
+
diff --git a/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main--chapters.vtt b/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main--chapters.vtt
new file mode 100644
index 00000000..aead066a
--- /dev/null
+++ b/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main--chapters.vtt
@@ -0,0 +1,31 @@
+WEBVTT
+
+00:00:02.200 --> 00:01:41.080
+Introduction
+
+01:41.080 --> 00:02:29.520
+Org Mode
+
+02:29.520 --> 00:03:40.033
+Handwriting
+
+00:03:42.167 --> 00:03:59.720
+Combining Org Mode and handwriting
+
+03:59.720 --> 00:04:14.420
+Step 1: Write the notes by hand
+
+04:14.420 --> 00:04:23.640
+Step 2: Scan them
+
+04:23.640 --> 00:04:42.300
+Step 3: Store the document
+
+04:42.300 --> 00:05:02.280
+(Optional) Step 4: Convert the notes
+
+05:02.280 --> 00:06:30.920
+Using touch devices
+
+06:30.920 --> 00:07:12.900
+Options
diff --git a/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.vtt b/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.vtt
new file mode 100644
index 00000000..c07421ef
--- /dev/null
+++ b/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.vtt
@@ -0,0 +1,323 @@
+WEBVTT captioned by jai
+
+00:00:00.000 --> 00:00:08.079
+Can you recognize this building?
+
+00:00:08.080 --> 00:00:09.799
+Some of you may have recognized this.
+
+00:00:09.800 --> 00:00:11.439
+This building is called
+
+00:00:11.440 --> 00:00:14.479
+the John Hancock building.
+
+00:00:14.480 --> 00:00:17.359
+This is in Chicago.
+
+00:00:17.360 --> 00:00:19.479
+I recently bought this building.
+
+00:00:19.480 --> 00:00:21.319
+Isn't it nice?
+
+00:00:21.320 --> 00:00:23.239
+Heavens no!
+
+00:00:23.240 --> 00:00:27.639
+I am in my home in Pune in India.
+
+00:00:27.640 --> 00:00:29.159
+I am Bala Ramadurai,
+
+00:00:29.160 --> 00:00:33.559
+an author, professor, and an innovation coach.
+
+00:00:33.560 --> 00:00:35.999
+Hello and welcome to my talk on
+
+00:00:36.000 --> 00:00:39.559
+“How to incorporate handwritten notes
+
+00:00:39.560 --> 00:00:42.279
+into Emacs Org Mode”
+
+00:00:42.280 --> 00:00:45.919
+Now, why did I show you this building?
+
+00:00:45.920 --> 00:00:49.399
+The name is of interest for this talk.
+
+00:00:49.400 --> 00:00:52.359
+In the US, someone's signature is
+
+00:00:52.360 --> 00:00:55.199
+also referred to as their Hancock.
+
+00:00:55.200 --> 00:00:59.679
+Your handwriting is pretty much part of your identity.
+
+00:00:59.680 --> 00:01:03.119
+It is as fundamental as that.
+
+00:01:03.120 --> 00:01:07.599
+Of course, there is a movie by that name too, Hancock.
+
+00:01:07.600 --> 00:01:11.999
+I could have started with a clip from that movie,
+
+00:01:12.000 --> 00:01:15.879
+but in spite of Will Smith and Charlize Theron,
+
+00:01:15.880 --> 00:01:24.159
+both my favorite movie stars in the movie, I hated it.
+
+00:01:24.160 --> 00:01:35.159
+[Clip from Hancock (2008)]
+
+00:01:35.160 --> 00:01:40.479
+But I digress.
+
+00:01:40.480 --> 00:01:44.199
+Handwriting has been a fascinating topic for me.
+
+00:01:44.200 --> 00:01:49.719
+However, note-taking has always been on my computer,
+
+00:01:49.720 --> 00:01:54.119
+in particular, in the Emacs Org Mode system.
+
+00:01:54.120 --> 00:01:57.359
+It is so easy to note down anything,
+
+00:01:57.360 --> 00:01:59.839
+add a schedule, add a deadline,
+
+00:01:59.840 --> 00:02:04.279
+search anything you want, link anything you want,
+
+00:02:04.280 --> 00:02:07.919
+export it to any format, track what you've been doing,
+
+00:02:07.920 --> 00:02:12.559
+clock your tasks, and on and on and on.
+
+00:02:12.560 --> 00:02:15.519
+It's such a squeaky-clean system to
+
+00:02:15.520 --> 00:02:17.559
+track everything and link it to
+
+00:02:17.560 --> 00:02:20.799
+anything from the digital world.
+
+00:02:20.800 --> 00:02:24.639
+Sharing the original notes is still a pain in the rear,
+
+00:02:24.640 --> 00:02:29.359
+but for personal stuff, it's awesome.
+
+00:02:29.360 --> 00:02:32.639
+But then what about handwriting?
+
+00:02:32.640 --> 00:02:35.639
+Research seems to suggest that handwritten notes
+
+00:02:35.640 --> 00:02:40.199
+can enhance clarity of thought, retention,
+
+00:02:40.200 --> 00:02:50.559
+sometimes even getting rid of your worries.
+
+00:02:50.560 --> 00:03:06.399
+[Fried, C. B. (2008). In-class laptop use and
+its effects on student learning]
+
+00:03:06.400 --> 00:03:13.639
+[Speaker displays articles on Note-taking]
+
+00:03:13.640 --> 00:03:17.839
+My experience seems to agree with that too.
+
+00:03:17.840 --> 00:03:21.199
+As a professor, my fear has always been
+
+00:03:21.200 --> 00:03:25.199
+this quote, “Lecturing is that mysterious process
+
+00:03:25.200 --> 00:03:29.239
+by means of which the contents of the notebook
+
+00:03:29.240 --> 00:03:31.879
+of the professor are transferred
+
+00:03:31.880 --> 00:03:34.919
+through the instrument of the fountain pen
+
+00:03:34.920 --> 00:03:37.279
+to the notebook of the student
+
+00:03:37.280 --> 00:03:40.639
+without passing through the mind of either.”
+
+00:03:40.640 --> 00:03:45.679
+Hmmm... So, question — How do we combine
+
+00:03:45.680 --> 00:03:48.159
+the efficient Org Mode system
+
+00:03:48.160 --> 00:03:53.719
+with the effective handwritten note-taking system?
+
+00:03:53.720 --> 00:03:56.799
+Merge the systems together. Absolutely.
+
+00:03:56.800 --> 00:03:59.359
+How do you do that?
+
+00:03:59.360 --> 00:04:03.679
+Step 1: Write the notes by hand
+
+00:04:03.680 --> 00:04:06.079
+on a notebook. Pen, pencil.
+
+00:04:06.080 --> 00:04:08.999
+Keep some convention for yourselves
+
+00:04:09.000 --> 00:04:13.039
+for tracking tasks like a star or an asterisk.
+
+00:04:13.040 --> 00:04:16.399
+Step 2: Scan them using
+
+00:04:16.400 --> 00:04:18.559
+your favourite mobile app.
+
+00:04:18.560 --> 00:04:23.439
+I recommend Adobe Scan or Dropbox.
+
+00:04:23.440 --> 00:04:29.999
+Step 3: store the document as a JPG file
+
+00:04:30.000 --> 00:04:32.679
+into a folder called Inbox.
+
+00:04:32.680 --> 00:04:37.759
+Make sure this syncs into a cloud storage folder
+
+00:04:37.760 --> 00:04:39.479
+and your Org Mode system
+
+00:04:39.480 --> 00:04:41.119
+has access to this folder.
+
+00:04:41.120 --> 00:04:45.919
+(Optional) Step 4: convert the notes into text
+
+00:04:45.920 --> 00:04:49.319
+using Google Keep or just type
+
+00:04:49.320 --> 00:04:51.519
+the damn thing one more time.
+
+00:04:51.520 --> 00:04:54.919
+Then you can process that
+
+00:04:54.920 --> 00:04:56.239
+in your Org Mode system
+
+00:04:56.240 --> 00:04:59.639
+as you always do in whatever
+
+00:04:59.640 --> 00:05:02.119
+is there in your inbox.
+
+00:05:02.120 --> 00:05:06.119
+But, three steps or four before I get access
+
+00:05:06.120 --> 00:05:09.399
+to my notes and into my Org Mode?
+
+00:05:09.400 --> 00:05:11.639
+What a precious waste of time.
+
+00:05:11.640 --> 00:05:14.119
+I'd rather be tinkering with my
+
+00:05:14.120 --> 00:05:18.799
+config file in that time, correct?
+
+00:05:18.800 --> 00:05:19.359
+Boy...
+
+00:05:19.360 --> 00:05:24.919
+Get or buy or gift or convince your partner,
+
+00:05:24.920 --> 00:05:29.719
+parent, or anybody else to gift yourself
+
+00:05:29.720 --> 00:05:31.959
+a touch-enabled large device.
+
+00:05:31.960 --> 00:05:37.879
+Then use an app like OneNote to write notes
+
+00:05:37.880 --> 00:05:41.439
+on the device and link the handwritten note
+
+00:05:41.440 --> 00:05:46.239
+directly into Org Mode by copying the link.
+
+00:05:46.240 --> 00:05:54.079
+You can use a shortcut like Ctrl-1
+
+00:05:54.080 --> 00:05:59.479
+to mark the todos, but that means it remains
+
+00:05:59.480 --> 00:06:05.159
+only on OneNote ecosystem, the todos.
+
+00:06:05.160 --> 00:06:14.919
+You can use the same app to also convert
+
+00:06:14.920 --> 00:06:18.319
+the handwritten note into text
+
+00:06:18.320 --> 00:06:23.559
+just by the click of a button.
+
+00:06:23.560 --> 00:06:27.359
+As a bonus, you can even include screenshots
+
+00:06:27.360 --> 00:06:30.919
+from your online meetings.
+
+00:06:30.920 --> 00:06:33.439
+I like both my options.
+
+00:06:33.440 --> 00:06:36.439
+Option 1: use a regular notebook,
+
+00:06:36.440 --> 00:06:40.839
+scan and process them into my inbox.
+
+00:06:40.840 --> 00:06:44.559
+Option 2: write the notes in a digital device
+
+00:06:44.560 --> 00:06:46.479
+and convert them into text.
+
+00:06:46.480 --> 00:06:52.479
+Or, third option, I appeal to thee,
+
+00:06:52.480 --> 00:06:56.999
+oh great community, can you please build a package
+
+00:06:57.000 --> 00:07:00.959
+inside Org Mode that recognises handwriting
+
+00:07:00.960 --> 00:07:10.039
+to export it into our Org Mode, Emacs Org Mode.
+
+00:07:10.040 --> 00:07:38.640
+Thank you so much for your attention. Bye.
diff --git a/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.vtt b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.vtt
new file mode 100644
index 00000000..7f4c42b6
--- /dev/null
+++ b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.vtt
@@ -0,0 +1,554 @@
+WEBVTT
+
+00:01.000 --> 00:01.840
+Okay, excellent.
+
+00:01.840 --> 00:04.000
+I think we are live on stream.
+
+00:05.320 --> 00:06.360
+Yuchen is here with us.
+
+00:06.360 --> 00:08.560
+Thanks for the great talk, Yuchen.
+
+00:08.560 --> 00:11.840
+For the questions, people are welcome to post them on IRC
+
+00:11.840 --> 00:12.680
+or on the pad.
+
+00:13.560 --> 00:17.000
+And we will also open this big blue button room up
+
+00:17.000 --> 00:19.560
+in a few minutes if people want to join here
+
+00:19.560 --> 00:22.680
+and ask Yuchen the questions directly.
+
+00:22.680 --> 00:30.680
+So yeah, thanks again and take it away.
+
+00:30.680 --> 00:53.680
+Yeah, thanks.
+
+01:00.680 --> 01:29.680
+Okay.
+
+01:29.680 --> 01:33.000
+Well, I guess while we wait for some other audience questions
+
+01:33.000 --> 01:36.200
+to start trickling in, I wonder,
+
+01:37.280 --> 01:39.800
+not having yet watched your talk, obviously,
+
+01:39.800 --> 01:42.120
+because it's been behind the scenes,
+
+01:42.120 --> 01:44.320
+I wonder if your system works
+
+01:44.320 --> 01:46.040
+with offline documentation as well,
+
+01:46.040 --> 01:49.200
+because I remember seeing earlier
+
+01:49.200 --> 01:52.520
+some other Haskell-related workflows
+
+01:52.520 --> 01:56.000
+where people would have downloaded the entirety
+
+01:56.000 --> 02:00.280
+of the Hackage documentations
+
+02:00.280 --> 02:03.280
+and yeah, be able to browse them locally when offline.
+
+02:06.120 --> 02:06.960
+Yeah, for sure.
+
+02:06.960 --> 02:17.960
+I mean, that's one of the points of writing these packages.
+
+02:17.960 --> 02:26.520
+So the Hadock org documentation is meant for generation
+
+02:26.520 --> 02:30.120
+of org files of these Haskell packages
+
+02:30.120 --> 02:33.160
+so that you can have them locally on your computer
+
+02:33.160 --> 02:35.240
+rather than having to rely on Hackage,
+
+02:36.400 --> 02:40.440
+which is online, which is on the web.
+
+02:40.440 --> 02:48.720
+The other one, HCL, the code explorer, it's self-hosted.
+
+02:48.720 --> 02:54.920
+So all you need to do is to download the packages
+
+02:54.920 --> 02:58.840
+you want to index and then index them on the server
+
+02:58.840 --> 03:02.120
+or on the local host and then, yeah,
+
+03:02.120 --> 03:05.520
+then you can unplug your Ethernet cable
+
+03:05.520 --> 03:10.880
+and explore Haskell code on your computer.
+
+03:10.880 --> 03:35.880
+Nice, thanks, that makes sense.
+
+03:41.880 --> 03:45.640
+Maybe another question while we wait for other questions
+
+03:45.640 --> 03:48.800
+from the audience and again, not having had a chance
+
+03:48.800 --> 03:50.720
+to watch your talk yet.
+
+03:50.720 --> 03:53.280
+What do you think is the state of, I guess,
+
+03:53.280 --> 03:56.760
+integration of Haskell, both, I guess,
+
+03:56.760 --> 04:01.080
+the language, the packages, the tooling, all that stuff,
+
+04:01.080 --> 04:05.160
+integration with Emacs today in like 2022?
+
+04:05.160 --> 04:07.480
+Because I'm also, I do have a Haskell background,
+
+04:07.480 --> 04:10.120
+but I haven't done much of it in a few years.
+
+04:10.120 --> 04:13.200
+And back when I do remember some pain points,
+
+04:13.200 --> 04:16.360
+including when trying to integrate it into Emacs.
+
+04:16.360 --> 04:19.520
+So I do wonder what the general state of things
+
+04:19.520 --> 04:25.040
+are, if you could maybe answer quickly, I guess.
+
+04:25.040 --> 04:26.520
+Not in great detail necessarily.
+
+04:29.640 --> 04:33.480
+OK, yeah, I mean, I haven't tried all the packages,
+
+04:33.480 --> 04:34.880
+Haskell-related packages.
+
+04:34.880 --> 04:40.680
+And I think the most prominent ones are Haskell mode
+
+04:40.680 --> 04:45.080
+and Haskell language servers through language server
+
+04:45.080 --> 04:49.880
+packages like eglots or LSP mode.
+
+04:49.880 --> 04:56.280
+Yeah, I mean, Haskell mode is like,
+
+04:56.280 --> 05:03.160
+it feels to me like a standard language mode where
+
+05:03.160 --> 05:09.280
+it offers font locking, syntax highlighting, I mean,
+
+05:09.280 --> 05:18.520
+and REPL, like Python mode, and limited documentation
+
+05:18.520 --> 05:25.400
+and cross-references, which is, I mean, as I mentioned,
+
+05:25.400 --> 05:30.360
+that's why I did this HCL package.
+
+05:30.360 --> 05:38.280
+And the language server is like, it is also pretty standard
+
+05:38.280 --> 05:42.440
+and offering all the language server things, most of them,
+
+05:42.440 --> 05:43.200
+I think.
+
+05:43.200 --> 05:46.320
+But it's very slow.
+
+05:46.320 --> 05:49.520
+It's slower than any other language server I've used.
+
+05:49.520 --> 05:55.440
+And yeah, and it doesn't really work
+
+05:55.440 --> 06:03.360
+with cross-reference, which I also mentioned in the talk.
+
+06:03.360 --> 06:11.120
+So yeah, that's the two main packages
+
+06:11.120 --> 06:12.720
+I think people use most.
+
+06:12.720 --> 06:23.520
+And yeah, I can't think of anything else that's very
+
+06:23.520 --> 06:24.600
+prominent.
+
+06:28.280 --> 06:29.120
+Great, thanks.
+
+06:33.040 --> 06:34.400
+Oh, OK, I just remembered.
+
+06:34.400 --> 06:39.200
+There's also the Haskell TNG package.
+
+06:39.200 --> 06:41.120
+But I haven't looked into it yet.
+
+06:41.120 --> 06:47.960
+It's, if I remember correctly, it's like in the GNU ELP,
+
+06:47.960 --> 06:50.080
+is it in GNU ELP or non-GNU?
+
+06:50.080 --> 06:50.840
+Let me have a look.
+
+06:58.280 --> 07:00.200
+Right, it's also in non-GNU.
+
+07:00.200 --> 07:02.680
+Never mind.
+
+07:02.680 --> 07:07.200
+Yeah, I think it's a new, up-and-coming Haskell media
+
+07:07.200 --> 07:10.480
+mode, an experimental rewrite of Haskell mode.
+
+07:10.480 --> 07:12.040
+That's the description.
+
+07:19.080 --> 07:21.800
+Cool, and have you had a chance to maybe play around
+
+07:21.800 --> 07:24.640
+with that a little bit and see how
+
+07:24.640 --> 07:27.440
+it compares with the traditional, the older,
+
+07:27.440 --> 07:28.520
+the existing Haskell mode?
+
+07:32.960 --> 07:34.120
+No, I haven't yet.
+
+07:34.120 --> 07:35.680
+OK.
+
+08:05.000 --> 08:07.160
+Yeah, I can't think of anything else that's very prominent.
+
+08:07.160 --> 08:09.160
+I haven't looked into it yet.
+
+08:09.160 --> 08:12.120
+It's, if I remember correctly, it's like in the GNU ELP.
+
+08:12.120 --> 08:15.440
+Yeah, I think it's a new, up-and-coming Haskell
+
+08:15.440 --> 08:19.400
+media mode, an experimental rewrite of Haskell mode.
+
+08:19.400 --> 08:20.280
+That's the description.
+
+08:20.280 --> 08:22.520
+I haven't yet, I haven't looked into it,
+
+08:22.520 --> 08:25.480
+and I think it's a new, up-and-coming Haskell
+
+08:25.480 --> 08:28.920
+media mode, an experimental rewrite of Haskell mode.
+
+08:28.920 --> 08:31.680
+Yeah, I haven't yet, I haven't looked into it,
+
+08:31.680 --> 08:33.740
+you
+
+09:01.680 --> 09:17.280
+One question that just occurred to me, I guess, about the state of like literate Haskell and
+
+09:17.280 --> 09:22.960
+potential integration with org mode. I've actually never, I haven't put too much thought into this,
+
+09:22.960 --> 09:28.000
+but it just occurred to me that Haskell, as you likely know, already has a literate Haskell mode
+
+09:28.000 --> 09:36.000
+with like.LHS files. And I was wondering, I guess, if you've tried maintaining or writing
+
+09:36.000 --> 09:41.200
+any projects in literate Haskell, at least not, if not entirely, then with a considerable amount
+
+09:41.200 --> 09:50.400
+of source code in that approach and how it might compare, for example, to something like Babel,
+
+09:50.400 --> 09:58.160
+I guess, which is very much more documentation oriented with like code blocks intermingled.
+
+10:01.280 --> 10:10.880
+Okay. Yeah, I'm afraid I haven't really used the literate Haskell. I heard of it. And if I want
+
+10:11.600 --> 10:17.680
+to like write literate programming, I would, I mean, I would go for org mode and org Babel,
+
+10:17.680 --> 10:24.720
+indeed, first before, yeah, before the more language specific mode.
+
+10:28.240 --> 10:34.080
+Right. That makes sense. I just thought it's interesting because Haskell is, I guess,
+
+10:34.080 --> 10:39.200
+one of the fewer languages where it actually does have its own literate mode, if you will,
+
+10:39.200 --> 10:43.600
+and yeah, there might be something interesting there to think about or try exploring at some
+
+10:43.600 --> 10:55.040
+point. Yeah, yeah, definitely. Yeah. Yeah, I will look into it.
+
+10:55.040 --> 11:10.960
+Poo.
+
+11:25.040 --> 11:53.740
+Yeah, so I'm reading about this Haskell TNG mode.
+
+11:53.740 --> 11:57.400
+It looks like it can also jump to definition
+
+11:57.400 --> 12:03.440
+outside of the project using a thing uses
+
+12:03.440 --> 12:09.560
+a tool called HS Inspect, which is also
+
+12:09.560 --> 12:15.000
+a tool using the GHC API.
+
+12:15.000 --> 12:17.480
+Yeah, not sure how it is achieved, though.
+
+12:17.480 --> 12:21.520
+Bren.
+
+12:48.480 --> 12:51.360
+I think I have a question on IRC.
+
+12:51.360 --> 12:53.320
+Is the indexing faster?
+
+12:53.320 --> 12:55.400
+And when re-indexing, would it be too slow
+
+12:55.400 --> 12:56.480
+to re-index on demand?
+
+13:01.560 --> 13:05.120
+Sorry, what's the question again?
+
+13:05.120 --> 13:09.240
+The question is, is the indexing faster when re-indexing?
+
+13:09.240 --> 13:11.560
+Would it be too slow to re-index on demand?
+
+13:11.560 --> 13:14.960
+I think this might be for the other talk stream.
+
+13:14.960 --> 13:15.920
+I'm not entirely sure.
+
+13:15.920 --> 13:21.640
+So yeah, I mean, it sounds relevant to this talk, though.
+
+13:21.640 --> 13:23.600
+Oh, OK, then, yeah, OK, sorry.
+
+13:23.600 --> 13:26.600
+I'm a little scatterbrained.
+
+13:26.600 --> 13:28.320
+No, it's OK.
+
+13:28.320 --> 13:36.760
+Oh, yeah, yeah, re-indexing, I mean, I don't know, actually,
+
+13:36.760 --> 13:41.680
+because I haven't started implementing
+
+13:41.680 --> 13:44.400
+on-demand re-indexing yet.
+
+13:44.400 --> 13:49.320
+And I'm still a bit hazy about whether it strictly
+
+13:49.320 --> 13:53.520
+requires recompiling when re-indexing.
+
+13:53.520 --> 14:03.440
+And I mean, but I do think it's like the main workhorse
+
+14:03.440 --> 14:09.400
+of this process would be the GHC API compiling process,
+
+14:09.400 --> 14:15.760
+whether it can avoid recompilation efficiency.
+
+14:15.760 --> 14:23.680
+When, yeah, and I think it can.
+
+14:23.680 --> 14:28.720
+It has some optimization with recompilation.
+
+14:28.720 --> 14:35.480
+And also, ideally, you should start
+
+14:35.480 --> 14:39.800
+using a bit less heavy compilation,
+
+14:39.800 --> 14:45.640
+like this HIE,.hie files, instead of compiling
+
+14:45.640 --> 14:49.280
+the whole thing, instead of requiring
+
+14:49.280 --> 14:55.120
+the compilation of the whole project from using
+
+14:55.120 --> 14:56.000
+the whole pipeline.
+
+14:56.000 --> 15:01.760
+So HIE, I think, is more or less the only front-end part.
+
+15:01.760 --> 15:05.800
+Yeah, and if, I mean, that's one of the things,
+
+15:05.800 --> 15:10.520
+like, main to-dos for this project, for the HCL project,
+
+15:10.520 --> 15:16.920
+to replace the cabal helper with using.hie
+
+15:16.920 --> 15:18.920
+that I haven't looked into yet.
+
+15:22.920 --> 15:23.440
+Awesome.
+
+15:26.480 --> 15:29.000
+Yeah, sounds interesting and looking forward to it.
+
+15:29.000 --> 15:32.240
+I think we have about, like, less than a minute or so
+
+15:32.240 --> 15:34.640
+for the live Q&A. Of course, people
+
+15:34.640 --> 15:37.520
+are welcome to keep asking questions,
+
+15:37.520 --> 15:40.240
+whether on the pad or on IRC.
+
+15:40.240 --> 15:43.520
+And yeah, so after this, Q&A concludes.
+
+15:43.520 --> 15:44.920
+This is our last talk of today.
+
+15:44.920 --> 15:49.080
+So we would appreciate it if people would join us
+
+15:49.080 --> 15:54.120
+on the general stream for the closing remarks of today.
+
+15:54.120 --> 15:55.720
+And yeah, we'll still have tomorrow
+
+15:55.720 --> 15:57.440
+to look forward to the next one.
+
+15:57.440 --> 15:59.640
+We'll still have tomorrow to look forward to, of course.
+
+15:59.640 --> 16:01.160
+OK.
+
+16:25.960 --> 16:28.040
+I see that EmacsConf just left.
+
+16:28.040 --> 16:30.400
+Does that mean the Q&A is over?
+
+16:30.400 --> 16:31.680
+Yep, I believe so.
+
+16:31.680 --> 16:35.760
+So I think we should head on over to the GenStream.
+
+16:35.760 --> 16:36.800
+OK, cool.
+
+16:36.800 --> 16:39.280
+Yeah, I'll go there as well.
+
+16:39.280 --> 16:41.400
+All right, thanks a lot for your questions.
+
+16:41.400 --> 16:43.480
+Yep, and thank you, Yuchun, for your great talk.
+
+16:43.480 --> 16:45.000
+Thank you.
+
+16:45.000 --> 16:46.440
+Thanks, bye-bye.
+
+16:46.440 --> 16:47.200
+Bye.
+
+16:47.200 --> 17:03.240
+You are currently the only person in this conference.
+
diff --git a/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main--chapters.vtt b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main--chapters.vtt
new file mode 100644
index 00000000..7f9272e6
--- /dev/null
+++ b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main--chapters.vtt
@@ -0,0 +1,117 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:00:30.520
+What is Haskell?
+
+12
+00:00:30.520 --> 00:01:33.640
+Parts of a Haskell program
+
+34
+00:01:33.640 --> 00:02:13.400
+Example of Haskell source code
+
+44
+00:02:13.400 --> 00:02:37.160
+Writing Haskell like Lisp
+
+52
+00:02:37.160 --> 00:03:53.760
+What is a code explorer?
+
+79
+00:03:53.760 --> 00:04:56.240
+Prior art
+
+97
+00:04:56.240 --> 00:05:46.080
+Haskell mode
+
+111
+00:05:46.080 --> 00:06:43.560
+Jumping to declarations
+
+128
+00:06:43.560 --> 00:07:24.840
+Finding references
+
+135
+00:07:24.840 --> 00:08:20.520
+The Haskell language server
+
+150
+00:08:20.520 --> 00:08:54.960
+Hoogle and Hackage
+
+162
+00:08:54.960 --> 00:09:34.600
+Haskell Code Explorer
+
+176
+00:09:34.600 --> 00:10:42.080
+Demo of Haskell Code Explorer
+
+189
+00:10:42.080 --> 00:12:35.480
+Learning about monads
+
+214
+00:12:35.480 --> 00:13:39.920
+Web client
+
+230
+00:13:39.920 --> 00:14:47.800
+User freedom
+
+246
+00:14:47.800 --> 00:15:38.560
+hc.el
+
+259
+00:15:38.560 --> 00:16:46.520
+Demo
+
+282
+00:16:46.520 --> 00:17:38.920
+Declarations
+
+293
+00:17:38.920 --> 00:18:19.160
+Finding definitions and references
+
+302
+00:18:19.160 --> 00:19:22.360
+Eldoc
+
+317
+00:19:22.360 --> 00:20:32.560
+Searching for identifiers
+
+330
+00:20:32.560 --> 00:22:01.440
+Help buffer integration
+
+350
+00:22:01.440 --> 00:23:28.840
+Haddock
+
+371
+00:23:28.840 --> 00:24:30.480
+Servant
+
+388
+00:24:30.480 --> 00:25:50.320
+Org
+
+408
+00:25:50.320 --> 00:26:19.280
+Links
+
+415
+00:26:19.280 --> 00:28:41.160
+Navigation
+
+449
+00:28:41.160 --> 00:29:39.520
+Going the other direction
diff --git a/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt
new file mode 100644
index 00000000..e2bd489c
--- /dev/null
+++ b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt
@@ -0,0 +1,1354 @@
+WEBVTT captioned by anush
+
+00:00.000 --> 00:03.499
+Today, I will talk about Haskell code exploration for Emacs.
+
+00:03.500 --> 00:06.499
+What is Haskell? It is a purely functional language.
+
+00:06.500 --> 00:09.499
+For example, every value in Haskell is immutable.
+
+00:09.500 --> 00:12.999
+And it is the main compiler of Haskell, GHC.
+
+00:13.000 --> 00:15.999
+It provides API for the whole compilation pipeline.
+
+00:16.000 --> 00:00:18.324
+For example, the tools mentioned in this talk,
+
+00:00:18.424 --> 00:00:19.999
+including hcel and haddorg,
+
+00:20.000 --> 00:24.499
+they use, they heavily utilize the GHC front-end API
+
+00:24.500 --> 00:00:26.644
+for parsing and understanding
+
+00:00:26.744 --> 00:00:29.499
+the identifiers in Haskell source files.
+
+00:29.500 --> 00:00:31.444
+Roughly speaking,
+
+00:00:31.544 --> 00:00:34.564
+a Haskell program consists of several parts.
+
+00:00:34.664 --> 00:00:36.964
+it begins with some front matters, including,
+
+00:00:37.064 --> 00:00:39.924
+for example, language extensions,
+
+00:00:40.024 --> 00:00:43.964
+which are optional language features one might want to use
+
+00:00:44.064 --> 00:00:48.364
+for convenience.
+
+00:00:48.464 --> 00:00:52.499
+The front matters also contain module exports.
+
+00:52.500 --> 00:00:55.684
+So for example, here we define,
+
+00:00:55.784 --> 00:00:57.999
+we declare module F2Md.Config
+
+00:58.000 --> 00:01:00.884
+for this Haskell source file,
+
+00:01:00.984 --> 00:01:02.999
+which exports these four identifiers
+
+01:03.000 --> 01:07.499
+that other source files can use when importing F2Md.Config.
+
+01:07.500 --> 00:01:10.684
+And the next will be
+
+00:01:10.784 --> 00:01:13.999
+a block of imports so that we can use libraries
+
+01:14.000 --> 01:16.999
+and identifiers in these libraries.
+
+01:17.000 --> 00:01:21.644
+The bulk of a Haskell source file normally is
+
+00:01:21.744 --> 00:01:22.999
+a list of declarations,
+
+01:23.000 --> 01:25.999
+including values, types, and instances, and so on.
+
+01:26.000 --> 00:01:29.084
+The difference between a value and a type is that
+
+00:01:29.184 --> 00:01:30.499
+the type of a value is a type,
+
+01:30.500 --> 00:01:33.964
+and the type of a type is a kind.
+
+00:01:34.064 --> 00:01:38.484
+For example, here's a small block of Haskell source code.
+
+00:01:38.584 --> 00:01:41.404
+We define Range type
+
+00:01:41.504 --> 00:01:44.999
+from a lower-end integer to a higher-end integer.
+
+01:45.000 --> 00:01:51.364
+We also declare a value r of the type Range,
+
+00:01:51.464 --> 00:01:53.999
+which is Range from 2 to 7,
+
+01:54.000 --> 00:02:01.004
+because in Haskell, we like to--
+
+00:02:01.104 --> 00:02:03.999
+by default, functions can be curried,
+
+02:04.000 --> 00:02:09.804
+which basically means, by default, we want to utilize
+
+00:02:09.904 --> 00:02:11.999
+the partial application of functions.
+
+00:02:12.000 --> 00:02:17.284
+We don't require parens surrounding arguments
+
+00:02:17.384 --> 00:02:19.364
+when invoking a function.
+
+00:02:19.464 --> 00:02:22.724
+That makes it possible, if you want,
+
+00:02:22.725 --> 00:02:24.999
+to write Haskell like Lisp
+
+02:25.000 --> 02:27.999
+by adding a bit of redundant parens.
+
+02:28.000 --> 00:02:30.044
+So for example,
+
+00:02:30.144 --> 00:02:33.684
+here are two blocks of code, one Lisp, one Haskell,
+
+00:02:33.784 --> 00:02:35.999
+and they look quite similar to each other.
+
+02:36.000 --> 02:37.999
+What is a code explorer?
+
+02:38.000 --> 00:02:39.444
+A code explorer is a tool
+
+00:02:39.544 --> 00:02:42.624
+to browse its code base to its code comprehension.
+
+00:02:42.724 --> 00:02:45.324
+Code explorer commonly comes with
+
+00:02:45.424 --> 00:02:46.999
+several functionalities or features,
+
+02:47.000 --> 00:02:49.244
+including a cross-referencer,
+
+00:02:49.344 --> 00:02:52.999
+which allows going to definitions of an identifier at points
+
+02:53.000 --> 00:02:56.444
+or looking up references of an identifier,
+
+00:02:56.544 --> 00:02:57.999
+like where it is used.
+
+02:58.000 --> 03:03.999
+So the example in Emacs would be xref.
+
+03:04.000 --> 00:03:07.604
+Code explorer also would be able to show you
+
+00:03:07.704 --> 00:03:09.999
+documentation and signatures of identifiers at points.
+
+03:10.000 --> 00:03:13.884
+In Emacs, that would be eldoc.
+
+00:03:13.984 --> 00:03:16.999
+It also commonly allows you to search for identifiers.
+
+03:17.000 --> 00:03:19.884
+Something like that in Emacs
+
+00:03:19.984 --> 00:03:21.999
+could be describe-function and find-function.
+
+03:22.000 --> 00:03:24.684
+Code explorer is normally
+
+00:03:24.784 --> 00:03:27.364
+quite often implemented in two parts,
+
+00:03:27.464 --> 00:03:27.999
+the indexer and the server,
+
+03:28.000 --> 00:03:32.484
+where the indexer parses the source code files,
+
+00:03:32.584 --> 00:03:33.999
+indexes the identifiers,
+
+03:34.000 --> 00:03:36.284
+and stores the information of identifiers
+
+00:03:36.384 --> 00:03:37.999
+like the definition, size, and the currencies,
+
+03:38.000 --> 03:41.999
+either in databases or in files.
+
+03:42.000 --> 00:03:44.444
+The other part is the server,
+
+00:03:44.544 --> 00:03:48.999
+which uses the database created by the indexer
+
+03:49.000 --> 00:03:53.004
+to serve the information of the identifier.
+
+00:03:53.104 --> 00:03:57.004
+Before I present my solution to code exploring,
+
+00:03:57.104 --> 00:04:00.999
+some description of prior art is in order.
+
+04:01.000 --> 00:04:05.284
+There are several tools that you can use
+
+00:04:05.384 --> 00:04:07.999
+to aid code exploration,
+
+04:08.000 --> 00:04:13.444
+including tech-based tools like hasktags and hs-tags.
+
+00:04:13.544 --> 00:04:15.484
+The limitation with these tools
+
+00:04:15.584 --> 00:04:17.999
+is they are focused on the current projects only
+
+04:18.000 --> 00:04:19.604
+and do not work
+
+00:04:19.704 --> 00:04:25.999
+for cross-packaging reference and definition.
+
+04:26.000 --> 00:04:31.044
+Another problem with the tag-based tools is
+
+00:04:31.045 --> 00:04:34.684
+they might not handle symbols with the same name properly.
+
+00:04:34.784 --> 00:04:35.999
+Sometimes they get confused,
+
+04:36.000 --> 00:04:43.324
+and they ask you to choose which definition,
+
+00:04:43.424 --> 00:04:45.924
+what is the correct definition site,
+
+00:04:46.024 --> 00:04:49.244
+even though the occurrence of the symbol
+
+00:04:49.344 --> 00:04:54.999
+or the symbol at point has only one definition ambiguously.
+
+04:55.000 --> 04:57.999
+Another tool is the haskell-mode.
+
+04:58.000 --> 00:05:02.684
+It has some limited support for eldoc
+
+00:05:02.784 --> 00:05:06.604
+by displaying the signature of an identifier at points,
+
+00:05:06.704 --> 00:05:11.764
+but the identifier has to be something
+
+00:05:11.864 --> 00:05:14.999
+that is commonly known or sort of built-in
+
+05:15.000 --> 05:17.999
+or come from the base library of Haskell.
+
+05:18.000 --> 00:05:20.244
+So for example,
+
+00:05:20.344 --> 00:05:24.244
+it works for common functions like head and tail.
+
+00:05:24.344 --> 00:05:26.999
+And you can see that the signature is displayed here.
+
+05:27.000 --> 00:05:29.564
+However, it does not work for,
+
+00:05:29.664 --> 00:05:31.804
+let's say, IO. IO is a type.
+
+00:05:31.904 --> 00:05:32.999
+Maybe that's the reason.
+
+05:33.000 --> 00:05:37.324
+Let's find another function
+
+00:05:37.424 --> 00:05:39.999
+that's not from the base library.
+
+05:40.000 --> 05:41.999
+toJSON is from the Aeson library,
+
+05:42.000 --> 05:46.999
+so no signature is displayed here.
+
+05:47.000 --> 00:05:51.164
+It also provides
+
+00:05:51.264 --> 00:05:53.324
+some sort of goto-declaration functionality
+
+00:05:53.424 --> 00:05:56.324
+to jump to any declaration in a file.
+
+00:05:56.424 --> 00:06:00.564
+To do that, one has to first run haskell-decl-scan-mode
+
+00:06:00.664 --> 00:06:02.999
+to enter this minor mode.
+
+06:03.000 --> 00:06:08.044
+Then we can run imenu to go to any definition,
+
+00:06:08.144 --> 00:06:10.999
+to go to any declaration, like getHomeR.
+
+06:11.000 --> 00:06:13.724
+Apparently, after running that,
+
+00:06:13.824 --> 00:06:15.999
+we are able to go to definition.
+
+06:16.000 --> 06:18.999
+So for example, let's see,
+
+06:19.000 --> 06:21.999
+we want to find definition of getCityJR.
+
+06:22.000 --> 00:06:25.524
+And indeed, it works
+
+00:06:25.624 --> 00:06:28.524
+if it's within the same source file, of course.
+
+00:06:28.624 --> 00:06:31.999
+It still does not work for cross-packaging identifiers.
+
+06:32.000 --> 00:06:36.924
+So HandlerFor is probably an identifier from servant.
+
+00:06:37.024 --> 00:06:39.999
+Or no, not necessarily servant. Maybe WAI.
+
+06:40.000 --> 00:06:43.404
+Anyway, it's another library.
+
+00:06:43.504 --> 00:06:50.404
+And how about find-references?
+
+00:06:50.504 --> 00:07:01.124
+find-references also works somehow for this file.
+
+00:07:01.224 --> 00:07:06.684
+How about WidgetFor?
+
+00:07:06.784 --> 00:07:13.644
+It works for WidgetFor too.
+
+00:07:13.744 --> 00:07:17.999
+It has some support for goto-definition and find-references.
+
+07:18.000 --> 07:25.999
+But as usual, it does not support such things cross-package.
+
+07:26.000 --> 00:07:27.364
+And finally, we have
+
+00:07:27.365 --> 00:07:30.999
+the Sledgehammer HLS Haskell language server.
+
+07:31.000 --> 07:32.999
+It can be used with EGLOT.
+
+07:33.000 --> 00:07:40.804
+But the problem with HLS, HLS has many many features
+
+00:07:40.904 --> 00:07:42.844
+because it is a language server,
+
+00:07:42.944 --> 00:07:50.999
+like renaming, like eldoc for standard libraries, and so on.
+
+07:51.000 --> 07:56.999
+But the problem with HLS is, one, that it is very, very slow.
+
+07:57.000 --> 07:59.999
+And I wouldn't use it with my laptop.
+
+08:00.000 --> 08:04.999
+And two, it also does not support cross-package referencing.
+
+08:05.000 --> 08:07.999
+In fact, there's an outstanding GitHub issue about this.
+
+08:08.000 --> 00:08:12.964
+So cross-package referencing and goto-definition
+
+00:08:13.064 --> 00:08:17.164
+is sort of a common shortfall,
+
+00:08:17.264 --> 00:08:20.999
+a common problem for these existing Haskell code explorers.
+
+08:21.000 --> 08:22.999
+Then finally, we also have hoogle and hackage.
+
+08:23.000 --> 00:08:28.284
+Hoogle is a search engine for Haskell identifiers,
+
+00:08:28.384 --> 00:08:30.644
+and the results link to Hackage,
+
+00:08:30.744 --> 00:08:33.604
+which is the Haskell documentation website
+
+00:08:33.704 --> 00:08:34.999
+for all Haskell libraries.
+
+08:35.000 --> 00:08:40.004
+Haskell Hackage has functionality
+
+00:08:40.104 --> 00:08:44.999
+where you can jump to the source code file rendered in HTML,
+
+08:45.000 --> 00:08:49.444
+and you can click on the identifiers there
+
+00:08:49.544 --> 00:08:51.524
+to jump to definitions,
+
+00:08:51.624 --> 00:08:54.044
+but it does not support find references,
+
+00:08:54.144 --> 00:08:58.999
+and it is rather basic.
+
+08:59.000 --> 00:09:01.644
+Then I learned about haskell-code-explorer,
+
+00:09:01.744 --> 00:09:04.999
+which is a fully-fledged Haskell code explorer.
+
+09:05.000 --> 00:09:07.724
+It is written by someone else.
+
+00:09:07.824 --> 00:09:09.164
+It is a web application
+
+00:09:09.264 --> 00:09:11.999
+for exploring Haskell package codebases.
+
+09:12.000 --> 00:09:16.244
+The official reference instance for haskell-code-explorer
+
+00:09:16.344 --> 00:09:18.999
+is available at this URL, which I will demo soon.
+
+09:19.000 --> 09:24.999
+What I did with these packages... I ported it to GHC 9.2.
+
+09:25.000 --> 00:09:29.044
+I renamed it to hcel because I want to focus on Emacs clients
+
+00:09:29.144 --> 00:09:30.999
+rather than JavaScript clients, which I will explain later.
+
+09:31.000 --> 09:36.999
+And I also wrote an Emacs client package, of course.
+
+09:37.000 --> 00:09:41.404
+This is what haskell-code-explorer looks like.
+
+00:09:41.504 --> 00:09:46.924
+On the homepage, it is a list of indexed packages
+
+00:09:47.024 --> 00:09:50.044
+indexed by the indexer.
+
+00:09:50.144 --> 00:09:53.844
+One can filter it by the package name
+
+00:09:53.944 --> 00:10:04.999
+or look for identifiers directly across all packages.
+
+10:05.000 --> 00:10:09.884
+Let's have a look at base. There are three versions.
+
+00:10:09.984 --> 00:10:14.999
+Let's have a look at the latest version, 4.12.0.0.
+
+10:15.000 --> 00:10:18.964
+Once entering the package view,
+
+00:10:19.064 --> 00:10:24.444
+you are shown a list of all modules by their path,
+
+00:10:24.544 --> 00:10:28.999
+as well as a tree of these module files.
+
+10:29.000 --> 00:10:32.524
+You can filter by module name or file name,
+
+00:10:32.624 --> 00:10:34.324
+or you can search for identifier within the same package
+
+00:10:34.424 --> 00:10:35.999
+or in all packages.
+
+10:36.000 --> 00:10:43.204
+Let's say we want to learn about Control.Monad.
+
+00:10:43.304 --> 00:10:46.884
+Now we are in the module view.
+
+00:10:46.984 --> 00:10:49.804
+The source file is presented to you,
+
+00:10:49.904 --> 00:10:54.999
+and it has links to identifiers.
+
+10:55.000 --> 00:11:01.804
+When you hover over them, the documentation shows up,
+
+00:11:01.904 --> 00:11:04.999
+including the signature where it is defined.
+
+11:05.000 --> 00:11:10.244
+You can go to its definition or find references.
+
+00:11:10.344 --> 00:11:20.164
+Let's say we want to go to the definition of Monad.
+
+00:11:20.264 --> 00:11:25.484
+It jumps to the definition site of the monad type class.
+
+00:11:25.584 --> 00:11:28.004
+If we click at the definition site,
+
+00:11:28.104 --> 00:11:32.124
+it brings up a list of references.
+
+00:11:32.224 --> 00:11:33.644
+On the left, you can choose
+
+00:11:33.744 --> 00:11:38.999
+which package you want to find references of monad in.
+
+11:39.000 --> 11:46.999
+Let's look at the random one, avwx.
+
+11:47.000 --> 00:11:54.044
+Here is a list of results where Monad is used in avwx.
+
+00:11:54.144 --> 00:11:57.764
+This is a module path.
+
+00:11:57.864 --> 00:12:06.324
+One can go to any of these results.
+
+00:12:06.424 --> 00:12:07.844
+We can search for things in all packages
+
+00:12:07.944 --> 00:12:09.484
+or in the current package.
+
+00:12:09.584 --> 00:12:12.999
+Let’s say I want to search for "Read"
+
+12:13.000 --> 00:12:19.244
+I think this is the "Read" that is commonly used in Haskell,
+
+00:12:19.344 --> 00:12:24.999
+the read type class for parsing strings into values.
+
+12:25.000 --> 00:12:31.004
+I think that is more or less it.
+
+00:12:31.104 --> 00:12:34.524
+That is the Haskell Code Explorer web application
+
+00:12:34.624 --> 00:12:38.204
+in all its glory.
+
+00:12:38.304 --> 00:12:40.884
+Let's go back to the slides.
+
+00:12:40.984 --> 00:12:43.364
+That was the web application,
+
+00:12:43.464 --> 00:12:46.444
+which is basically a JavaScript client
+
+00:12:46.544 --> 00:12:48.644
+that talks to the server
+
+00:12:48.744 --> 00:12:50.964
+by sending requests and receiving
+
+00:12:51.064 --> 00:12:54.999
+and parsing the JSON results or JSON responses.
+
+12:55.000 --> 00:13:02.404
+Initially, I was interested in hacking the web client.
+
+00:13:02.504 --> 00:13:04.999
+It uses the ember.js web framework.
+
+13:05.000 --> 00:13:09.844
+The first thing to do was to npm install ember-cli.
+
+00:13:09.944 --> 00:13:16.124
+It gives me 12 vulnerabilities,
+
+00:13:16.224 --> 00:13:18.999
+4 low, 2 moderate, 3 high, 3 critical.
+
+13:19.000 --> 00:13:26.084
+I don't know how often it is the case
+
+00:13:26.184 --> 00:13:32.964
+when we don't really care about these nasty vulnerabilities
+
+00:13:33.064 --> 00:13:35.999
+from Node.js or npm because they are so common.
+
+13:36.000 --> 00:13:41.044
+I don't quite like that.
+
+00:13:41.144 --> 00:13:45.364
+Another reason for favoring Emacs clients
+
+00:13:45.464 --> 00:13:48.999
+over JavaScript clients is user freedom.
+
+13:49.000 --> 00:13:53.284
+Emacs is geared towards user freedom.
+
+00:13:53.384 --> 00:14:01.564
+It allows users maximum freedom to customize or mod Emacs.
+
+00:14:01.664 --> 00:14:07.164
+I think Emacs clients can be a way to fix JavaScript traps,
+
+00:14:07.264 --> 00:14:14.244
+like using user scripts to replace non-free JavaScript.
+
+00:14:14.344 --> 00:14:19.484
+There are tools to do that, for example, like Haketilo.
+
+00:14:19.584 --> 00:14:21.404
+Why write JavaScript replacement
+
+00:14:21.504 --> 00:14:25.164
+if we can write Elisp replacement?
+
+00:14:25.264 --> 00:14:31.684
+If we overwrite all kinds of front-ends in Emacs
+
+00:14:31.784 --> 00:14:34.404
+for commonly-used web applications
+
+00:14:34.504 --> 00:14:36.999
+like Reddit, Hacker News, what have you,
+
+14:37.000 --> 00:14:40.804
+then we have an Emacs app store
+
+00:14:40.904 --> 00:14:43.604
+where we can just install these applications
+
+00:14:43.704 --> 00:14:51.084
+and browse the web more freely.
+
+00:14:51.184 --> 00:14:56.044
+Back to hcel, which is the Emacs client I wrote.
+
+00:14:56.144 --> 00:14:59.084
+I tried to reuse as much of Emacs built-ins as possible,
+
+00:14:59.184 --> 00:15:03.044
+including eldoc, for showing documentation,
+
+00:15:03.144 --> 00:15:04.764
+xref for cross-referencer,
+
+00:15:04.864 --> 00:15:06.999
+compilation-mode for showing search results of identifiers,
+
+15:07.000 --> 00:15:11.604
+outline-mode for a hierarchical view
+
+00:15:11.704 --> 00:15:14.284
+of package module identifiers,
+
+00:15:14.384 --> 00:15:17.999
+sort of a cursor-mode for highlighting identifiers,
+
+15:18.000 --> 00:15:26.044
+help-mode for displaying quick help for Haskell identifiers,
+
+00:15:26.144 --> 00:15:27.604
+integration with haddorg,
+
+00:15:27.704 --> 00:15:31.204
+which I will mention later, etc.
+
+00:15:31.304 --> 00:15:37.999
+It is available as hcel without the dot on GNU ELPA.
+
+15:38.000 --> 00:15:40.084
+Time for a demo.
+
+00:15:40.184 --> 00:15:42.484
+To start using hc.el, surprise surprise,
+
+00:15:42.584 --> 00:15:45.084
+we run the hcel command.
+
+00:15:45.184 --> 00:15:46.884
+We are presented with a list of packages
+
+00:15:46.984 --> 00:15:51.999
+indexed by the hcel indexer.
+
+15:52.000 --> 00:15:53.964
+This is an outline mode,
+
+00:15:54.064 --> 00:15:58.724
+so we can tab to list all the modules
+
+00:15:58.824 --> 00:16:00.999
+represented by the module path.
+
+16:01.000 --> 00:16:03.404
+We can further tab into the list of identifiers
+
+00:16:03.504 --> 00:16:04.999
+declared in this module.
+
+16:05.000 --> 00:16:09.084
+Now it asks whether you want to open module source.
+
+00:16:09.184 --> 00:16:11.884
+This is because some module source code
+
+00:16:11.984 --> 00:16:13.999
+can be quite large and it can take a bit of time.
+
+16:14.000 --> 00:16:17.684
+In this case, the control monad is quite small,
+
+00:16:17.784 --> 00:16:19.844
+so let's say yes.
+
+00:16:19.944 --> 00:16:24.004
+We see the list of identifiers.
+
+00:16:24.104 --> 00:16:27.999
+One can jump to an identifier forever.
+
+16:28.000 --> 16:32.999
+As you can see, the identifiers at points are highlighted.
+
+16:33.000 --> 00:16:36.124
+This can be particularly useful
+
+00:16:36.224 --> 00:16:38.604
+in a large function declaration
+
+00:16:38.704 --> 00:16:39.999
+where you come to see, for example,
+
+16:40.000 --> 00:16:44.204
+all the occurrences of an identifier
+
+00:16:44.304 --> 00:16:47.999
+inside the body of the declaration.
+
+16:48.000 --> 00:16:50.724
+These are declarations
+
+00:16:50.824 --> 00:16:52.999
+which in Haskell mode are listed in imenu.
+
+16:53.000 --> 16:59.999
+We can do the same here in hcel source mode.
+
+17:00.000 --> 17:05.999
+It lists all the declarations with their signature.
+
+17:06.000 --> 17:12.999
+Let's say we want to jump to this funny operator.
+
+17:13.000 --> 00:17:20.324
+It worked and you can also go back and forth
+
+00:17:20.424 --> 00:17:25.999
+within the declarations by pressing "n" and "p".
+
+17:26.000 --> 00:17:30.804
+Similarly, you can do something similar in the outline mode
+
+00:17:30.904 --> 00:17:37.999
+by toggling the follow mode, just like in org-agenda.
+
+17:38.000 --> 00:17:40.124
+Let's turn it off.
+
+00:17:40.224 --> 00:17:45.999
+Now, how about find definition references?
+
+17:46.000 --> 00:17:48.964
+Using xref,
+
+00:17:49.064 --> 00:17:52.999
+we can jump to the definition of Int and jump back.
+
+17:53.000 --> 17:55.999
+Jump to Maybe, jump back.
+
+17:56.000 --> 00:18:00.924
+Let's have a look at references of replicateM.
+
+00:18:01.024 --> 00:18:03.364
+There are plenty of them.
+
+00:18:03.464 --> 00:18:08.999
+Maybe we want to check out ghc-lib.
+
+18:09.000 --> 00:18:11.244
+Here are all the references
+
+00:18:11.344 --> 00:18:15.999
+and you can of course jump to any of them in the results.
+
+18:16.000 --> 18:18.999
+Cool.
+
+18:19.000 --> 00:18:21.764
+You may have already noticed
+
+00:18:21.864 --> 00:18:27.084
+the eldoc displaying the documentation
+
+00:18:27.184 --> 00:18:34.804
+and signature of identifiers.
+
+00:18:34.904 --> 00:18:44.004
+For example, here it shows the signature of replicateM,
+
+00:18:44.104 --> 00:18:46.999
+where it is defined, and its documentation.
+
+18:47.000 --> 18:55.999
+We can bring up the eldoc buffer.
+
+18:56.000 --> 00:18:58.164
+In the eldoc buffer,
+
+00:18:58.264 --> 00:19:00.084
+there are also links to other identifiers,
+
+00:19:00.184 --> 00:19:04.444
+which takes you to the definition of these identifiers,
+
+00:19:04.544 --> 00:19:07.524
+like minBound.
+
+00:19:07.624 --> 00:19:10.764
+Apparently, this is not working.
+
+00:19:10.864 --> 00:19:13.004
+I'm pretty sure it maybe works.
+
+00:19:13.104 --> 00:19:16.999
+Let's go to nothing or just...
+
+19:17.000 --> 00:19:19.764
+I think those didn't work because
+
+00:19:19.864 --> 00:19:24.044
+the module source for those identifiers is not open.
+
+00:19:24.144 --> 00:19:30.204
+Of course, you can search
+
+00:19:30.304 --> 00:19:32.924
+for any identifiers across all indexed packages
+
+00:19:33.024 --> 00:19:37.999
+by invoking hcel-global-ids.
+
+19:38.000 --> 19:41.999
+Let's say we want to search for Read.
+
+19:42.000 --> 00:19:47.364
+We are presented with a list of results,
+
+00:19:47.464 --> 00:19:53.999
+which are identifiers starting with Read with capital R.
+
+19:54.000 --> 00:19:57.204
+They also show where they are defined
+
+00:19:57.304 --> 00:20:06.999
+and the documentation, just like in eldoc.
+
+20:07.000 --> 00:20:13.844
+One can also directly jump to the identifier
+
+00:20:13.944 --> 00:20:19.999
+in the mini-buffer results.
+
+20:20.000 --> 00:20:21.924
+For example, we want to check out this Read2
+
+00:20:22.024 --> 00:20:27.999
+defined in base-4.12.0.0 Data.Functor.Classes
+
+20:28.000 --> 20:33.999
+There we go.
+
+20:34.000 --> 00:20:37.764
+Another functionality of hcel
+
+00:20:37.864 --> 00:20:40.999
+is the help buffer integration.
+
+20:41.000 --> 00:20:46.564
+We can do hcel-help and then let's say
+
+00:20:46.565 --> 00:20:52.644
+we want to learn about the read type class.
+
+00:20:52.744 --> 00:20:55.084
+This is a help buffer
+
+00:20:55.184 --> 00:21:00.804
+and you can jump to other definitions
+
+00:21:00.904 --> 00:21:02.364
+within the help buffer
+
+00:21:02.464 --> 00:21:06.999
+to read the documentation like readsPrec.
+
+21:07.000 --> 21:10.999
+It says Server version cannot be satistifed. Actual version.
+
+21:11.000 --> 00:21:14.684
+This means we need to tell hecl
+
+00:21:14.784 --> 00:21:16.999
+that the server has the correct version.
+
+21:17.000 --> 00:21:21.644
+hecl-fetch-server-version.
+
+00:21:21.744 --> 00:21:25.604
+Wait a bit for it to update
+
+00:21:25.704 --> 00:21:26.999
+the knowledge of the server version.
+
+21:27.000 --> 21:32.999
+Now you can follow the links, Read, readsPrec.
+
+21:33.000 --> 21:37.999
+You can do the "l" and "r" to navigate within the history.
+
+21:38.000 --> 21:42.999
+ReadS, ReadP.
+
+21:43.000 --> 00:21:45.924
+Just like in the help buffer for elisp code,
+
+00:21:46.024 --> 00:21:52.999
+you can jump to the definition.
+
+21:53.000 --> 21:59.999
+I believe that is everything, more or less.
+
+22:00.000 --> 22:04.999
+That concludes the demo.
+
+22:05.000 --> 00:22:07.044
+Now let's turn to haddorg,
+
+00:22:07.144 --> 00:22:08.999
+which is an Org backend for Haddock.
+
+22:09.000 --> 22:12.999
+Haddock is the documentation generator for Haskell packages.
+
+22:13.000 --> 00:22:15.044
+For example,
+
+00:22:15.144 --> 00:22:21.999
+the official Haskell package documentation website Hackage,
+
+22:22.000 --> 00:22:25.804
+all the documentation there is generated by Haddock
+
+00:22:25.904 --> 00:22:27.999
+into the HTML format.
+
+22:28.000 --> 00:22:31.324
+Haddock has several backends
+
+00:22:31.424 --> 00:22:34.284
+that convert the intermediate representation
+
+00:22:34.384 --> 00:22:36.964
+called interface to various output formats,
+
+00:22:37.064 --> 00:22:41.764
+including HTML, LaTeX, and Hugo.
+
+00:22:41.864 --> 00:22:44.804
+HTML is the main format with a lot of features.
+
+00:22:44.904 --> 00:22:48.999
+LaTeX is less so, and I don't think it is widely used.
+
+22:49.000 --> 22:52.999
+Let's have a look at an HTML example.
+
+22:53.000 --> 00:23:01.084
+This is a PDF because these HTML files can be rather large
+
+00:23:01.184 --> 00:23:06.999
+and slow down EWW significantly.
+
+23:07.000 --> 00:23:10.164
+It's faster to convert it to PDF
+
+00:23:10.264 --> 00:23:16.999
+and read it from pdf-tools.
+
+23:17.000 --> 00:23:20.764
+Looks like this is as big as it goes.
+
+00:23:20.864 --> 00:23:26.044
+I hope you can still see it.
+
+00:23:26.144 --> 00:23:30.044
+Can I still enlarge it a bit more? Maybe.
+
+00:23:30.144 --> 00:23:32.964
+This is Servant.Server.
+
+00:23:33.064 --> 00:23:35.999
+It is a module in the servant-server package.
+
+23:36.000 --> 23:41.999
+It is a widely used package for writing servers.
+
+23:42.000 --> 00:23:49.804
+It starts with a heading, which is the name of the module,
+
+00:23:49.904 --> 00:23:52.684
+and the table of contents.
+
+00:23:52.784 --> 00:23:55.999
+Then a heading: Run an wai application from an API.
+
+23:56.000 --> 00:24:00.804
+Under this heading, there are all the relevant identifiers
+
+00:24:00.904 --> 00:24:08.524
+that is concerned with running a WAI application from API,
+
+00:24:08.624 --> 00:24:13.204
+including serve, which is one of the main entry points
+
+00:24:13.304 --> 00:24:15.524
+for a Servant.Server.
+
+00:24:15.624 --> 00:24:21.604
+It has a signature linkable to the other identifiers,
+
+00:24:21.704 --> 00:24:23.004
+the documentation,
+
+00:24:23.104 --> 00:24:26.644
+an example with a Haskell source code block.
+
+00:24:26.744 --> 00:24:30.999
+That's what HTML output looks like.
+
+24:31.000 --> 00:24:33.924
+As I mentioned,
+
+00:24:34.024 --> 00:24:35.804
+there are several downsides or drawbacks with that,
+
+00:24:35.904 --> 00:24:40.999
+like the HTML files can be huge and slow down EWW.
+
+24:41.000 --> 00:24:46.124
+Also, every module is an HTML of itself,
+
+00:24:46.224 --> 00:24:48.284
+and there's also an HTML for the package
+
+00:24:48.384 --> 00:24:49.999
+with a list of all the modules.
+
+24:50.000 --> 00:24:54.644
+Whereas the Org backend
+
+00:24:54.744 --> 00:25:04.164
+is better in that it is much more compact.
+
+00:25:04.264 --> 00:25:07.404
+All the modules under the same package
+
+00:25:07.504 --> 00:25:10.684
+are included in one Org file
+
+00:25:10.784 --> 00:25:12.999
+as sub-headings, level 2 headings.
+
+25:13.000 --> 00:25:19.404
+So, servant-server, Servant.Server, that is the module.
+
+00:25:19.504 --> 00:25:21.844
+So basically, this level 2 heading
+
+00:25:21.944 --> 00:25:24.999
+contains all the information in this PDF.
+
+25:25.000 --> 25:28.999
+Run the WAI application from API, serve.
+
+25:29.000 --> 00:25:39.124
+It has a signature that links to other identifiers
+
+00:25:39.224 --> 00:25:41.999
+and the documentation that's also linkable.
+
+25:42.000 --> 00:25:47.124
+The Haskell source block is now an Org source block,
+
+00:25:47.224 --> 00:25:49.404
+and you can do all sorts of interesting things
+
+00:25:49.504 --> 00:25:52.644
+with it using org-babel.
+
+00:25:52.744 --> 00:25:55.999
+Let's check the links as server.
+
+25:56.000 --> 25:59.999
+Right, so the link works.
+
+26:00.000 --> 00:26:05.284
+Application, right, Request.
+
+00:26:05.384 --> 00:26:08.284
+It also supports cross-packaging package linking,
+
+00:26:08.384 --> 00:26:12.204
+so following the link to request
+
+00:26:12.304 --> 00:26:17.524
+takes us from servant-server package Org documentation
+
+00:26:17.624 --> 00:26:24.684
+to the WAI Org documentation.
+
+00:26:24.784 --> 00:26:27.444
+Another nice thing with Org documentation
+
+00:26:27.544 --> 00:26:32.644
+is that you can use Org functions
+
+00:26:32.744 --> 00:26:40.444
+like org-goto to jump to any identifiers.
+
+00:26:40.544 --> 00:26:45.804
+Let's say we want to jump to application.
+
+00:26:45.904 --> 00:26:49.999
+We have toApplication. So it jumpts to toApplication.
+
+26:50.000 --> 00:26:53.924
+I guess application is not an identifier,
+
+00:26:54.024 --> 00:26:55.724
+yes, it is more like a type alias,
+
+00:26:55.824 --> 00:26:58.564
+that's why we couldn't find it.
+
+00:26:58.664 --> 00:27:00.999
+So that is haddorg.
+
+27:01.000 --> 00:27:06.004
+And of course, I implemented a bit of integration
+
+00:27:06.104 --> 00:27:08.444
+between haddorg and hcel
+
+00:27:08.544 --> 00:27:11.204
+so that we can jump from one to the other.
+
+00:27:11.304 --> 00:27:14.999
+Let's go back to servant.
+
+27:15.000 --> 27:23.999
+Let's see, ServerT.
+
+27:24.000 --> 00:27:27.004
+Maybe we want to check out
+
+00:27:27.104 --> 00:27:31.844
+the source code definition of ServerT.
+
+00:27:31.944 --> 00:27:36.164
+To find out exactly what sort of type alias it is,
+
+00:27:36.264 --> 00:27:43.084
+like what is the alias (or type synonym)
+
+00:27:43.184 --> 00:27:49.404
+We run hcel-identifier-at-point--
+
+00:27:49.504 --> 00:27:52.244
+sorry, hcel-haddorg-to-hcel-definition...
+
+00:27:52.344 --> 00:27:54.999
+Oh, we have an HTTP error.
+
+27:55.000 --> 27:58.999
+Typ ServerT not found in module src/Servant/Server.hs
+
+27:59.000 --> 00:28:01.124
+Why? Well, this is because
+
+00:28:01.125 --> 00:28:04.844
+the HCEL server only understands,
+
+00:28:04.944 --> 00:28:07.724
+it only has knowledge of identifiers
+
+00:28:07.824 --> 00:28:11.999
+that is defined in the original source file.
+
+28:12.000 --> 00:28:17.084
+So, it is not aware of, say,
+
+00:28:17.184 --> 00:28:20.999
+identifiers that are re-exported in the module.
+
+28:21.000 --> 00:28:25.724
+Most likely, Servant.Server module re-exports ServerT
+
+00:28:25.824 --> 00:28:28.604
+from another module.
+
+00:28:28.704 --> 00:28:29.644
+We will probably have better luck
+
+00:28:29.744 --> 00:28:34.999
+looking into some internal modules like this one.
+
+28:35.000 --> 28:38.999
+Let's try this type class HasContextEntry.
+
+28:39.000 --> 28:41.999
+So this time it worked.
+
+28:42.000 --> 00:28:44.244
+And, of course, we can go the other direction
+
+00:28:44.344 --> 00:28:47.999
+from hecl to haddorg.
+
+28:48.000 --> 00:28:51.484
+Let's say if we want to display named context
+
+00:28:51.584 --> 00:28:53.999
+in the haddorg documentation
+
+28:54.000 --> 00:29:01.524
+so that we can read about, other identifiers documentation
+
+00:29:01.624 --> 00:29:03.999
+that is related to named context.
+
+29:04.000 --> 29:07.999
+We do hecl-identifier-at-point-to-haddorg
+
+29:08.000 --> 29:13.999
+And it does take us to the server-server old file.
+
+29:14.000 --> 29:17.999
+Okay.
+
+29:18.000 --> 29:20.999
+And that concludes my presentation.
+
+29:21.000 --> 00:29:23.484
+You can find hecl in GNU Elpa,
+
+00:29:23.584 --> 00:29:24.999
+and you can also find the source code,
+
+29:25.000 --> 00:29:27.364
+as well as the source of haddorg
+
+00:29:27.464 --> 00:29:29.764
+and instructions on how to generate org documentation
+
+00:29:29.864 --> 00:29:32.999
+using haddorg in my cgit instance.
+
+29:33.000 --> 00:29:36.684
+Thank you for your attention.
+
+00:29:36.784 --> 00:29:37.999
+I hope you enjoy the rest of the conference.
+
+29:38.000 --> 29:51.000
+Thank you.
diff --git a/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.vtt b/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.vtt
new file mode 100644
index 00000000..85fd117d
--- /dev/null
+++ b/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.vtt
@@ -0,0 +1,653 @@
+WEBVTT
+
+00:00.000 --> 00:13.920
+And we are live. Hello again, everyone. It's been a while. I've been on break for the last
+
+00:13.920 --> 00:19.000
+one hour. It feels like I've been really far. I'm with David. Hi, David. How are you doing?
+
+00:19.000 --> 00:23.360
+Hi, Leo. I'm good. Thank you for having me on.
+
+00:23.360 --> 00:26.480
+So David, you do have the pad open in front of you.
+
+00:26.480 --> 00:27.480
+That's right.
+
+00:27.480 --> 00:32.800
+Yes. I think Sasha is putting up the pad for us so that they don't have to look at my very
+
+00:32.800 --> 00:38.520
+tiny face on BBB. I'm very small. I'm trying to push the boundaries. David, if you want
+
+00:38.520 --> 00:44.320
+to take some questions, I'm sorry, I've got hells whispering in my ears at the same time.
+
+00:44.320 --> 00:49.800
+Give me just a second. David, can you maybe read the first question and try to answer
+
+00:49.800 --> 00:50.800
+them?
+
+00:50.800 --> 00:58.640
+Sure. Question one. Excuse me. Do you use this just for yourself or do you use this
+
+00:58.640 --> 01:04.160
+to discuss or show with doctors or health professionals? The answer is it is useful
+
+01:04.160 --> 01:10.880
+for me and it's useful for health care providers. So it's not I'm not just able to see connections
+
+01:10.880 --> 01:15.440
+myself, even if we're not seeing a connection. If I'm talking to someone, if I'm talking
+
+01:15.440 --> 01:20.640
+to a clinician, I have brought this in on a tablet. If it's an in-person thing or on
+
+01:20.640 --> 01:26.040
+the phone, if it's a video appointment with someone, just send it in an email. It's very
+
+01:26.040 --> 01:33.160
+convenient to just send the graph around as a screenshot. So it's definitely been really
+
+01:33.160 --> 01:40.920
+useful to because one thing that I touch on in the talk is that let's say that we're talking
+
+01:40.920 --> 01:45.880
+about depression, for example. Let's say, oh, well, how have you been sleeping this
+
+01:45.880 --> 01:49.440
+week? Well, if you had objective information, that's perfect. Go ahead.
+
+01:49.440 --> 01:53.840
+Oh, sorry. I was mispressing my button for production. You're good.
+
+01:53.840 --> 01:59.960
+Oh, it just caught a little clip of sound. I see. Okay. Sorry. Yes. So where was I? I
+
+01:59.960 --> 02:05.960
+would say, okay, so on the one hand, having objective information is good not only for
+
+02:05.960 --> 02:09.360
+you, but when it's time to speak to someone and give them a picture of what's going on,
+
+02:09.360 --> 02:14.800
+you don't have to generalize. Even if you're having a good day, generalizing can be really
+
+02:14.800 --> 02:19.300
+like, oh, well, how are you sleeping? Oh, well, this day I woke up that, but which way
+
+02:19.300 --> 02:22.720
+was that Wednesday or Thursday? And then I remember this friend came over, so it must
+
+02:22.720 --> 02:29.000
+have been Friday. That's not I've discovered that actually just first thing in the morning
+
+02:29.000 --> 02:33.720
+waking up recording. How many pieces of gum did I have yesterday? How much did I sleep?
+
+02:33.720 --> 02:40.000
+Okay. So someone else, this segues right into the next question. How do you input the health
+
+02:40.000 --> 02:46.120
+data? Semi-automated with Org Mode capture templates, copy paste, automated with a smart
+
+02:46.120 --> 02:51.080
+watch, and if this, then that. Tasker, Org Mode document to automatically add stuff like
+
+02:51.080 --> 02:57.040
+sleeping data. Which parts are and are not automated? Okay. So it turns out I'm using
+
+02:57.040 --> 03:03.320
+an Org Mode capture template to automate the insertion of all the little category tags
+
+03:03.320 --> 03:10.600
+in the property drawer, but not the values. I'm not using a smart watch or anything whatsoever.
+
+03:10.600 --> 03:17.560
+I am just, I look at the clock when I go to bed and I look at the bed when I wake, look
+
+03:17.560 --> 03:21.480
+at the clock when I wake up. The very first thing I do is turn on my computer and turn
+
+03:21.480 --> 03:30.160
+on Emacs and enter that data. So, you know, it would be really cool if we could get some
+
+03:30.160 --> 03:35.120
+kind of data, you know, because if it's all, you know, if it's be able to be massaged into
+
+03:35.120 --> 03:40.760
+Org Mode format, it can then go into Org GNU plot. Or maybe you could cut Org Mode out
+
+03:40.760 --> 03:45.600
+of the equation if you find a way to go directly from that data to either CSV, which Org Mode,
+
+03:45.600 --> 03:50.760
+I'm sorry, which GNU plot can read, or, you know, whether you have to wear a little script
+
+03:50.760 --> 03:56.560
+in between. And the next question, how do you track the various health statistics that
+
+03:56.560 --> 04:02.720
+you're gathering? The ones, you know, for example, nicotine is an estimate. I'm pretty
+
+04:02.720 --> 04:08.460
+sure it was six. It was pretty sure it was seven. You know what I mean? It's pretty close
+
+04:08.460 --> 04:12.820
+because I do count and I think I could at most be off by one or two. So it's not fatal
+
+04:12.820 --> 04:16.980
+to the enterprise of collecting data. The same thing with sleep. I look at the clock,
+
+04:16.980 --> 04:23.240
+but I only count half hours. I say, oh, I slept seven hours, you know, seven and a half.
+
+04:23.240 --> 04:28.280
+It's very much a back of the napkin thing, but it's precise enough overall that as you
+
+04:28.280 --> 04:33.240
+can see from the data in the talk, you can see that my sleep declined pretty steadily
+
+04:33.240 --> 04:38.160
+over the course of that. So even if some of the values are off a little bit, you're still
+
+04:38.160 --> 04:44.060
+seeing trends and you can still see connections. So it's not perfect. I would love to have
+
+04:44.060 --> 04:49.680
+some type of more automated data, but all right. So I'm going to move on to the next
+
+04:49.680 --> 04:56.280
+question. It's possible to download data from Apple Watch's health app. Is it easy enough
+
+04:56.280 --> 05:07.000
+to incorporate those.csv files into your implementation of gnuplot? Okay. So I think
+
+05:07.000 --> 05:10.680
+what it would involve if you wanted to use my template generator, it would involve making
+
+05:10.680 --> 05:17.880
+your template, but then modifying the gnuplot script to read from that file instead of from
+
+05:17.880 --> 05:27.200
+an org mode table. So I think that what you would want to do is select the, yeah, I mean,
+
+05:27.200 --> 05:33.680
+and if you want, you know, I'll be around in the IRC after and I might even be able
+
+05:33.680 --> 05:38.200
+to look at their documentation or something, just even just give a peek at it to give a
+
+05:38.200 --> 05:39.640
+better answer to this question.
+
+05:39.640 --> 05:45.640
+Cool. And just to remind everyone, so, sorry, let me try to put up, okay. I did crush Dev
+
+05:45.640 --> 05:49.400
+earlier when trying to switch window. Oh, okay. I managed to do it. Yes, I still have
+
+05:49.400 --> 05:58.240
+it in me. So let me, slightly later, we will also be opening the discussion. So this BBB
+
+05:58.240 --> 06:01.520
+instance in which we are currently, we will be opening it so that people can come in with
+
+06:01.520 --> 06:06.160
+questions and maybe you're considering the personal nature of this talk, you know, maybe
+
+06:06.160 --> 06:11.520
+try to be a little wary of sharing personal information, especially if the stream is live,
+
+06:11.520 --> 06:17.000
+but otherwise you can have a chat with David, provide to David you're still available in,
+
+06:17.000 --> 06:21.880
+you know, 10, 20 minutes and feel free to come in and ask questions because really that's
+
+06:21.880 --> 06:26.480
+what Emacs Conf is about. It's about getting in touch with the speakers and this is the
+
+06:26.480 --> 06:30.200
+opportunity that you have to have a one-on-one with them rather than an asynchronous one
+
+06:30.200 --> 06:34.120
+with a pad. Sorry for the interruption. I just felt I remember. We're probably going
+
+06:34.120 --> 06:38.080
+to open the chat in about five to 10 minutes. We still have a lot of questions and I know
+
+06:38.080 --> 06:42.280
+I'd prefer if David focused on those questions. So please go ahead, David.
+
+06:42.280 --> 06:48.800
+Thank you so much, Leo. And yes, I am available for after, so I'll stick around. Okay. So
+
+06:48.800 --> 06:54.120
+regarding the medication tracking, you only have the option to record missed or not. If
+
+06:54.120 --> 06:58.280
+one needs to take multiple medications throughout the day, how would you propose to track that
+
+06:58.280 --> 07:05.240
+within GNU plot or separate? Okay. Yeah, as it is, I don't record which medication because
+
+07:05.240 --> 07:12.600
+it's the one I miss is typically just the same one. So the deal is, is that you would
+
+07:12.600 --> 07:19.660
+probably want to, you could count it as either doses or milligrams. The problem with tracking
+
+07:19.660 --> 07:27.660
+as milligrams, and yes, you would want to use separate variables for those. And probably
+
+07:27.660 --> 07:36.080
+what would make sense is either to record some lines as doses, meaning that one, whatever
+
+07:36.080 --> 07:43.040
+that ends up being, if it's a tablet or if it's the proper dose. And then that way, if
+
+07:43.040 --> 07:47.100
+one medication is late and another is not, or whatever you need to record, they're on
+
+07:47.100 --> 07:54.440
+separate lines, separate columns of the CSV file or I'm sorry, not CSV file of your org
+
+07:54.440 --> 08:04.540
+mode, separate property drawer entries in your capture template. I'm trying to think.
+
+08:04.540 --> 08:08.520
+It would be a little bit more work, but you could track that. The problem with tracking
+
+08:08.520 --> 08:13.760
+milligrams is that some medications, you would have a large range on the chart because some
+
+08:13.760 --> 08:18.320
+medications are a few milligrams and some medications are lots and lots for a dose.
+
+08:18.320 --> 08:27.720
+So tracking it as single doses might make sense. All right. So how's the workflow? This
+
+08:27.720 --> 08:32.120
+is the next question here. How's the workflow when working on the canoe plot code? Can you
+
+08:32.120 --> 08:38.560
+control C, control C and the SVG output on the right is updated automatically? The answer
+
+08:38.560 --> 08:46.200
+is yes. You can use something called auto revert tail mode. So you hit meta X to get
+
+08:46.200 --> 08:53.040
+the command and then auto revert tail mode. And that will cause the SVG file to automatically
+
+08:53.040 --> 08:58.840
+update every time you hit control C, control C on the canoe plot file, provided that you're
+
+08:58.840 --> 09:07.680
+viewing the same file that the canoe plot is going to overwrite. Let's see. Question.
+
+09:07.680 --> 09:13.000
+How much time does it take to process the amount of data that you add inside canoe Emacs?
+
+09:13.000 --> 09:21.360
+So at this point I have three or four months of data and it takes to update the whole thing,
+
+09:21.360 --> 09:27.360
+like, you know, get capture all the entries. It takes like a second or two. And this is
+
+09:27.360 --> 09:31.200
+a pretty decent PC. So we're not talking about something that takes a long time each day
+
+09:31.200 --> 09:39.840
+I updated. It's just, it's done pretty quick. All right. Next question. Will indent guide
+
+09:39.840 --> 09:45.120
+behave well with YAML files for Helm? I don't know the answer to that. Indent guide is really
+
+09:45.120 --> 09:52.720
+nice and it seems to behave pretty reasonably, but I wouldn't be able to speak to that.
+
+09:52.720 --> 09:59.280
+Okay. Just a quick interruption. So we have opened the chats now for people to join us
+
+09:59.280 --> 10:04.360
+on BBB. So you can go to the talk page on Emacs. You go to David's talk, which is called
+
+10:04.360 --> 10:08.760
+health and you should be able to join the BBB. So if you have questions that you'd like
+
+10:08.760 --> 10:13.800
+to ask with your voice to David, feel free to join us. And David, in the meantime, you
+
+10:13.800 --> 10:16.960
+can reply to the last question you have.
+
+10:16.960 --> 10:22.880
+Okay. Thank you. Great. The last question is, have you noticed your behavior changing
+
+10:22.880 --> 10:29.000
+as a result of tracking your data? And the answer is yes. The accountability has given,
+
+10:29.000 --> 10:36.160
+it draws habits, good or bad habits. It illustrates them in sharp relief. All of a sudden it's
+
+10:36.160 --> 10:44.440
+very clear what's going on, what's not going on. And it illuminates a sense of fog because
+
+10:44.440 --> 10:49.080
+it's hard to generalize when your awareness is changing over time. It's hard to generalize
+
+10:49.080 --> 10:53.560
+about what's going on each day and having the objective information. Yes, I'd say it
+
+10:53.560 --> 10:57.080
+has changed my behavior in a good way.
+
+10:57.080 --> 11:04.240
+I mean, that's a very good thing, I suppose. The whole point of tracking so much stuff,
+
+11:04.240 --> 11:07.680
+tracking people, it's an interesting angle that you have because you're creating data
+
+11:07.680 --> 11:12.320
+on a lot of health aspects. And people usually when they talk about using Emacs to better
+
+11:12.320 --> 11:16.000
+their life, they talk about all, they talk about getting things done. They talk about
+
+11:16.000 --> 11:22.560
+all the usual suspects when it comes to task organization. But plotting over time is something
+
+11:22.560 --> 11:27.120
+that is technically possible and that people talk about, but I feel like you've gone way
+
+11:27.120 --> 11:32.720
+far into this particular topic. So well done you. And you feel as a result you have a particular
+
+11:32.720 --> 11:40.800
+insight into seeing the curves evolve basically over time. And I think it provides very interesting
+
+11:40.800 --> 11:46.760
+data, something that is more easily understandable than just a list of to-dos in an agenda over
+
+11:46.760 --> 11:47.760
+time.
+
+11:47.760 --> 11:54.320
+Yeah. And what's nice is that I still can have to-dos and notes in that same file that
+
+11:54.320 --> 12:00.600
+produces my chart and that has all the data in it. And I keep that in version control,
+
+12:00.600 --> 12:05.040
+which stays in a private repo. And what's nice about that is everything's backed up.
+
+12:05.040 --> 12:11.920
+You know what I mean? Pardon me. I'm going to have a sip of water here.
+
+12:11.920 --> 12:19.680
+Please do. I mean, I'm actually down to termite. It's the good floral for thermos. And I've
+
+12:19.680 --> 12:23.120
+down two since we started EmacsCon today.
+
+12:23.120 --> 12:30.680
+Oh, wow. Yeah. And so I lost my train of thought.
+
+12:30.680 --> 12:36.840
+Take your time to find it. We still have about eight minutes of Q&A. By the way, I'll remind
+
+12:36.840 --> 12:41.200
+people we have opened the BBB room. So if you want to join us and ask live questions
+
+12:41.200 --> 12:56.120
+to David, feel free to do so. I'm sorry. Could you repeat that? I was asking you if you found
+
+12:56.120 --> 12:59.000
+the train of thought again.
+
+12:59.000 --> 13:08.480
+Hold on. Hold on. The last question, have I noticed behavior changing? Yeah. Then we
+
+13:08.480 --> 13:12.400
+talked about, oh, I talked about the fact that you can have to do the notes and appointments
+
+13:12.400 --> 13:18.080
+and all that kind of stuff. Like, for example, one of my next. Well, oh, now I remember the
+
+13:18.080 --> 13:22.560
+point that I was going to get into. The point is that once I have this routine of getting
+
+13:22.560 --> 13:28.600
+up every single morning and first thing, putting in my information. That habit, I feel like
+
+13:28.600 --> 13:33.200
+build on. For example, I added a new variable the other day. You know, I can add I thought
+
+13:33.200 --> 13:37.920
+of something. I'm like, hey, I should track that in my data. It reminds me I say, hey,
+
+13:37.920 --> 13:41.080
+there's not enough green triangles. I need to get some exercise this week. You know,
+
+13:41.080 --> 13:48.520
+the weather, I haven't wanted to get outside because the weather's been so dismal. So it's
+
+13:48.520 --> 13:58.240
+absolutely been a game changer. It really has been. And it doesn't have to be. Oh, go
+
+13:58.240 --> 14:04.880
+ahead. Go ahead. No, no, no. I was going to say that it's really good to hear that software
+
+14:04.880 --> 14:10.080
+can have such a potent impact, just the ability to track your data over time. Because the
+
+14:10.080 --> 14:14.480
+thing is, I think whatever you're feeling, you know, whenever you have mental ailments
+
+14:14.480 --> 14:20.320
+or whatnot, it's really hard to to have a healthy relationship to the chronology of
+
+14:20.320 --> 14:26.360
+feeling better. And it's easy to get lost into the immediate sensation. But I feel like
+
+14:26.360 --> 14:30.120
+being able to track over time that, you know, this daily checking in that you do in the
+
+14:30.120 --> 14:34.760
+morning of keeping track of your health data. I think it's the first step that shows you
+
+14:34.760 --> 14:42.800
+over time that, oh, yes, I am actually feeling better. And so as a result, being able to
+
+14:42.800 --> 14:50.440
+visually see, oh, yes, I am actually doing better. It must be reassuring, I assume.
+
+14:50.440 --> 14:55.060
+It is. I think that's a really interesting turn of phrase you had there earlier when
+
+14:55.060 --> 15:02.840
+you said it's harder to have a healthy relationship to the chronology of getting better. I think
+
+15:02.840 --> 15:10.160
+those were your exact words there. You know, the idea that, you know, if you've got to
+
+15:10.160 --> 15:16.080
+manage something, if you've got to roll with the punches, then seeing what you've accomplished,
+
+15:16.080 --> 15:21.440
+seeing yourself bounce back, you know, and then being able to see a trend, you might
+
+15:21.440 --> 15:26.920
+not notice unless you're tracking per the clock that sleep has started to decline and
+
+15:26.920 --> 15:33.880
+that it's time to start keeping your eye out. And it is reassuring, and you're right about
+
+15:33.880 --> 15:37.920
+that, you know. It's not always easy to be in the mindset of saying, hey, these lines
+
+15:37.920 --> 15:39.960
+move and they'll move again.
+
+15:39.960 --> 15:46.560
+Yeah, and I feel also it's kind of like having a scientific take on your well-being because
+
+15:46.560 --> 15:53.960
+you are parameter, okay, really tough word to say for the Frenchman that I am, but parameterizing
+
+15:53.960 --> 15:58.720
+the elements of your life, such as sleep, and we already have sleep is already more
+
+15:58.720 --> 16:03.960
+or less of a parameter in our lives. You know, we know, oh, you should sleep at least eight
+
+16:03.960 --> 16:08.820
+hours. You should have one hour, 30 blocks of sleep all the time. So this is a well parameterized
+
+16:08.820 --> 16:13.960
+element of our lives. But other elements that you're doing or the conflation of different
+
+16:13.960 --> 16:19.360
+curves feels like it's pointing out, it's providing more data and being able to see
+
+16:19.360 --> 16:23.920
+the trend, which is a key word in your presentation in what you do. I think that's really good.
+
+16:23.920 --> 16:28.800
+Chronology and trends and being able to see what works. I just have this example crossing
+
+16:28.800 --> 16:33.360
+my mind. Some people are plagued with canker sores, which are really nasty stuff that you
+
+16:33.360 --> 16:38.040
+get in mouth. But more often than not, it's really hard to track why you're getting them.
+
+16:38.040 --> 16:42.600
+A lot of people say it's due to stress or to poor sleep or to deficiency in iron or
+
+16:42.600 --> 16:47.780
+whatnot, or you're toothpaste. You might have understood that I actually suffer from them.
+
+16:47.780 --> 16:52.240
+So I actually know a lot of the reasons. But being able to track health data like this
+
+16:52.240 --> 16:57.560
+feels like it would be able to correlate the appearance of canker sores with maybe poor
+
+16:57.560 --> 17:03.240
+sleep or maybe changing medication or maybe stress at work or stuff like this. I really
+
+17:03.240 --> 17:06.240
+like this stance and I think you're really onto something here.
+
+17:06.240 --> 17:12.960
+Yeah. And if people wanted to chat about that more in terms of putting people's heads together,
+
+17:12.960 --> 17:19.120
+because let's say someone who has a more sophisticated medication tracking need, maybe they come
+
+17:19.120 --> 17:23.760
+up with a solution and they share their config. There's one thing I didn't talk about in the
+
+17:23.760 --> 17:31.580
+talk, which is I had one line where I have a formula instead, because Canoe can plot
+
+17:31.580 --> 17:36.760
+all kinds of formulas. So I have it plot an overall trouble score, which I did not show
+
+17:36.760 --> 17:45.520
+in the video, but I had it assigned three points for every hour above or below the goal
+
+17:45.520 --> 17:49.360
+of eight hours. So too much would give me lots of points on the trouble and too little
+
+17:49.360 --> 17:54.880
+will give me lots of points. So the relation to the goal or whatever, if stress is high,
+
+17:54.880 --> 18:00.920
+then the overall, if the anxiety line is high, then the overall trouble line should get high.
+
+18:00.920 --> 18:06.800
+And what I found is that that trouble line really did track with my recollection of
+
+18:06.800 --> 18:12.560
+how the last few weeks had gone. And so that trouble line is, you can see when it's trending
+
+18:12.560 --> 18:21.600
+even if it's not super obvious from the other lines. And maybe I'll share that too.
+
+18:21.600 --> 18:28.400
+All right, David, we are about at the end of time for the Q&A. Thank you so much for
+
+18:28.400 --> 18:33.000
+answering all the questions. I think it was very valuable to not only have your long presentation,
+
+18:33.000 --> 18:37.080
+which was very detailed, but also have this Q&A where you got the chance to answer one,
+
+18:37.080 --> 18:41.240
+two, three, four, five, more than seven questions, which is great.
+
+18:41.240 --> 18:46.960
+That's fantastic. And thank you so much for joining in and for being here. And thank you
+
+18:46.960 --> 18:51.720
+for having me at the conference. It's really amazing to be part of the community. And I'm
+
+18:51.720 --> 18:56.720
+happy to stick around. Do you want me to drop to IRC or just keep answering questions in
+
+18:56.720 --> 19:01.500
+voice? I don't think they're going to go on the pad, are they?
+
+19:01.500 --> 19:05.760
+So actually what we can do, we can leave the BBB room standing for now. If people want
+
+19:05.760 --> 19:10.240
+to join, they can do so. Maybe Corwin will come back to close the room afterwards. But
+
+19:10.240 --> 19:13.140
+for now, you can stay in the room. And if people want to unmute themselves after we
+
+19:13.140 --> 19:15.800
+go off stream, that would be good.
+
+19:15.800 --> 19:18.720
+So we are about to go into the next talk in about 30 seconds. Let me just talk to production
+
+19:18.720 --> 19:28.360
+real quick. So, yes, we are going to go into the next talk pretty soon. You should still
+
+19:28.360 --> 19:35.000
+be able to hear me, I think. Nope, they cannot. Okay. Well, David, I leave you in the room.
+
+19:35.000 --> 19:41.360
+I'll be in touch within five minutes to see if people are not showing up.
+
+19:41.360 --> 19:42.360
+Thank you, Leo.
+
+19:42.360 --> 19:48.160
+Yes, sorry. I'm dealing with many things at the same time. So I'm going to stop the recording.
+
+19:48.160 --> 19:52.680
+No, I'm going to leave the recording on. Is there anyone in the room that want to unmute?
+
+19:52.680 --> 19:56.760
+We are not on the stream anymore now. Does anyone want to say something or talk with
+
+19:56.760 --> 20:04.260
+David? Or do we want to close the room?
+
+20:04.260 --> 20:09.440
+Even if it's just by line. Okay, cool. So what are we going to do then? David, thank
+
+20:09.440 --> 20:14.080
+you so much for your time. We're actually going to close the room right now. I'm going
+
+20:14.080 --> 20:35.200
+to stop the recording.
+
diff --git a/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main--chapters.vtt b/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main--chapters.vtt
new file mode 100644
index 00000000..6a8625f8
--- /dev/null
+++ b/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main--chapters.vtt
@@ -0,0 +1,56 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:33.639
+Introduction
+
+00:00:33.640 --> 00:01:59.439
+How to take daily health journal items
+
+00:01:59.440 --> 00:03:37.199
+How to set up your org templates
+
+00:03:38.320 --> 00:04:16.839
+How to do it in GNU Emacs
+
+00:04:16.840 --> 00:04:51.959
+Overview of the presentation
+
+00:04:51.960 --> 00:05:52.799
+The journal
+
+00:05:52.800 --> 00:06:51.319
+The capture buffer
+
+00:06:51.320 --> 00:08:03.479
+The columnview table
+
+00:08:03.480 --> 00:09:03.319
+Gnuplot
+
+00:09:03.320 --> 00:10:15.479
+Output parameters
+
+00:10:15.480 --> 00:13:05.919
+Time series data
+
+00:13:05.920 --> 00:14:22.679
+Health variables
+
+00:14:22.680 --> 00:15:11.999
+Goal lines
+
+00:15:12.000 --> 00:17:35.559
+The Gnuplot command
+
+00:17:35.560 --> 00:19:11.479
+The template generator
+
+00:19:11.480 --> 00:21:40.999
+The code that creates a template
+
+00:21:41.000 --> 00:24:09.919
+The power of the chart
+
+00:24:09.920 --> 00:24:29.240
+Thanks
diff --git a/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.vtt b/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.vtt
new file mode 100644
index 00000000..9cfd3030
--- /dev/null
+++ b/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.vtt
@@ -0,0 +1,1261 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:03.999
+Hi, this is Dave O'Toole, and today
+
+00:00:04.000 --> 00:00:07.799
+I'll be giving a presentation on tracking health data
+
+00:00:07.800 --> 00:00:12.759
+with Emacs, Org Mode, and Gnuplot.
+
+00:00:12.760 --> 00:00:16.079
+So Gnuplot is the well-known scientific
+
+00:00:16.080 --> 00:00:19.039
+and mathematical plotting application.
+
+00:00:19.040 --> 00:00:24.639
+You feed it text files full of names, dates, numbers,
+
+00:00:24.640 --> 00:00:27.199
+data points, and you get out a nice graph.
+
+00:00:27.200 --> 00:00:31.119
+You can spit out SVG. You can spit out PNG graphics.
+
+00:00:31.120 --> 00:00:33.639
+In this case, we're using an SVG.
+
+NOTE How to take daily health journal items
+
+00:00:33.640 --> 00:00:36.839
+What I'm going to show you today
+
+00:00:36.840 --> 00:00:39.839
+is how to take daily health journal items:
+
+00:00:39.840 --> 00:00:42.119
+in other words, things like I exercised
+
+00:00:42.120 --> 00:00:44.319
+such and such number of minutes today,
+
+00:00:44.320 --> 00:00:47.399
+I got X hours of sleep last night,
+
+00:00:47.400 --> 00:00:51.479
+I used such and such number of pieces of nicotine gum,
+
+00:00:51.480 --> 00:00:54.559
+say five pieces. So let's see,
+
+00:00:54.560 --> 00:00:58.439
+we've got this whole picture here, all right,
+
+00:00:58.440 --> 00:00:59.359
+and I've tracked here...
+
+00:00:59.360 --> 00:01:02.319
+This is a month of data from my life.
+
+00:01:02.320 --> 00:01:05.159
+This is... I'm not showing all the variables,
+
+00:01:05.160 --> 00:01:08.519
+but this is what I felt comfortable sharing
+
+00:01:08.520 --> 00:01:14.239
+in order to help people who might have a need to track,
+
+00:01:14.240 --> 00:01:15.919
+either because of a chronic condition,
+
+00:01:15.920 --> 00:01:18.599
+or just because of a health improvement goal
+
+00:01:18.600 --> 00:01:20.959
+or what have you, people who might need to
+
+00:01:20.960 --> 00:01:23.319
+track health data in a way
+
+00:01:23.320 --> 00:01:24.959
+that's a little bit more robust
+
+00:01:24.960 --> 00:01:26.599
+than just one or two variables
+
+00:01:26.600 --> 00:01:29.839
+and just weight or just blood pressure.
+
+00:01:29.840 --> 00:01:33.079
+So in this case, I've got exercise,
+
+00:01:33.080 --> 00:01:36.399
+I've got the number of hours of sleep,
+
+00:01:36.400 --> 00:01:38.559
+the number of doses of nicotine,
+
+00:01:38.560 --> 00:01:40.799
+(that's the yellow line here),
+
+00:01:40.800 --> 00:01:44.199
+and this is referring to nicotine gum.
+
+00:01:44.240 --> 00:01:45.559
+What we're going to be talking about
+
+00:01:45.560 --> 00:01:47.839
+is looking at connections, the idea
+
+00:01:47.840 --> 00:01:49.879
+that plotting your data can actually
+
+00:01:49.880 --> 00:01:52.119
+help you figure out what's going on.
+
+00:01:52.120 --> 00:01:53.079
+This is just one month.
+
+00:01:53.080 --> 00:01:55.439
+I've been doing this for a couple of months now,
+
+00:01:55.440 --> 00:01:57.559
+but I felt comfortable showing one month
+
+00:01:57.560 --> 00:01:59.439
+with a limited subset of the variables.
+
+NOTE How to set up your org templates
+
+00:01:59.440 --> 00:02:02.239
+What I'm going to be doing in this presentation
+
+00:02:02.240 --> 00:02:05.279
+is showing you how to set up your org templates
+
+00:02:05.280 --> 00:02:08.799
+so that you can, you know, hit a hotkey
+
+00:02:08.800 --> 00:02:11.839
+to capture today's data with an org template--
+
+00:02:11.840 --> 00:02:14.199
+or in this case yesterday's. Usually I'm saying, okay,
+
+00:02:14.200 --> 00:02:15.639
+yesterday this happened,
+
+00:02:15.640 --> 00:02:17.479
+because you don't know until the day's over
+
+00:02:17.480 --> 00:02:19.719
+how many pieces of nicotine gum you ate
+
+00:02:19.720 --> 00:02:21.439
+or how many hours you slept.
+
+00:02:21.440 --> 00:02:25.959
+So usually we're recording data for the previous day.
+
+00:02:25.960 --> 00:02:28.079
+We can set up a capture template
+
+00:02:28.080 --> 00:02:30.919
+so that it fills a little org entry. One for exercise,
+
+00:02:30.920 --> 00:02:34.279
+one for sleep, one for nicotine, one for distress.
+
+00:02:34.280 --> 00:02:36.919
+Here distress is just 1 to 10:
+
+00:02:36.920 --> 00:02:38.559
+how bad do you feel today?
+
+00:02:38.560 --> 00:02:41.639
+It's not a scientific measure, but you know,
+
+00:02:41.640 --> 00:02:43.359
+many, many things ask you to rate
+
+00:02:43.360 --> 00:02:47.119
+on a scale of 1 to 10, how bad is the anxiety,
+
+00:02:47.120 --> 00:02:49.639
+how bad is the general level of stress,
+
+00:02:49.640 --> 00:02:51.679
+and so without a lot of complication,
+
+00:02:51.680 --> 00:02:53.159
+I just rate that one to ten.
+
+00:02:53.160 --> 00:02:58.799
+Pain, okay, we won't have to get into any details,
+
+00:02:58.800 --> 00:03:00.959
+but if there is a level of chronic pain, well,
+
+00:03:00.960 --> 00:03:04.239
+I put that between 1 and 10. As we can see here,
+
+00:03:04.240 --> 00:03:07.319
+during the period that I've shown you, it's pretty low.
+
+00:03:07.320 --> 00:03:11.919
+There's some. If you miss a dose of medication,
+
+00:03:11.920 --> 00:03:13.599
+you can track that, in this case
+
+00:03:13.600 --> 00:03:17.639
+with a big ugly red triangle, you know.
+
+00:03:17.640 --> 00:03:24.279
+You can see, I can see here that in mid-, in late September,
+
+00:03:24.280 --> 00:03:29.199
+sorry, in early to mid-October,
+
+00:03:29.200 --> 00:03:30.999
+I stopped using the nicotine gum
+
+00:03:31.000 --> 00:03:32.959
+and probably should have cut down more gradually
+
+00:03:32.960 --> 00:03:34.759
+because my sleep suffered. Look at this.
+
+00:03:34.760 --> 00:03:37.199
+The sleep line is down here, okay?
+
+NOTE How to do it in GNU Emacs
+
+00:03:38.320 --> 00:03:39.519
+What I'm going to do now,
+
+00:03:39.520 --> 00:03:40.879
+now that I've shown you the graph
+
+00:03:40.880 --> 00:03:44.799
+and some of the things that are useful about it,
+
+00:03:44.800 --> 00:03:46.639
+I'm going to actually take a step back
+
+00:03:46.640 --> 00:03:50.319
+and show you from start to finish how you can do this
+
+00:03:50.320 --> 00:03:53.319
+in GNU Emacs, and I have a little template generator
+
+00:03:53.320 --> 00:03:56.279
+that you can use if you'd like.
+
+00:03:56.280 --> 00:03:59.919
+All right, so let's go back.
+
+00:03:59.920 --> 00:04:01.479
+Let's step back from this file.
+
+00:04:01.480 --> 00:04:07.599
+We're going to split the screen, and on the left side,
+
+00:04:07.600 --> 00:04:09.839
+I'm going to put the underlying Org file
+
+00:04:09.840 --> 00:04:10.919
+that generates this graph.
+
+00:04:10.920 --> 00:04:16.839
+Let me shrink that a little bit.
+
+NOTE Overview of the presentation
+
+00:04:16.840 --> 00:04:22.759
+All right, I'm going to work my way backwards
+
+00:04:22.760 --> 00:04:26.519
+from the template to the template generator,
+
+00:04:26.520 --> 00:04:28.439
+meaning that you'll be able to spit out,
+
+00:04:28.440 --> 00:04:31.839
+given your own specification of health variables,
+
+00:04:31.840 --> 00:04:33.519
+you'll be able to have it spit out
+
+00:04:33.520 --> 00:04:38.159
+a custom Gnuplot script like this
+
+00:04:38.160 --> 00:04:41.319
+that's preset up with the definitions
+
+00:04:41.320 --> 00:04:43.159
+for the column view in Org mode.
+
+00:04:43.160 --> 00:04:45.399
+I'm assuming a little bit of familiarity
+
+00:04:45.400 --> 00:04:47.199
+with Org mode and Gnuplotting,
+
+00:04:47.200 --> 00:04:51.959
+but I'll try to explain as much as I can as I go along.
+
+NOTE The journal
+
+00:04:51.960 --> 00:04:59.039
+The journal here is where... okay, okay, one moment.
+
+00:04:59.040 --> 00:05:03.519
+So as you can see, there's a sub-entry here
+
+00:05:03.520 --> 00:05:06.279
+for each day that I've included from my data set
+
+00:05:06.280 --> 00:05:08.559
+starting on September 13th of this year
+
+00:05:08.560 --> 00:05:10.399
+and ending on October 17th.
+
+00:05:10.400 --> 00:05:16.959
+And there's an Org property drawer with
+
+00:05:16.960 --> 00:05:22.999
+the corresponding names of each field and the value.
+
+00:05:29.800 --> 00:05:36.759
+Now the idea here is that the columns specify...
+
+00:05:36.760 --> 00:05:40.639
+if you know a little bit about Org mode,
+
+00:05:40.640 --> 00:05:43.479
+what happens is that you...
+
+00:05:43.480 --> 00:05:50.919
+let's say that I hit the key for my journal template,
+
+00:05:50.920 --> 00:05:52.799
+which... Mine is very similar.
+
+NOTE The capture buffer
+
+00:05:52.800 --> 00:06:00.879
+This is the capture buffer for today's date,
+
+00:06:00.880 --> 00:06:02.679
+and if you're recording yesterday's date,
+
+00:06:02.680 --> 00:06:04.519
+you can just flip it like that if you need to.
+
+00:06:04.520 --> 00:06:08.639
+Then I say, yesterday, I remember
+
+00:06:08.640 --> 00:06:11.159
+I went for about a one-mile walk,
+
+00:06:11.160 --> 00:06:14.119
+so that's probably about 20 minutes,
+
+00:06:14.120 --> 00:06:16.519
+and that I had such and such,
+
+00:06:16.520 --> 00:06:19.079
+I had eight and a half hours of sleep, let's say.
+
+00:06:19.080 --> 00:06:22.479
+I estimate how many pieces of nicotine gum I have.
+
+00:06:22.480 --> 00:06:25.799
+I try to count as closely as I can, how much distress,
+
+00:06:25.800 --> 00:06:26.359
+you know what I mean,
+
+00:06:26.360 --> 00:06:28.279
+whether or not I missed a dose of medication.
+
+00:06:28.280 --> 00:06:32.399
+Then when you hit C-c C-c,
+
+00:06:32.400 --> 00:06:39.799
+it captures that to the end of your Org file.
+
+00:06:39.800 --> 00:06:46.679
+Now what this shows is that... I cut and paste it in.
+
+00:06:46.680 --> 00:06:48.159
+I've been keeping these entries every day for months,
+
+00:06:48.160 --> 00:06:51.319
+and that I cut and pasted in a month of data.
+
+NOTE The columnview table
+
+00:06:51.320 --> 00:07:00.799
+Now I'm going to dig in a little bit to the Gnuplot script.
+
+00:07:00.800 --> 00:07:07.759
+This here, all this stuff, is one component of the graph,
+
+00:07:07.760 --> 00:07:11.359
+and I'll go over how it works.
+
+00:07:11.360 --> 00:07:19.319
+First, the items through this column declaration here,
+
+00:07:19.320 --> 00:07:30.199
+and the id:myid, this columnview table here,
+
+00:07:30.200 --> 00:07:34.919
+#+BEGIN: columnview, this whole bit here,
+
+00:07:34.920 --> 00:07:39.879
+is going to get filled in with the corresponding columns,
+
+00:07:39.880 --> 00:07:43.039
+exercise minutes, sleep hours, nicotine doses.
+
+00:07:43.040 --> 00:07:53.559
+And then it gets pumped out by Org mode into a file
+
+00:07:53.560 --> 00:07:59.840
+that looks like this: tab-separated values
+
+00:07:59.841 --> 00:08:03.479
+with an ISO-style date at the beginning.
+
+NOTE Gnuplot
+
+00:08:03.480 --> 00:08:10.359
+So what we're going to do is we're going to go through
+
+00:08:10.360 --> 00:08:14.479
+the Gnuplot portion of this,
+
+00:08:14.480 --> 00:08:16.359
+and I'm going to enlarge the font a little.
+
+00:08:21.280 --> 00:08:23.719
+I'm going to go line by line through the Gnuplot portion.
+
+00:08:23.720 --> 00:08:30.639
+Now, my template generator will give you one like this.
+
+00:08:30.640 --> 00:08:33.119
+You don't have to write this from scratch.
+
+00:08:33.120 --> 00:08:35.679
+But I'm going to go through it line by line
+
+00:08:35.680 --> 00:08:37.479
+because if you do use the template,
+
+00:08:37.480 --> 00:08:42.199
+then it'll help to have gone through it line by line,
+
+00:08:42.200 --> 00:08:46.679
+because you're probably going to have to modify it.
+
+00:08:46.680 --> 00:08:49.119
+So first, we're going to clear the graphics
+
+00:08:49.120 --> 00:08:50.199
+from any previous runs
+
+00:08:50.200 --> 00:08:53.799
+so that if we reuse the same Gnuplot process,
+
+00:08:53.800 --> 00:08:57.759
+we're not overwriting the old--
+
+00:08:57.760 --> 00:09:00.719
+that we are completely overwriting the old image.
+
+00:09:00.720 --> 00:09:03.319
+So that's the purpose of this line here.
+
+NOTE Output parameters
+
+00:09:03.320 --> 00:09:08.559
+The output parameters: we want to put out an SVG file.
+
+00:09:08.560 --> 00:09:13.639
+Font Arial, that's funny,
+
+00:09:13.640 --> 00:09:16.119
+but I don't know what font it's actually ending up choosing,
+
+00:09:16.120 --> 00:09:16.879
+but it looks fine.
+
+00:09:16.880 --> 00:09:19.639
+Then we want it to be square,
+
+00:09:19.640 --> 00:09:21.919
+so I'm giving it 900 by 900 pixels,
+
+00:09:21.920 --> 00:09:23.719
+even though it is a scalable vector graphic.
+
+00:09:23.720 --> 00:09:29.159
+We're putting it in the same folder as the org file,
+
+00:09:29.160 --> 00:09:30.799
+example.svg.
+
+00:09:30.800 --> 00:09:39.519
+These lines here set it up to use the Org mode format
+
+00:09:39.520 --> 00:09:42.679
+that we showed in the other file over here.
+
+00:09:42.680 --> 00:09:48.359
+The time format is four-digit year, two-digit month,
+
+00:09:48.360 --> 00:09:50.359
+two-digit day.
+
+00:09:50.360 --> 00:09:56.479
+The time format doesn't specify here the time,
+
+00:09:56.480 --> 00:09:59.599
+but that doesn't seem to mess it up.
+
+00:09:59.600 --> 00:10:02.439
+This line "set datafile separator" means that
+
+00:10:02.440 --> 00:10:04.239
+the separators between that
+
+00:10:04.240 --> 00:10:06.959
+and between all the other fields are tabs,
+
+00:10:06.960 --> 00:10:08.919
+which is what Org mode does
+
+00:10:08.920 --> 00:10:10.999
+when it spits out a table by default.
+
+00:10:11.000 --> 00:10:15.479
+Okay, along to the next lines.
+
+NOTE Time series data
+
+00:10:15.480 --> 00:10:18.119
+We're going to set up for time series data,
+
+00:10:18.120 --> 00:10:22.807
+meaning that the x-axis is going to be time,
+
+00:10:22.808 --> 00:10:26.119
+x2tics 1 format.
+
+00:10:26.120 --> 00:10:30.399
+I believe this means that every day has one tick
+
+00:10:30.400 --> 00:10:32.879
+and that this tells it that the first--
+
+00:10:32.880 --> 00:10:39.359
+unfortunately, I forget the exact meaning of this one line.
+
+00:10:39.360 --> 00:10:44.959
+I'm just going to move on. We want one X tick per day,
+
+00:10:44.960 --> 00:10:46.519
+and because X is in seconds,
+
+00:10:46.520 --> 00:10:50.319
+it's 24 hours times 60 minutes times 60 seconds.
+
+00:10:50.320 --> 00:10:55.639
+This line "set grid xtics" gives us
+
+00:10:55.640 --> 00:10:57.279
+a vertical line on each day of the graph.
+
+00:10:57.280 --> 00:10:58.319
+I'll pull up the graph
+
+00:10:58.320 --> 00:11:00.039
+just so that it's a little easier to see.
+
+00:11:00.040 --> 00:11:03.919
+All these vertical lines, one on each day,
+
+00:11:03.920 --> 00:11:06.199
+that's given to you by "set grid xtics".
+
+00:11:06.200 --> 00:11:10.159
+One Y tick every five points.
+
+00:11:10.160 --> 00:11:13.719
+So here at five pieces of nicotine,
+
+00:11:13.720 --> 00:11:15.959
+we've got a five, at ten pieces – well,
+
+00:11:15.960 --> 00:11:19.679
+we don't want to eat ten pieces, but ten, fifteen, twenty.
+
+00:11:19.680 --> 00:11:25.479
+Rotating the labels to make them fit a little bit better,
+
+00:11:25.480 --> 00:11:28.039
+that's this part here where the labels are sideways,
+
+00:11:28.040 --> 00:11:30.639
+and even with just one month of data,
+
+00:11:30.640 --> 00:11:35.159
+they're getting a little crowded.
+
+00:11:35.160 --> 00:11:41.399
+This "set key box lc" just makes the line around the key,
+
+00:11:41.400 --> 00:11:44.039
+the legend here, a little bit less severe.
+
+00:11:44.040 --> 00:11:51.079
+set xtics format: this makes it so that, for example,
+
+00:11:51.080 --> 00:11:53.479
+I've done a United-States-style date here
+
+00:11:53.480 --> 00:11:55.279
+with the month and then the day.
+
+00:11:55.280 --> 00:11:58.839
+You don't necessarily have to do that.
+
+00:11:58.840 --> 00:12:01.959
+You can have whatever you want.
+
+00:12:01.960 --> 00:12:03.079
+This xtics format,
+
+00:12:03.080 --> 00:12:06.319
+that relates to how the dates are printed.
+
+00:12:06.320 --> 00:12:12.519
+Remember that over here, this set timefmt,
+
+00:12:12.520 --> 00:12:15.159
+that relates to how the dates are formatted
+
+00:12:15.160 --> 00:12:16.999
+in the Org mode output.
+
+00:12:17.000 --> 00:12:18.319
+So remember, those are two...
+
+00:12:18.320 --> 00:12:19.519
+You don't want to mix those up.
+
+00:12:19.520 --> 00:12:23.799
+All right, "yrange [0:40]".
+
+00:12:23.800 --> 00:12:28.719
+Thus far, my exercise sessions have all been
+
+00:12:28.720 --> 00:12:31.479
+less than 30 minutes, and nothing's gone over 30.
+
+00:12:31.480 --> 00:12:35.839
+If you have a health variable
+
+00:12:35.840 --> 00:12:38.119
+that is in a significantly different range,
+
+00:12:38.120 --> 00:12:41.639
+you may need to get a slightly more complicated
+
+00:12:41.640 --> 00:12:43.719
+Gnuplot script because it is possible to plot
+
+00:12:43.720 --> 00:12:46.479
+multiple yranges in one plot
+
+00:12:46.480 --> 00:12:48.719
+if you have a variable that uses a different range.
+
+00:12:48.720 --> 00:12:49.759
+It's just a little trickier.
+
+00:12:49.760 --> 00:12:55.919
+These parts here, aside from the fact
+
+00:12:55.920 --> 00:12:59.079
+that you might make some changes that relate to
+
+00:12:59.080 --> 00:13:01.319
+the date and your country format,
+
+00:13:01.320 --> 00:13:03.239
+are going to be the same.
+
+00:13:03.240 --> 00:13:05.919
+This is like boilerplate for almost anything.
+
+NOTE Health variables
+
+00:13:05.920 --> 00:13:09.799
+Now here are the parts that are going to vary
+
+00:13:09.800 --> 00:13:13.399
+depending on what health variables you want to store.
+
+00:13:13.400 --> 00:13:18.039
+There are three main sections here.
+
+00:13:18.040 --> 00:13:28.719
+One is setting the different line types that are used.
+
+00:13:28.720 --> 00:13:32.479
+Setting linetype 1 with line width 2, line color RGB.
+
+00:13:32.480 --> 00:13:34.959
+Unfortunately, Gnuplot is a little bit cryptic,
+
+00:13:34.960 --> 00:13:36.879
+which is why I've made this template generator
+
+00:13:36.880 --> 00:13:37.999
+that I'll show you in a moment.
+
+00:13:38.000 --> 00:13:43.039
+I pick a color. So this is exercise, forest green.
+
+00:13:43.040 --> 00:13:49.279
+Point size 1, meaning you get
+
+00:13:49.280 --> 00:13:51.599
+these little green triangles about that size.
+
+00:13:51.600 --> 00:13:54.719
+But the point type 9 is the pointing up triangle.
+
+00:13:54.720 --> 00:13:59.519
+Line type 2, purple. So that's the sleep line.
+
+00:13:59.520 --> 00:14:02.999
+So we're just establishing these different line types
+
+00:14:03.000 --> 00:14:04.719
+that we've given arbitrary numbers.
+
+00:14:04.720 --> 00:14:08.959
+Now onto the next section.
+
+00:14:08.960 --> 00:14:12.919
+Oh, before I move on here,
+
+00:14:12.920 --> 00:14:16.119
+you can see point type 11 for line 5, which is red.
+
+00:14:16.120 --> 00:14:18.079
+And that's the missed medications line,
+
+00:14:18.080 --> 00:14:20.639
+so you get a triangle that's upside down
+
+00:14:20.640 --> 00:14:22.679
+because that's point shape 11.
+
+NOTE Goal lines
+
+00:14:22.680 --> 00:14:27.879
+All right. The next section here is the goal lines.
+
+00:14:27.880 --> 00:14:33.440
+There are horizontal dashed lines here
+
+00:14:33.441 --> 00:14:37.359
+at 8 purple hours of sleep, because 8 hours is the goal.
+
+00:14:37.360 --> 00:14:41.519
+So there's a horizontal line at Y = 8.
+
+00:14:41.520 --> 00:14:43.879
+For pieces of nicotine gum,
+
+00:14:43.880 --> 00:14:46.959
+I'm trying to keep it to around 5 right now.
+
+00:14:46.960 --> 00:14:52.519
+So my goal line is at 5. So these...
+
+00:14:52.520 --> 00:14:56.759
+Here, a goal of at least 20 minutes of exercise.
+
+00:14:56.760 --> 00:14:59.079
+Sometimes I get more, sometimes I get less.
+
+00:14:59.080 --> 00:15:02.199
+There's a green line and a 20, showing that that's the goal.
+
+00:15:02.200 --> 00:15:06.479
+These lines here are actually the goal lines.
+
+00:15:06.480 --> 00:15:09.119
+You can specify the goal for each one
+
+00:15:09.120 --> 00:15:11.999
+in the template generator that I'll show you.
+
+NOTE The Gnuplot command
+
+00:15:12.000 --> 00:15:28.079
+The last part is the actual plot command.
+
+00:15:28.080 --> 00:15:30.199
+So the dependent... So okay,
+
+00:15:30.200 --> 00:15:34.919
+these all start with 1, "using 1" against this variable.
+
+00:15:34.920 --> 00:15:41.599
+So $2... This is a ternary operator here
+
+00:15:41.600 --> 00:15:49.199
+that says if the value of the second column is zero,
+
+00:15:49.200 --> 00:15:52.359
+then don't plot a point. In other words,
+
+00:15:52.360 --> 00:15:56.079
+not a number means it won't plot a point.
+
+00:15:56.080 --> 00:15:58.919
+The template generator lets you skip over
+
+00:15:58.920 --> 00:16:02.119
+the details of that. It sticks this in there.
+
+00:16:02.120 --> 00:16:02.759
+I'll show you.
+
+00:16:02.760 --> 00:16:09.399
+So we only want to plot a point when the value is non-zero.
+
+00:16:09.400 --> 00:16:12.479
+If there was no exercise, we're not plotting a point.
+
+00:16:12.480 --> 00:16:15.759
+The with construct means we'll plot data
+
+00:16:15.760 --> 00:16:21.340
+using date against exercise with points,
+
+00:16:21.341 --> 00:16:25.519
+the title is "exercise (minutes)", line type 1.
+
+00:16:25.520 --> 00:16:29.839
+Remember, we established line type 1 up here
+
+00:16:29.840 --> 00:16:35.079
+as being forest green, point style 1,
+
+00:16:35.080 --> 00:16:37.599
+point type 9, green triangles.
+
+00:16:37.600 --> 00:16:42.399
+Now I'm going to show 1 against column 3,
+
+00:16:42.400 --> 00:16:43.919
+which is "hours of sleep".
+
+00:16:43.920 --> 00:16:46.039
+This one is plotted with lines,
+
+00:16:46.040 --> 00:16:48.599
+so we don't specify a point type or point size,
+
+00:16:48.600 --> 00:16:51.719
+just a line type 2. And remember, you can see
+
+00:16:51.720 --> 00:16:55.240
+that line type 2 is defined as purple
+
+00:16:55.241 --> 00:16:57.359
+with point type 1, point size 1.
+
+00:16:57.360 --> 00:16:59.959
+Okay, so I did specify point size and point type,
+
+00:16:59.960 --> 00:17:01.479
+but because I'm not plotting with points,
+
+00:17:01.480 --> 00:17:02.279
+those are ignored.
+
+00:17:02.280 --> 00:17:08.799
+Here we come to the line with nicotine.
+
+00:17:08.800 --> 00:17:11.559
+The fourth column is the nicotine number,
+
+00:17:11.560 --> 00:17:13.199
+the fourth column from the Org mode file.
+
+00:17:13.200 --> 00:17:16.007
+So here you can see how we're telling Gnuplot
+
+00:17:16.008 --> 00:17:19.799
+to take each column of the tab-separated Org mode file
+
+00:17:19.800 --> 00:17:21.119
+and put it into the graph.
+
+00:17:21.120 --> 00:17:25.959
+The line types are set up here.
+
+00:17:25.960 --> 00:17:30.799
+The goal lines are set up here.
+
+00:17:30.800 --> 00:17:35.559
+And then the actual plot command is set up here.
+
+NOTE The template generator
+
+00:17:35.560 --> 00:17:41.319
+So now we're going to work further backwards
+
+00:17:41.320 --> 00:17:42.959
+from this Gnuplot template
+
+00:17:42.960 --> 00:17:46.559
+to the template generator that I used to make it.
+
+00:17:46.560 --> 00:18:01.959
+Now I'm not going to go into
+
+00:18:01.960 --> 00:18:03.759
+all of the details of the code,
+
+00:18:03.760 --> 00:18:06.159
+but what I am going to show you is that
+
+00:18:06.160 --> 00:18:10.679
+there's a variable called `health-factors`.
+
+00:18:10.680 --> 00:18:15.839
+And what this does, this `health-factors-from-list`
+
+00:18:15.840 --> 00:18:20.919
+lets you specify, with a property list
+
+00:18:20.920 --> 00:18:22.679
+of keyword and value pairs
+
+00:18:22.680 --> 00:18:24.799
+(here's the keyword name and the value is exercise),
+
+00:18:24.800 --> 00:18:28.199
+the goal that I want 20 minutes of exercise,
+
+00:18:28.200 --> 00:18:30.199
+that the unit is minutes,
+
+00:18:30.200 --> 00:18:36.159
+that the color is forest green, and so on.
+
+00:18:36.160 --> 00:18:39.439
+The aspects of the Gnuplot setup
+
+00:18:39.440 --> 00:18:43.559
+have been abstracted here.
+
+00:18:43.560 --> 00:18:49.279
+Eight hours of sleep is the goal here.
+
+00:18:49.280 --> 00:18:54.039
+The hours are units. What color,
+
+00:18:54.040 --> 00:18:55.119
+what thickness of the line.
+
+00:18:55.120 --> 00:19:00.079
+Here we specify the number of points.
+
+00:19:00.080 --> 00:19:01.279
+There's references online
+
+00:19:01.280 --> 00:19:05.199
+that show you what point types are what shapes in Gnuplot,
+
+00:19:05.200 --> 00:19:11.479
+and so on and so forth.
+
+NOTE The code that creates a template
+
+00:19:11.480 --> 00:19:17.399
+I'll walk through the code a little bit that does this,
+
+00:19:17.400 --> 00:19:20.439
+that actually takes these pieces,
+
+00:19:20.440 --> 00:19:24.399
+that takes this specification of what your variables are
+
+00:19:24.400 --> 00:19:30.439
+and turns it into a template.
+
+00:19:30.440 --> 00:19:37.959
+First, I'm using EIEIO,
+
+00:19:37.960 --> 00:19:41.719
+the object system that's included with GNU Emacs.
+
+00:19:41.720 --> 00:19:45.119
+It's a reasonable facsimile
+
+00:19:45.120 --> 00:19:47.319
+of the Common Lisp Object System.
+
+00:19:47.320 --> 00:19:51.239
+What I'm going to be doing here
+
+00:19:51.240 --> 00:19:56.199
+is defining a class with each of those items,
+
+00:19:56.200 --> 00:19:58.479
+those properties that we talked about in that list
+
+00:19:58.480 --> 00:20:01.319
+that lets you specify name, what the goal is,
+
+00:20:01.320 --> 00:20:04.239
+what the units are, and the Gnuplot things
+
+00:20:04.240 --> 00:20:06.559
+(the Gnuplot parameters like thickness,
+
+00:20:06.560 --> 00:20:13.239
+plot type, and all that) into a class that will then
+
+00:20:13.240 --> 00:20:16.519
+spit out the template once you feed it
+
+00:20:16.520 --> 00:20:27.759
+some of these health factor objects. So just a moment.
+
+00:20:27.760 --> 00:20:34.479
+For example, you can see that this template
+
+00:20:34.480 --> 00:20:46.319
+originally came from being generated by this code here.
+
+00:20:46.320 --> 00:20:52.959
+To use the template,
+
+00:20:52.960 --> 00:20:55.399
+to use this little template generator...
+
+00:20:55.400 --> 00:21:06.279
+See, here's where it spits out the line type
+
+00:21:06.280 --> 00:21:07.439
+given the pieces.
+
+00:21:07.440 --> 00:21:09.679
+This is all just text formatting.
+
+00:21:09.680 --> 00:21:11.319
+This is one of the things that Emacs Lisp
+
+00:21:11.320 --> 00:21:13.159
+just really excels at.
+
+00:21:13.160 --> 00:21:19.519
+I need to take a piece of data
+
+00:21:19.520 --> 00:21:22.639
+like a list of health information,
+
+00:21:22.640 --> 00:21:25.679
+a list of health variables, what their units are,
+
+00:21:25.680 --> 00:21:28.119
+and how they're supposed to be formatted in Gnuplot,
+
+00:21:28.120 --> 00:21:30.199
+and go from that to the nice template.
+
+00:21:30.200 --> 00:21:31.719
+So that's pretty much the whole thing.
+
+00:21:31.720 --> 00:21:40.999
+I want to see if there's anything I missed.
+
+NOTE The power of the chart
+
+00:21:41.000 --> 00:21:51.519
+Bring up the chart.
+
+00:21:51.520 --> 00:21:54.279
+This has been really useful
+
+00:21:54.280 --> 00:21:59.599
+for communicating with healthcare professionals
+
+00:21:59.600 --> 00:22:04.399
+because you are both on the same page
+
+00:22:04.400 --> 00:22:05.879
+about exactly what is happening,
+
+00:22:05.880 --> 00:22:10.679
+what's been happening because if... Let's say
+
+00:22:10.680 --> 00:22:15.239
+that you're tired when you talk to your care provider.
+
+00:22:15.240 --> 00:22:17.559
+Well, if you have objective information
+
+00:22:17.560 --> 00:22:18.839
+that you've been recording every day,
+
+00:22:18.840 --> 00:22:22.399
+that you're ahead of the game, really,
+
+00:22:22.400 --> 00:22:25.119
+because you don't need, necessarily, the presence of mind
+
+00:22:25.120 --> 00:22:27.679
+to be able to give your care provider
+
+00:22:27.680 --> 00:22:30.039
+a complete picture of what's going on in your world.
+
+00:22:30.040 --> 00:22:33.039
+If you can find those few minutes a day to enter--
+
+00:22:33.040 --> 00:22:34.399
+not even a few minutes,
+
+00:22:34.400 --> 00:22:37.759
+really just a minute to enter the data
+
+00:22:37.760 --> 00:22:39.839
+and say what happened yesterday...
+
+00:22:39.840 --> 00:22:42.759
+I'm finding over these months
+
+00:22:42.760 --> 00:22:45.039
+that I've been more in touch with my health when I can--
+
+00:22:45.040 --> 00:22:49.919
+not forced, but when I have the habit,
+
+00:22:49.920 --> 00:22:52.159
+the consistent habit every single day
+
+00:22:52.160 --> 00:22:55.839
+of recording that data--I'm accountable to myself.
+
+00:22:55.840 --> 00:22:57.359
+It's interesting.
+
+00:22:57.360 --> 00:23:01.039
+I guess it gets into a little bit of ideas
+
+00:23:01.040 --> 00:23:02.439
+about the Quantified Self
+
+00:23:02.440 --> 00:23:05.239
+and how holding yourself accountable
+
+00:23:05.240 --> 00:23:09.919
+can change what you do and what the outcomes are.
+
+00:23:09.920 --> 00:23:14.159
+Just look at this here.
+
+00:23:14.160 --> 00:23:17.279
+Without getting into too much detail,
+
+00:23:17.280 --> 00:23:19.679
+one of the reasons I track my sleep is because,
+
+00:23:19.680 --> 00:23:22.039
+as you can see, my sleep
+
+00:23:22.040 --> 00:23:26.759
+is not as well-regulated as most people,
+
+00:23:26.760 --> 00:23:31.439
+and that's why I need to do that.
+
+00:23:31.440 --> 00:23:34.440
+This was a time... 10, 12,
+
+00:23:34.441 --> 00:23:36.639
+here's 14 hours of sleep, that's depression.
+
+00:23:36.640 --> 00:23:43.519
+It oscillates a little bit. But then below the goal line,
+
+00:23:43.520 --> 00:23:45.639
+the things are a little more normal here.
+
+00:23:45.640 --> 00:23:46.919
+This is a little more normal.
+
+00:23:46.920 --> 00:23:52.079
+But then, really, without thinking about it too much,
+
+00:23:52.080 --> 00:23:56.239
+I cut out the nicotine, and my sleep suffered.
+
+00:23:56.240 --> 00:24:00.199
+Just the fact that I'm able to look and see that connection
+
+00:24:00.200 --> 00:24:01.359
+is really amazing to me.
+
+00:24:01.360 --> 00:24:02.759
+Maybe I would have anyway,
+
+00:24:02.760 --> 00:24:05.239
+but looking at the whole months of data,
+
+00:24:05.240 --> 00:24:07.399
+there have been many things to discuss
+
+00:24:07.400 --> 00:24:09.919
+and many things to think about.
+
+NOTE Thanks
+
+00:24:09.920 --> 00:24:12.159
+Because this is a short presentation,
+
+00:24:12.160 --> 00:24:13.839
+I probably should wrap up.
+
+00:24:13.840 --> 00:24:18.239
+I just want to thank the whole Emacs community
+
+00:24:18.240 --> 00:24:23.319
+for being there and for including me in the conference
+
+00:24:23.320 --> 00:24:27.079
+and I hope to participate next year as well.
+
+00:24:27.080 --> 00:24:29.240
+Thank you so much.
diff --git a/2022/captions/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.vtt b/2022/captions/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.vtt
new file mode 100644
index 00000000..4ababba9
--- /dev/null
+++ b/2022/captions/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.vtt
@@ -0,0 +1,1184 @@
+WEBVTT
+
+00:00.000 --> 00:03.880
+Sorry, it's a little tight. I'm doing a lot of stuff behind the scene and now we're ready
+
+00:03.880 --> 00:23.320
+to go live in about five seconds. Sorry, five more seconds. Five. And we are live. Hello
+
+00:23.320 --> 00:27.920
+again, everyone. Hopefully you can hear me just fine. And we just had a talk with Bob
+
+00:27.920 --> 00:32.800
+and Bob is now here in the room. Hi Bob, how are you doing? Hi, doing well. Good to see
+
+00:32.800 --> 00:39.120
+you, Leo. You're doing a great job. Well, thank you. I must say, I am back to asking
+
+00:39.120 --> 00:44.160
+questions, but for the last two hours, I have been running after pre-recordings. I have
+
+00:44.160 --> 00:48.800
+been doing the re-encoding and stuff like this, which means it doesn't look like this,
+
+00:48.800 --> 00:53.220
+but this was very much of a marathon. And I'm glad to be here to be in a room with you
+
+00:53.220 --> 00:57.000
+because I'm actually going to be able to rest a little bit.
+
+00:57.000 --> 01:04.400
+Did you see the presentation? Not yet. Okay, can I lie? If I were able to lie, I would
+
+01:04.400 --> 01:08.960
+say yes, I've been very attentively watching everything in a presentation, but sadly, no,
+
+01:08.960 --> 01:13.160
+I've been quite busy elsewhere. And because, well, no, we don't need to tell them about
+
+01:13.160 --> 01:20.120
+this. But Bob, do you have the pad open in front of you? Yes. Well, I can't look at both
+
+01:20.120 --> 01:26.280
+at the same time, but... It's fine. You don't need to see my face. You've seen it. Okay.
+
+01:26.280 --> 01:31.120
+I see it here. Can you have multiple implicit button files? If so, how would you know which
+
+01:31.120 --> 01:39.780
+link came from what files? I guess they're one-way links, so you embed buttons in any
+
+01:39.780 --> 01:46.600
+number of files that you want and you traverse them, or they perform actions for you. There
+
+01:46.600 --> 01:52.900
+are three categories of buttons. We were showing you implicit buttons, which is one category.
+
+01:52.900 --> 01:59.800
+Then there's explicit buttons, which can also perform arbitrary actions, but those you embed
+
+01:59.800 --> 02:05.860
+one at a time in a file and you say, okay, I want this to be a link to an org file section
+
+02:05.860 --> 02:12.560
+or something. And then... Sorry for the interruption. Can we keep going? The third kind are global
+
+02:12.560 --> 02:18.500
+buttons, which we demonstrated there when you put those in your personal button file,
+
+02:18.500 --> 02:23.920
+and then you can access them by name anywhere in Emacs without even having a buffer up on
+
+02:23.920 --> 02:30.560
+screen. The next question... So I should just go down the questions? You don't have any
+
+02:30.560 --> 02:36.960
+Leo? No, no, feel free. I'm mostly here to be the pretty face that when a problem happens,
+
+02:36.960 --> 02:41.400
+I'm here to help. But since you have questions already in the pad, I'm more than happy to
+
+02:41.400 --> 02:45.420
+have you answer the question from the pad. And if we have a little more time, I'll come
+
+02:45.420 --> 02:49.560
+up with my own questions, so don't worry about it. Yeah, and encourage people to come into
+
+02:49.560 --> 02:57.020
+the chat. We can do something live and then go back to the Etherpad and deal with these
+
+02:57.020 --> 03:03.800
+later as well if people want to talk. So just to specify this, we might first have you answer
+
+03:03.800 --> 03:07.960
+the questions on the pad first and we'll open up the BBT a little later. For now, just you
+
+03:07.960 --> 03:17.340
+on the pad. I'll keep you posted. So are we showing the pad so people see it or I need
+
+03:17.340 --> 03:24.480
+to share that? So I'm sharing the pad right now, I'm managing what people are seeing on
+
+03:24.480 --> 03:27.840
+the stream. You might want to have the pad in front of you and read the question anyway
+
+03:27.840 --> 03:33.480
+to know which question you're actually answering. Okay, I do have the pad separately. Okay.
+
+03:33.480 --> 03:40.920
+What about using implicit buttons with multiple people with different configs? Not quite sure
+
+03:40.920 --> 03:49.820
+what the question is, but hyperbole is always thinking about people working collaboratively,
+
+03:49.820 --> 03:56.880
+though it is also somewhat focused on your personal information. So as you saw when we
+
+03:56.880 --> 04:03.940
+embedded a variable, either an Emacs list variable or an environment variable in a path,
+
+04:03.940 --> 04:08.620
+you can share those with people. You can embed hyperbole buttons in your email messages and
+
+04:08.620 --> 04:13.720
+they'll adapt based on the environment that the person activates them in. So there's a
+
+04:13.720 --> 04:22.200
+lot of useful kind of capability like that built in for collaboration as well. Coming
+
+04:22.200 --> 04:27.260
+in from org mode, would it be a fair assessment that hyperbole is in some way a generalization
+
+04:27.260 --> 04:33.240
+of what most people think of the great features of org to work across formats with the hyperbole
+
+04:33.240 --> 04:38.600
+links buttons being the recurring example and that it then further adds some capabilities
+
+04:38.600 --> 04:45.500
+again across formats being the global miner mode is interesting. I think it goes to RMS's
+
+04:45.500 --> 04:51.280
+talk that org's features could be more generalized modularized. How is hyperbole in that respect?
+
+04:51.280 --> 04:56.800
+Yes, it hyperbole is meant to give you all of these capabilities across your entire Emacs
+
+04:56.800 --> 05:05.000
+experience. So everything you saw in org mode works and all sorts of other buffer types
+
+05:05.000 --> 05:13.560
+to accept the pieces that were activating org's specific features. Internal radio targets,
+
+05:13.560 --> 05:22.560
+are they able to link to other org mode files that are part of my agenda? Certainly you
+
+05:22.560 --> 05:33.960
+can have, you can make a link type that crosses similar to what you saw in the K outliner
+
+05:33.960 --> 05:41.040
+links where you specified a file and then it just would have the sub part of the link
+
+05:41.040 --> 05:48.640
+that you wanted that would reference the target as well. Your package advances how useful
+
+05:48.640 --> 05:53.880
+a mouse can be with creating links. That we didn't show but you can just drag between
+
+05:53.880 --> 05:59.240
+windows and create an explicit link between things as well. Do you have any experience
+
+05:59.240 --> 06:03.640
+or thoughts about how touchscreens or mice could be used or improved with Emacs? Yes
+
+06:03.640 --> 06:13.080
+I do. In fact, when hyperbole was conceived originally it was part of a broader research
+
+06:13.080 --> 06:19.640
+project called personalized information environments. At the dawn of the web is when this started
+
+06:19.640 --> 06:25.800
+and we kind of figured people would be deluged with maybe 5,000 email messages a day or just
+
+06:25.800 --> 06:33.240
+all sorts of things like we are deluged with today. So we were thinking about sort of like
+
+06:33.240 --> 06:41.160
+org brain and the graphical sort of navigation that you could do in hyper versus and came
+
+06:41.160 --> 06:51.920
+up with some prototypes that were kind of very iPad like in the node sort of views but
+
+06:51.920 --> 06:58.760
+with much greater navigation capability. So a lot of that isn't implemented but we are
+
+06:58.760 --> 07:04.400
+always thinking about how to make things more useful and you see the smart context handling
+
+07:04.400 --> 07:10.360
+that the mouse keys do because there's drags associated with the action and the assist
+
+07:10.360 --> 07:16.800
+keys when put onto mice and those do a great many things that sort of replicate what a
+
+07:16.800 --> 07:22.960
+touchscreen might do as well. Would you consider hyperbole to be more of a format spec that
+
+07:22.960 --> 07:28.240
+can then be handled however we want or the engine itself along with that format i.e.
+
+07:28.240 --> 07:33.620
+can the simple link formats be used for other extensible purposes. Yes again hyperbole was
+
+07:33.620 --> 07:39.560
+conceived as a hypertext engine that would be part of the personalized information environments
+
+07:39.560 --> 07:47.600
+or pies and it would link that engine would then be available to multiple applications.
+
+07:47.600 --> 07:57.560
+So we sort of built an API not a web API but just a programming API that you can use and
+
+07:57.560 --> 08:03.960
+that's documented in the manual to build other applications atop hyperbole. It turned out
+
+08:03.960 --> 08:09.280
+that a lot of people didn't have that capability to program it so we just kept programming
+
+08:09.280 --> 08:14.640
+a lot of these default features that you see today with all the button types to show people
+
+08:14.640 --> 08:20.760
+what was possible. How is the integration with org roam? We're just starting to look
+
+08:20.760 --> 08:29.240
+at that you know again I just find with hyperbole there are no external required packages you
+
+08:29.240 --> 08:34.640
+just load hyperbole and whatever Emacs has that's all that it needs so that's kind of
+
+08:34.640 --> 08:40.080
+unique for such a big package like this. There are optional things like ace window that you
+
+08:40.080 --> 08:45.200
+can add on and then hyperbole will work with them but they're not required. So similarly
+
+08:45.200 --> 08:55.760
+we try to never have any separate C compiled programs like SQLite or org roam which uses
+
+08:55.760 --> 09:03.600
+SQLite that's required. However we interface to external systems like that so basically
+
+09:03.600 --> 09:12.400
+you know we'll do some interesting things with org roam nodes in the near future. When
+
+09:12.400 --> 09:19.200
+does something when doing something where do you determine where to put it k-o-t-l rollo
+
+09:19.200 --> 09:28.080
+org? I like k-o-t-l k-outline for journaling and org mode for getting things done. Sure
+
+09:28.080 --> 09:37.820
+I mean you know org and k-outliner are both outline formats so I like k-outliner for like
+
+09:37.820 --> 09:44.480
+requirements gathering anytime I need things numbered quickly I'm making lists or hierarchies
+
+09:44.480 --> 09:52.040
+I want those IDs there. Org does some of that but not nearly to the level that the k-outliner
+
+09:52.040 --> 09:58.600
+does. The rollo again I just stuff all sorts of information in there and then we have very
+
+09:58.600 --> 10:04.440
+simple search and retrieval operations that we can use on there so I don't need to worry
+
+10:04.440 --> 10:10.880
+about all of these like drawers and all the complexity that org allows because you want
+
+10:10.880 --> 10:16.760
+to publish something. I tend to use everything as a live hypertext and don't worry about
+
+10:16.760 --> 10:22.320
+printing it out or displaying it in some other format too much. So it depends on your taste
+
+10:22.320 --> 10:28.320
+I would say. Would you recommend a specific resource for getting into hyperbole or should
+
+10:28.320 --> 10:33.080
+I just start with the manual? Definitely interested in getting into this. Thank you for asking
+
+10:33.080 --> 10:39.600
+that. Definitely don't start with manual. The manual is almost 170 pages it's a reference
+
+10:39.600 --> 10:45.760
+manual for specific things that you want to know. For learning once you install hyperbole
+
+10:45.760 --> 10:55.080
+part of the menu system is control H HDD for documentation and then demo and that puts
+
+10:55.080 --> 10:59.080
+you into an interactive demo that you just walk through so it's sort of like the Emacs
+
+10:59.080 --> 11:06.980
+tutorial and that'll get you started much better than any other way and the second thing
+
+11:06.980 --> 11:13.960
+to do after that I would say is watch some of the videos. One of the videos is a talk
+
+11:13.960 --> 11:19.800
+I gave earlier that's about an hour-long talk introducing you to hyperbole and its concepts
+
+11:19.800 --> 11:25.280
+so I think those are the two best ways to get started and then you can move on to the
+
+11:25.280 --> 11:32.240
+reference manual if you're really good at reading. What is hyperorg? That's a name that
+
+11:32.240 --> 11:41.360
+Sasha made up I believe for the talk here. I thought it should be hyperborg. It would
+
+11:41.360 --> 11:48.200
+be a little funnier that right we're trying to be like a borg and get people to use hyperbole
+
+11:48.200 --> 11:55.440
+and org together and then you'll never you'll never want to be anything else except users
+
+11:55.440 --> 12:05.920
+of those packages. Anybody want to talk live on the big blue button?
+
+12:05.920 --> 12:11.960
+Again so the thing is I didn't give you the time when we were supposed to finish with
+
+12:11.960 --> 12:22.720
+the Q&A and give me just a second. I've confirmed with the people behind me that we actually
+
+12:22.720 --> 12:26.080
+need to get moving to the next talk at the top of this minute so Bob thank you so much
+
+12:26.080 --> 12:29.320
+for answering so many questions. I'm sorry we don't have more time for questions because
+
+12:29.320 --> 12:33.200
+your talk I think was a little longer than we anticipated at first but I still believe
+
+12:33.200 --> 12:35.840
+you've done a great job at first covering a lot of stuff.
+
+12:35.840 --> 12:40.080
+I'll be on the etherbed for a little while if people want to push anything else there.
+
+12:40.080 --> 12:44.040
+Also if you want to stay here we are going to open the BBB if people want to ask you
+
+12:44.040 --> 12:51.360
+questions we're going to publish the link. Bob we're going to need to get going with
+
+12:51.360 --> 12:54.560
+the stream we're starting the next talk in 20 seconds thank you so much and I'll see
+
+12:54.560 --> 13:14.640
+you later. Take care Leo thank you. Bye bye.
+
+13:24.560 --> 13:36.400
+Gosh yeah pretty much I mean I'm still on this thing if it shows up for a minute but
+
+13:36.400 --> 13:56.480
+nobody's there.
+
+13:56.480 --> 14:13.060
+Take care.
+
+14:26.480 --> 14:28.540
+you
+
+14:56.480 --> 14:58.540
+you
+
+15:26.480 --> 15:28.540
+you
+
+15:56.480 --> 15:58.540
+you
+
+16:26.480 --> 16:28.540
+you
+
+16:56.480 --> 16:58.540
+you
+
+17:26.480 --> 17:28.540
+you
+
+17:56.480 --> 17:58.540
+you
+
+18:26.480 --> 18:28.540
+you
+
+18:56.480 --> 18:58.540
+you
+
+19:26.480 --> 19:28.540
+you
+
+19:56.480 --> 19:58.540
+you
+
+20:26.480 --> 20:28.540
+you
+
+20:56.480 --> 20:58.540
+you
+
+21:26.480 --> 21:28.540
+you
+
+21:56.480 --> 21:58.540
+you
+
+22:26.480 --> 22:28.540
+you
+
+22:56.480 --> 22:58.540
+you
+
+23:26.640 --> 23:28.340
+you
+
+23:37.680 --> 23:41.040
+Would you still be up to talking?
+
+23:41.040 --> 23:56.400
+Hi, are you talking to me?
+
+23:56.400 --> 23:57.400
+Yeah.
+
+23:57.400 --> 24:12.720
+For a minute, I'm going to just go take a walk in a little bit, but I can quickly pause.
+
+24:12.720 --> 24:14.920
+Just go ahead.
+
+24:14.920 --> 24:20.780
+One thing whenever I've tried setting up any knowledge bases, I've generally thrown them
+
+24:20.780 --> 24:24.500
+away after a while, slowly picking up more and more.
+
+24:24.500 --> 24:31.680
+Right now, I'm using org room and LogSec.
+
+24:31.680 --> 24:38.340
+And one of the features I found in LogSec that I like is you're able to have the link
+
+24:38.340 --> 24:44.520
+in such a way where I can make an outline of everything I want to do on a week in one
+
+24:44.520 --> 24:49.640
+file and then in the journal view that it will dynamically generate, it will show you
+
+24:49.640 --> 24:55.240
+the tasks individually on that day just for that day.
+
+24:55.240 --> 24:57.160
+So is there any way?
+
+24:57.160 --> 25:04.720
+So it creates kind of a journal based on dated items that it's extracting from multiple other
+
+25:04.720 --> 25:06.320
+sources, right?
+
+25:06.320 --> 25:07.320
+Yeah.
+
+25:07.320 --> 25:16.840
+So it's got a section below it that's from different sources and you can go and do that
+
+25:16.840 --> 25:24.160
+and it will just dynamically put it at the bottom, but just for those specific links.
+
+25:24.160 --> 25:32.800
+You know, sort of like the idea of transclusion, right, is something that they've addressed
+
+25:32.800 --> 25:37.960
+in org mode and we haven't really dealt with that in hyperbole.
+
+25:37.960 --> 25:43.320
+So those are areas that we want to get into.
+
+25:43.320 --> 25:51.760
+I think there's a lot of work going on in LogSec and Obsidian that I look at when I
+
+25:51.760 --> 25:53.900
+have time.
+
+25:53.900 --> 25:58.720
+So there's definitely ideas to draw around that.
+
+25:58.720 --> 26:03.920
+One of the things we find is there's just covering all across Emacs, there's so much
+
+26:03.920 --> 26:12.880
+to do all the time and this being a part-time project, we have to think like RMS does across
+
+26:12.880 --> 26:17.640
+years rather than weeks just because of the energy around it.
+
+26:17.640 --> 26:25.280
+But you know, the more people can kind of like write a paragraph and say if hyperbole
+
+26:25.280 --> 26:32.040
+or some tool could do this, you know, the more likely it is that we'll approach it and
+
+26:32.040 --> 26:33.920
+turn it into reality.
+
+26:33.920 --> 26:34.920
+Yeah.
+
+26:34.920 --> 26:40.440
+Well, like you could probably write some functions that will just dynamically grab information
+
+26:40.440 --> 26:41.440
+like that out.
+
+26:41.440 --> 26:49.000
+Yeah, well, I mean like you have that with the high roller so you can just make arbitrary
+
+26:49.000 --> 26:56.080
+documents and just put stars at the front of each node and the high roller will pull
+
+26:56.080 --> 27:00.000
+out anything that you want to match on.
+
+27:00.000 --> 27:05.400
+You know, it can be regular expressions, logic expressions with and or not.
+
+27:05.400 --> 27:11.400
+So that's already there and it's very simple with the other capabilities to just turn
+
+27:11.400 --> 27:15.600
+a search into a button somewhere in your file.
+
+27:15.600 --> 27:23.200
+So you basically create your own dynamic views then without any additional mechanism.
+
+27:23.200 --> 27:27.400
+But when you want to deal with like the dates and you want to see it, you know, that's a
+
+27:27.400 --> 27:33.840
+specific view that we would program for you and provide.
+
+27:33.840 --> 27:40.880
+With Not Much and MU4E, the thing I like about Not Much More is you're able to in your search
+
+27:40.880 --> 27:48.640
+queries you can use the ands and ors with subject headers or stuff that's only in the
+
+27:48.640 --> 27:56.520
+body of the paragraph of the email or who it's to and from and I don't think MU4E has
+
+27:56.520 --> 27:59.120
+near that support.
+
+27:59.120 --> 28:07.360
+You could use something with org mode and you could do that type of stuff searching
+
+28:07.360 --> 28:12.520
+like based off of keywords with, there's a package by Alpha Papa, I can't remember the
+
+28:12.520 --> 28:13.520
+name of it.
+
+28:13.520 --> 28:14.520
+Org Rifle.
+
+28:14.520 --> 28:15.520
+OrgQL.
+
+28:15.520 --> 28:17.960
+OrgQL, yeah.
+
+28:17.960 --> 28:23.440
+And does like you have anything?
+
+28:23.440 --> 28:31.280
+I mean, yeah, it's like, I'm not sure you combine say subject, colon, whatever, your
+
+28:31.280 --> 28:38.520
+regular expression and you map that with a logic expression.
+
+28:38.520 --> 28:44.600
+So in hyperbole, in high roll though, to do a logic expression, you just do it like a
+
+28:44.600 --> 28:46.080
+Lisp expression.
+
+28:46.080 --> 28:49.040
+So but you use and or, ex or not.
+
+28:49.040 --> 28:56.920
+So you say, you know, open paren, not, and then what you want to not match to, right?
+
+28:56.920 --> 29:02.480
+This node doesn't have that in it and you know, a broader expression with an and around
+
+29:02.480 --> 29:07.000
+it would say, so it's not this and it's this.
+
+29:07.000 --> 29:11.960
+So that all exists the moment you pull up the interface to say, I want to do a string
+
+29:11.960 --> 29:12.960
+search.
+
+29:12.960 --> 29:18.080
+You can actually embed those logic expressions right in your search there and it'll do them
+
+29:18.080 --> 29:21.820
+for you.
+
+29:21.820 --> 29:28.820
+That would mostly be regex, right, or is it a different syntax?
+
+29:28.820 --> 29:34.600
+It's a different, so you can have regexes embedded in the logic expression, but the
+
+29:34.600 --> 29:44.000
+logic itself is done with like the equivalent of, you know, S expressions with and or not
+
+29:44.000 --> 29:45.200
+an ex or.
+
+29:45.200 --> 29:57.320
+So I could say and bird watch and it would only find outline items that contain the words
+
+29:57.320 --> 29:59.280
+bird and watch.
+
+29:59.280 --> 30:06.000
+So it's very simple, you know, textual like that, but then bird could be a regex if I,
+
+30:06.000 --> 30:08.500
+you know, as well.
+
+30:08.500 --> 30:15.600
+So things like that, you have to try it out, I think, you know, to really get a feel for
+
+30:15.600 --> 30:16.600
+it.
+
+30:16.600 --> 30:25.080
+I've tried it some, I just, it's just a lot harder to, they have so many of these knowledge
+
+30:25.080 --> 30:30.120
+base programs that it's hard to make a knowledge base with each one of them and then compare
+
+30:30.120 --> 30:31.120
+them.
+
+30:31.120 --> 30:32.120
+Oh, I agree.
+
+30:32.120 --> 30:33.120
+I mean, that's part of why we built it, right?
+
+30:33.120 --> 30:39.560
+I mean, we built this before org existed, so.
+
+30:39.560 --> 30:46.600
+You know, I really do want to tie them together, but I agree with Stallman that org, you know,
+
+30:46.600 --> 30:54.540
+for scientific research purposes has embedded so many things that people outside that community
+
+30:54.540 --> 30:59.240
+don't really need and, you know, it's gotten to a level of complexity, I mean, you look
+
+30:59.240 --> 31:06.080
+at the code base that I still kind of, you know, happy to interface with it and use it
+
+31:06.080 --> 31:12.560
+and I see a lot of great stuff in there, but I want to be able to have a much simpler format
+
+31:12.560 --> 31:18.160
+for when I just have all this unstructured data that I want to deal with.
+
+31:18.160 --> 31:26.760
+Yeah, there's definitely a part of org mode that, that unmodularity and all the features
+
+31:26.760 --> 31:39.080
+that doesn't feel like Unix-y and the rest of Emacs and I think like org, yeah, just
+
+31:39.080 --> 31:41.800
+some of the features, org-id, I can't remember what they are.
+
+31:41.800 --> 31:42.800
+It's really the opposite.
+
+31:42.800 --> 31:49.180
+It's like, it's coming at it from, you know, that structure process, okay, we're going
+
+31:49.180 --> 31:54.960
+to tag everything with, you know, what property it is.
+
+31:54.960 --> 31:59.800
+And hyperbole is sort of the opposite to say, well, we have relational databases for when
+
+31:59.800 --> 32:01.520
+we're doing that kind of thing.
+
+32:01.520 --> 32:07.360
+So this is for your everyday information where, you know, oh, I just grabbed all this off
+
+32:07.360 --> 32:14.440
+the web or, you know, I just added in 200 files and now I want to deal with it and kind
+
+32:14.440 --> 32:17.760
+of mix it into my Hyperverse.
+
+32:17.760 --> 32:20.640
+What kind of capabilities can you give me to do that?
+
+32:20.640 --> 32:25.480
+So say like there were 200 documents that somebody handed you and they all have this
+
+32:25.480 --> 32:31.520
+cross-reference pattern embedded in it, right, which is a version of hyperlinks, but they're
+
+32:31.520 --> 32:33.100
+not actually hyperlinks.
+
+32:33.100 --> 32:40.800
+So you just create a couple line button type in hyperbole because all the mechanisms there
+
+32:40.800 --> 32:41.800
+already.
+
+32:41.800 --> 32:48.060
+And then once you activate that type, all of those documents now have those cross-references
+
+32:48.060 --> 32:50.380
+as hyperlinks.
+
+32:50.380 --> 32:56.360
+And you solve the problem could be for millions of cross-references with three lines of code.
+
+32:56.360 --> 33:02.040
+So that's the kind of leverage that we're looking to get without people having to, you
+
+33:02.040 --> 33:09.440
+know, touch the original source format.
+
+33:09.440 --> 33:15.760
+That's one of the things your package has tackled was links in the wild, email addresses,
+
+33:15.760 --> 33:22.440
+websites that people use and identify with.
+
+33:22.440 --> 33:27.600
+And then you got all that behavior without having to learn key bindings like you do in
+
+33:27.600 --> 33:28.600
+the org, right?
+
+33:28.600 --> 33:32.360
+I mean, you got to know at least like 10 in the org, I think.
+
+33:32.360 --> 33:37.200
+And you know, it's really too largely in hyperbole.
+
+33:37.200 --> 33:42.560
+So for me, when I'm going along, you know, I just want to mark things, operate on them
+
+33:42.560 --> 33:46.680
+and not really think about the command a lot.
+
+33:46.680 --> 33:52.760
+And so, of course, we all know many commands in Emacs, but, you know, so I have that the
+
+33:52.760 --> 33:59.760
+editing commands, but the knowledge base commands, I don't really need to add on that much more
+
+33:59.760 --> 34:02.080
+and I can still be very effective.
+
+34:02.080 --> 34:10.440
+Yeah, you dealt with links in the wild while simultaneously advancing the state of the
+
+34:10.440 --> 34:13.520
+art with the implicit links.
+
+34:13.520 --> 34:20.160
+So like what can you do if you stay within your own system and you control everything?
+
+34:20.160 --> 34:28.960
+Yeah, I think that's the, you know, people love implicit buttons, but it sort of takes
+
+34:28.960 --> 34:33.520
+a while for it to sink in what you can do with it, right?
+
+34:33.520 --> 34:40.200
+Because it is a little difficult to figure out how you create your own type.
+
+34:40.200 --> 34:48.120
+But like we have a GitHub, I don't know if you use GitHub, but type built in and, you
+
+34:48.120 --> 34:57.720
+know, with very short cross references, it can access issues, commits, projects, linked
+
+34:57.720 --> 35:04.800
+to all of their things with just, you know, a few characters in your document.
+
+35:04.800 --> 35:11.720
+And so, you know, there's an interface to an entire web ecosystem that's done in one
+
+35:11.720 --> 35:19.560
+module and I verbally and, you know, you don't, all you have to do is use it.
+
+35:19.560 --> 35:24.920
+Something that could be interesting there is if you had it with next common list web
+
+35:24.920 --> 35:33.000
+browser, you click a GitHub issue on the website and it either downloads the source code or
+
+35:33.000 --> 35:39.680
+just goes and then the uses maggot or forge to download the issues and then just automatically
+
+35:39.680 --> 35:42.520
+opens it up in Emacs for you to look at it there.
+
+35:42.520 --> 35:43.520
+That'd be an interesting.
+
+35:43.520 --> 35:44.520
+Yeah.
+
+35:44.520 --> 35:52.160
+Well, we have that for, so if you just type in any buffer, you put a bug pound sign and
+
+35:52.160 --> 36:00.080
+the number and you press your action key on that, that will display that bug number for
+
+36:00.080 --> 36:05.640
+Emacs in good news and the dialogue associated with it.
+
+36:05.640 --> 36:15.440
+So, you know, we have that similar kind of thing for GitHub, GitLab and so it's, you
+
+36:15.440 --> 36:19.240
+know, a lot of people are interested in that because they have Jira or something and they
+
+36:19.240 --> 36:24.840
+just want a simple way, you know, to get at their issues in whatever web browser they
+
+36:24.840 --> 36:25.840
+use.
+
+36:25.840 --> 36:32.480
+And that's very easy to do and one of the most common things programmers do.
+
+36:32.480 --> 36:38.320
+You still there?
+
+36:38.320 --> 36:40.320
+Yeah.
+
+36:40.320 --> 36:42.320
+Okay.
+
+36:42.320 --> 36:45.560
+It's just funny.
+
+36:45.560 --> 36:53.760
+So yeah, I hope, I guess you've obviously explored hyperbole a little bit, you know,
+
+36:53.760 --> 36:59.760
+let us know what the barriers are to, you know, becoming a regular user and we'll work
+
+36:59.760 --> 37:01.480
+on this.
+
+37:01.480 --> 37:11.080
+One thing I found that I like about the K outline is if you, long form journaling is
+
+37:11.080 --> 37:18.880
+if I do that with centering the buffer, making it a little bit bigger, the text a little
+
+37:18.880 --> 37:24.200
+bit bigger, I find that I like that more than org mode.
+
+37:24.200 --> 37:28.360
+If it's short enough, it doesn't matter, but if it's long enough or my thoughts are complex
+
+37:28.360 --> 37:38.160
+enough, not worrying about buffer headings or body paragraph content or anything along
+
+37:38.160 --> 37:43.800
+those lines, less presentation helps a lot in that.
+
+37:43.800 --> 37:50.960
+The automatic paragraph formatting just makes it work, I type, I'm good to go, it automatically
+
+37:50.960 --> 37:52.360
+does everything like that.
+
+37:52.360 --> 37:53.360
+Right.
+
+37:53.360 --> 37:58.400
+You can just write and you get all, you get all this stuff for free.
+
+37:58.400 --> 38:02.840
+That's kind of a lot, you know, that's like I talked about the cognitive overhead.
+
+38:02.840 --> 38:08.640
+You know, I think Emacs, people have a lot of trouble understanding why people stick
+
+38:08.640 --> 38:18.120
+with Emacs now, but I think it does, the common editing capabilities are very similar to hyperbole,
+
+38:18.120 --> 38:19.120
+right?
+
+38:19.120 --> 38:24.560
+So you go across all these modes, different applications, but the editing stays the same.
+
+38:24.560 --> 38:32.520
+That takes so much off your plate compared to learning new hotkeys for every application.
+
+38:32.520 --> 38:41.560
+And so, you know, we're sold and now you want that kind of thing for your writing, for your
+
+38:41.560 --> 38:43.560
+knowledge management.
+
+38:43.560 --> 38:50.840
+And yeah, I think org is, you know, really, it was built for the scientists, the researchers,
+
+38:50.840 --> 38:51.840
+right?
+
+38:51.840 --> 38:54.120
+They have to do all that stuff with citations.
+
+38:54.120 --> 38:57.040
+I'm never going to use the citation capability, right?
+
+38:57.040 --> 38:59.720
+I don't publish much anymore.
+
+38:59.720 --> 39:06.020
+So you know, all that work is kind of lost on me, whereas like, you know, better structured
+
+39:06.020 --> 39:12.840
+outlining is going to be a win for, you know, a very broad cross section of people.
+
+39:12.840 --> 39:19.400
+So I think it's, you know, I wish more people would give it a try, but I think now we're
+
+39:19.400 --> 39:25.760
+doing a lot more things that are making hyperbole more accessible to people.
+
+39:25.760 --> 39:31.240
+A lot of people, I don't know if we can, like people have asked for a doom interface or
+
+39:31.240 --> 39:32.880
+space max interface.
+
+39:32.880 --> 39:40.640
+I do notice on Reddit that tons of people seem to use one of those two and they've never
+
+39:40.640 --> 39:45.720
+learned Emacs in its core form, right?
+
+39:45.720 --> 39:49.160
+They're coming from VI, so they're Vim users or something.
+
+39:49.160 --> 39:55.500
+And they, I guess they like all this layering kind of capability, exposing the features.
+
+39:55.500 --> 40:00.560
+So I haven't really looked at that, but maybe, you know, if we did that and we don't have
+
+40:00.560 --> 40:08.480
+hyperbole on Melpa, so although, you know, some people, they replace Elpa mistakenly
+
+40:08.480 --> 40:12.160
+with Melpa, you know, in their config.
+
+40:12.160 --> 40:16.600
+And so they never see hyperbole because it's not in their packages.
+
+40:16.600 --> 40:22.920
+Like, I didn't know this existed, like, well, don't do that.
+
+40:22.920 --> 40:30.600
+One thing that would be nice for stuff like this is having Emacs in it for hyperbole with
+
+40:30.600 --> 40:35.780
+a knowledge base and then one with Orgrom and a knowledge base and one with the ZK package
+
+40:35.780 --> 40:39.300
+and a knowledge base, et cetera, et cetera.
+
+40:39.300 --> 40:45.740
+Is that something you might look at doing a little, you know, sort of like proof of
+
+40:45.740 --> 40:55.240
+concept of, and share with us, you know, give us some idea of your thoughts?
+
+40:55.240 --> 41:02.640
+I just thought of it while watching this talk, and I might put together some resources of,
+
+41:02.640 --> 41:10.360
+there's some other packages that, or ZK, or there's another one of these packages that
+
+41:10.360 --> 41:11.360
+has a knowledge base.
+
+41:11.360 --> 41:14.760
+I might put together resources like that, see if I see anybody else's.
+
+41:14.760 --> 41:16.880
+Yeah, that'd be great.
+
+41:16.880 --> 41:25.400
+And do you try to note, do you use a prods denote package?
+
+41:25.400 --> 41:29.600
+I haven't messed with that one yet.
+
+41:29.600 --> 41:32.520
+I've looked at it.
+
+41:32.520 --> 41:38.900
+One contention I see between using all these right here is, like, you have the org FC package
+
+41:38.900 --> 41:44.520
+for flashcards, and that would sound really nice for learning new English words that I
+
+41:44.520 --> 41:45.520
+ever come across.
+
+41:45.520 --> 41:50.520
+I could make that, put the description.
+
+41:50.520 --> 41:54.960
+But if I, it seems like you can either use org rom and you're completely tied into the
+
+41:54.960 --> 42:01.240
+org rom org system, or you don't do that, then you can't use any of those features where
+
+42:01.240 --> 42:05.800
+they treat each of the nodes as a individual system.
+
+42:05.800 --> 42:09.880
+I've dabbled with multiple of the systems, so maybe there's a way.
+
+42:09.880 --> 42:10.880
+Are you good with org rom?
+
+42:10.880 --> 42:13.920
+I've been having this one problem.
+
+42:13.920 --> 42:14.920
+It's weird.
+
+42:14.920 --> 42:21.280
+I get in this mode where I pointed it somewhere and it worked at one time, and now I repoint
+
+42:21.280 --> 42:26.040
+it somewhere, and then I point it back and it won't work anymore.
+
+42:26.040 --> 42:33.620
+So I can't get it to sometimes index my set of org files, and it seems like it should
+
+42:33.620 --> 42:43.460
+be so basic, but there's something in the sequence of how it caches, I guess, the directory
+
+42:43.460 --> 42:49.520
+of org files that maybe I've solved it already, I don't recall, but I was just wondering if
+
+42:49.520 --> 42:53.080
+anybody else had that experience.
+
+42:53.080 --> 43:00.000
+I've mostly just dabbled in a couple of these systems and then haven't really chosen one
+
+43:00.000 --> 43:02.120
+to just use.
+
+43:02.120 --> 43:03.120
+Do you program?
+
+43:03.120 --> 43:10.040
+Are you by nature a programmer or is it like a hobby?
+
+43:10.040 --> 43:11.040
+Hobby.
+
+43:11.040 --> 43:20.440
+I haven't done too much on writing my own functions, but Emacs is by far the biggest
+
+43:20.440 --> 43:28.720
+or longest program I've ever...longest program, config, whatever, that I've ever used.
+
+43:28.720 --> 43:34.200
+And you started on Emacs how long ago?
+
+43:34.200 --> 43:41.760
+Five or ten years ago, somewhere along those lines.
+
+43:41.760 --> 43:43.240
+Good one.
+
+43:43.240 --> 43:48.160
+Yeah, it was nice having Stelman there today, right?
+
+43:48.160 --> 43:56.520
+It's like, well, if you want an actual answer, there's something that only he could answer.
+
+43:56.520 --> 44:03.400
+I'm surprised how many questions there were on that talk.
+
+44:03.400 --> 44:06.240
+What about them?
+
+44:06.240 --> 44:09.840
+I was surprised just about how many questions there were on...
+
+44:09.840 --> 44:16.320
+Yeah, you hear all this negative stuff about him, but people are very interested in where
+
+44:16.320 --> 44:25.500
+stuff came from, why have you never used this package that everybody else uses and things
+
+44:25.500 --> 44:35.640
+like that, what his world view is, since it is so different than so many other people's.
+
+44:35.640 --> 44:47.200
+All right, well, great talking to you and good luck with your knowledge space research
+
+44:47.200 --> 44:51.200
+and yeah, let me know if there's something.
+
+44:51.200 --> 44:57.880
+Try out the development version of Hyperbole like I should, that'll get you all the newest
+
+44:57.880 --> 45:02.000
+features and we'll get 9.0 out as soon as we can.
+
+45:02.000 --> 45:06.640
+Yeah, I use the Borg, so I actually do try out the development already.
+
+45:06.640 --> 45:08.640
+Oh, great, super.
+
+45:08.640 --> 45:15.040
+Also because sometimes since I'm using the development version of Emacs, it doesn't always...
+
+45:15.040 --> 45:18.560
+I've had issues compiling in the past because I needed the newer code.
+
+45:18.560 --> 45:26.760
+I think, I can't entirely remember, but thanks for the package and good talking, nice ideas
+
+45:26.760 --> 45:27.760
+and talk.
+
+45:27.760 --> 45:28.760
+Yeah.
+
+45:28.760 --> 45:29.760
+Take care.
+
+45:29.760 --> 45:30.760
+Bye.
+
+45:30.760 --> 45:50.120
+Bye.
+
diff --git a/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.vtt b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.vtt
new file mode 100644
index 00000000..8845b9fd
--- /dev/null
+++ b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.vtt
@@ -0,0 +1,467 @@
+WEBVTT
+
+00:00.000 --> 00:13.360
+and we are live hello again everyone and hi Michael how you doing very well thank you
+
+00:13.360 --> 00:20.360
+how are you I am doing well I am running out of energy steadily but surely but it's it's
+
+00:20.360 --> 00:24.920
+it's always a confusing feeling you know because I feel the energy going away the excitement
+
+00:24.920 --> 00:30.360
+going up because not only because we are close to an end which means my turmoil and my plight
+
+00:30.360 --> 00:37.560
+will come to an end but also because it's nice to have finished any Max Kant and I've
+
+00:37.560 --> 00:42.400
+put so many great talk in the wild for people to to be able to consume so and that's no
+
+00:42.400 --> 00:46.760
+little thanks to all our speakers including you Michael so thank you so much oh no you're
+
+00:46.760 --> 00:52.160
+very welcome I'm just happy to be a part of it yeah and we're glad you are so Michael
+
+00:52.160 --> 00:57.760
+do you have the pad open in front of you I do indeed looks like you've got a few questions
+
+00:57.760 --> 01:04.680
+coming in here yes meeting the question and then answering them sure sure let's start
+
+01:04.680 --> 01:10.520
+off with the one one I've already answered how did you create the drill down representation
+
+01:10.520 --> 01:19.320
+of the make call wondered if I sketched it out by hand and scanned it so I should every
+
+01:19.320 --> 01:26.480
+talk I give both at work and elsewhere people ask this question I should like get a finder's
+
+01:26.480 --> 01:35.120
+fee from Excalidraw but there's a website on the web called Excalidraw.com very nice
+
+01:35.120 --> 01:42.000
+diagramming solution it makes these awesome sort of hand written looking diagrams so that's
+
+01:42.000 --> 01:50.880
+what I used first question have you seen Reclaim ID this allows you to make a login that you
+
+01:50.880 --> 01:57.160
+own or at least is more open source and ownable seems to fit with the indie web so this is
+
+01:57.160 --> 02:02.320
+one of the things I've come to like about speaking at EmacsConf I feel like I learn
+
+02:02.320 --> 02:08.040
+you know as much or more than I teach no I am not familiar with this so I will definitely
+
+02:08.040 --> 02:18.160
+be taking a look there is an indie web protocol for identity it's called indie auth but yeah
+
+02:18.160 --> 02:24.520
+thanks for the tip I will definitely check out Reclaim ID what happens when you republish
+
+02:24.520 --> 02:31.360
+or re-export the same post will the web mentions be sent out repeatedly they will not not you
+
+02:31.360 --> 02:40.880
+could do that I suppose you might annoy some of your recipients but my solution on successful
+
+02:40.880 --> 02:47.600
+send of the initial web mention notes that down and is smart enough to not re-send it
+
+02:47.600 --> 02:56.600
+a second yeah so and actually I want to follow up on something on IRC I think Carl Voight
+
+02:56.600 --> 03:03.440
+said oh I don't have to have a database you don't have to have a database but I do use
+
+03:03.440 --> 03:14.520
+a plain text file full of just just printed list forms to maintain state let's see an
+
+03:14.520 --> 03:19.720
+advantage I see to using org mode for the indie web is you can use it for your notes
+
+03:19.720 --> 03:26.800
+org room for example no export for private yes yes the web mentions could be org file
+
+03:26.800 --> 03:36.200
+yes absolutely so yeah I mean so many people have found org mode so handy as a writing
+
+03:36.200 --> 03:44.040
+tool that you know and I just felt like you were right there right you just need a little
+
+03:44.040 --> 03:50.200
+bit of code to get you to transcode the HTML and get it on the web and then it was like
+
+03:50.200 --> 03:55.560
+well gosh I'm right there just a little bit more code and I can start sending web mentions
+
+03:55.560 --> 04:10.560
+I could start posseing etc etc etc any thoughts on using with ox Hugo so no not because I
+
+04:10.560 --> 04:18.200
+have anything against ox Hugo simply because I'm unfamiliar with it there's a couple of
+
+04:18.200 --> 04:25.760
+static site generators out there that you can use with org mode my design philosophy
+
+04:25.760 --> 04:33.120
+for this was I was going to start with emacs and org mode out of the box and see how far
+
+04:33.120 --> 04:43.400
+I could get with just adding a little bit of a list around it this a web 3 approach p.s.
+
+04:43.400 --> 05:00.280
+former not former military just losing my hair not I don't know what web 3 means some
+
+05:00.280 --> 05:06.960
+people it seems to be a decentralized approach and indie web is all about reclaiming your
+
+05:06.960 --> 05:14.160
+identity and your data from a few they call them silos right we're talking about the big
+
+05:14.160 --> 05:28.160
+social media oh cool great help me the web one with static sites yep yep everybody go
+
+05:28.160 --> 05:35.160
+out and blog on your own server and web rings were kind of like the communication mechanism
+
+05:35.160 --> 05:50.560
+web 2 is more interactive yeah I mean web 2 certainly was more interactive I guess I
+
+05:50.560 --> 06:02.080
+see it as we're gonna Michael just interrupting a little quickly we are going to open up the
+
+06:02.080 --> 06:06.520
+Q&A to people so if you want to join us the same dude as usual you go to the talk page
+
+06:06.520 --> 06:15.720
+we've also posted the sorry to give you just a second just a second I'm verifying something
+
+06:15.720 --> 06:21.080
+with audio level okay cool apparently my audio is perfect we were trying to do some live adjustments
+
+06:21.080 --> 06:25.640
+so we're saying we've opened up the BBB room so that people we want to join the last five
+
+06:25.640 --> 06:32.080
+questions are able to do so so either on the talk page or you can do this also on IRC
+
+06:32.080 --> 06:36.320
+we've posted the link over there so Michael you feel free to keep taking questions on
+
+06:36.320 --> 06:39.600
+the pad we still have many of them but I just wanted to let people know in case they wanted
+
+06:39.600 --> 06:45.200
+to join and also one last information we will need to move on with the next talk in 16 minutes
+
+06:45.200 --> 06:57.560
+so you still have plenty of time yeah wow I'm excited there's so much time left to answer
+
+06:57.560 --> 07:04.320
+question or oh wow I'm not sure what I'm gonna do for 60 minutes oh no the former oh wow
+
+07:04.320 --> 07:09.240
+I'm not sure I'm gonna get to all these all these right well you'll be able to answer later
+
+07:09.240 --> 07:14.280
+try to do as many as you can okay so I'm on IRC right now somebody's telling me I'm super
+
+07:14.280 --> 07:19.480
+quiet I'm gonna adjust the mic no don't worry about OJ levels it's on us you don't worry
+
+07:19.480 --> 07:27.080
+about it let's see Sasha's gonna try and fix is there a workflow to use emacs to publish
+
+07:27.080 --> 07:38.360
+and connect directly to target websites so that's an interesting question can you what
+
+07:38.360 --> 07:46.080
+do you mean by workflow in that question so you want to cut telegraph out of the equation
+
+07:46.080 --> 08:00.880
+get that that means oh I'm sorry I thought somebody had joined the chat room don't worry
+
+08:00.880 --> 08:04.800
+I will I will let them know if you have people joining and asking questions if you hear another
+
+08:04.800 --> 08:08.560
+voice than mine it's someone joining and I will try to be polite and say yeah can you
+
+08:08.560 --> 08:13.320
+please wait let's Michael finish the question don't worry I don't know everything so if
+
+08:13.320 --> 08:20.560
+you want to cut telegraph out of equation that means you're going to need to take on
+
+08:20.560 --> 08:28.720
+more work client side in terms of first discovering the web mention endpoint which is gonna involve
+
+08:28.720 --> 08:37.840
+parsing HTML which we all hate then you're going to need to send the request to that
+
+08:37.840 --> 08:43.960
+web your web mention to that endpoint which introduces you know the standard question
+
+08:43.960 --> 08:48.120
+with web hooks is what if they're down what if you can't reach them what if you're not
+
+08:48.120 --> 08:53.560
+on the networks and now you got to build yourself a queuing system but sure sure absolutely
+
+08:53.560 --> 09:02.640
+indie web is just a protocol and I think the community would actually welcome fewer points
+
+09:02.640 --> 09:10.520
+of failure like telegraph we got the BBB audio better okay great so questions we were discussing
+
+09:10.520 --> 09:22.520
+web three Carl says some people started to term web zero for similar decentralized approaches
+
+09:22.520 --> 09:30.000
+yeah I don't think that by no means does indie web imply static site there are actually
+
+09:30.000 --> 09:38.440
+CMS systems that talk to that speak the indie web protocols I think even WordPress does
+
+09:38.440 --> 09:44.560
+it as does Drupal yeah so I don't know if you want to we can discuss further if you
+
+09:44.560 --> 09:56.080
+want to hop in the room but yeah I guess I see it more as a decentralized web than three
+
+09:56.080 --> 10:01.320
+do I have a process nope I had sorry the question is do you have a process running on the web
+
+10:01.320 --> 10:09.040
+server to receive requests no so those are cashed for me and I literally have a cron
+
+10:09.040 --> 10:16.080
+job on my personal desktop and once an hour I just reach out and say you got any more
+
+10:16.080 --> 10:23.920
+web mentions for me and process them back here that does mean given that I have a statically
+
+10:23.920 --> 10:32.280
+generated website I need to republish every time I receive a web mention Michael if you
+
+10:32.280 --> 10:35.240
+don't mind interrupting we have someone in the room who would like to ask a question
+
+10:35.240 --> 10:41.520
+Max if you want to unmute yourself if you could ask the question I'm not sure if you're just
+
+10:41.520 --> 10:47.600
+showing your webcam yes you do have a question go on hi Michael no I actually didn't have
+
+10:47.600 --> 10:55.160
+a question I asked a question about the web 3.0 and I have a little concern about you
+
+10:55.160 --> 11:01.160
+know you use you describe kind of how dead it was to have just a static site and not
+
+11:01.160 --> 11:08.800
+be able to interact with people and so I was you know just thinking along those lines is
+
+11:08.800 --> 11:16.360
+anywhere is it a better way how satisfied are you with this with this with web mentions
+
+11:16.360 --> 11:23.120
+and you know sort of thumbs up down and did you actually get a demo running I mean are
+
+11:23.120 --> 11:39.960
+we able to see it somewhere well you can see it on my site which is just but I have can
+
+11:39.960 --> 11:43.480
+actually can you put it in the back can you put it in the back so that other people can
+
+11:43.480 --> 11:53.880
+actually access it including Max okay yes Max I know you're still there but I just want
+
+11:53.880 --> 11:57.280
+everyone to be able to click on it as well I'll do it don't worry about it I'll take
+
+11:57.280 --> 12:08.720
+care of it here we go Carl says web 3 is supposed to be something really strange with blockchains
+
+12:08.720 --> 12:22.240
+and this is definitely nothing like that yeah Carl put it much better than I could and well
+
+12:22.240 --> 12:26.320
+I'll just kind of okay cool Max is still here I'll just finish answering the question how
+
+12:26.320 --> 12:37.400
+satisfied am I it's work in progress I'm initially happy I was limited by time for this talk
+
+12:37.400 --> 12:43.040
+and as you can see maybe I got too far into the weeds but it was fairly involved just
+
+12:43.040 --> 12:50.360
+describing how to send and receive web mentions there's a second indie web protocol called
+
+12:50.360 --> 13:00.320
+posse publish on your own site syndicate elsewhere in which you can say okay I want to publish
+
+13:00.320 --> 13:09.240
+this post to my site oh and at the same time fire off a tweet referencing it and fire off
+
+13:09.240 --> 13:18.120
+a mastodon to referencing it and there are protocols for like pulling likes and boosts
+
+13:18.120 --> 13:27.480
+of that back to your own site as feedback and I've been playing with that a little bit
+
+13:27.480 --> 13:36.880
+and actually feeling pretty good about it yeah so happy to talk more other questions
+
+13:36.880 --> 13:42.200
+okay right so do I have a process running on the web server to receive requests nope
+
+13:42.200 --> 13:49.960
+just a cron job I think perhaps you're doing too much inside emacs yeah yeah great question
+
+13:49.960 --> 13:56.400
+I can't remember if I alluded to this at the end of the talk but as I said when I started
+
+13:56.400 --> 14:05.080
+down this path felt that was so close with just plain vanilla emacs in org mode it couldn't
+
+14:05.080 --> 14:12.160
+be that hard right and of course this is famous last words initially it was just a little
+
+14:12.160 --> 14:20.000
+bit of code around that to get the static site generator up sending web mentions are
+
+14:20.000 --> 14:28.480
+yeah it's a lot of code and so I'm definitely kind of at this point of you know is it time
+
+14:28.480 --> 14:37.040
+to turn to a proper CMS I start out using web mentions of service web mention telegraph
+
+14:37.040 --> 14:44.200
+then you want to change endpoint whether to a different service or I want to take them
+
+14:44.200 --> 14:53.480
+I see I see it didn't be the way the web mention oh I'm sorry let me finish the question I
+
+14:53.480 --> 14:59.960
+keep to make this clear so the question is let's suppose you start your site using web
+
+14:59.960 --> 15:06.800
+mentions of service and then later on you decide I want to change services or I'm just
+
+15:06.800 --> 15:12.080
+going to handle this myself is there sort of a dead letter problem will web mentions
+
+15:12.080 --> 15:21.600
+show up at the at the old address and it shouldn't be so when somebody wants to reach you that
+
+15:21.600 --> 15:28.560
+is when they do endpoint discovery so they if you would get request for your page and
+
+15:28.560 --> 15:36.560
+parse the HTML and they discover where to send web mentions there pose it for some reason
+
+15:36.560 --> 15:45.160
+they did that and sat on that information for some period of time of course then they
+
+15:45.160 --> 15:51.320
+might that you know they might send it to an old address but that would be that would
+
+15:51.320 --> 15:59.680
+be a non-standard use of the protocol you should be good have I seen a Gregor browser
+
+15:59.680 --> 16:05.480
+is a decentralized kiss browser using some of the peer-to-peer protocols interesting
+
+16:05.480 --> 16:14.920
+I have not I'm going there right now thank you
+
+16:14.920 --> 16:18.720
+somebody points out some things are better done outside of e-max I have built something
+
+16:18.720 --> 16:33.760
+similar at by star dot net you see www dot by hyphen star dot net okay let's go see it
+
+16:33.760 --> 16:38.200
+this is interesting thank you I will definitely take a look yeah so I can say I'm kind of
+
+16:38.200 --> 16:42.840
+on the cusp of saying okay this has been a fun experiment now I need to go code it up
+
+16:42.840 --> 16:51.040
+outside of e-max I like the fact that you know the discussion we were having the question
+
+16:51.040 --> 16:56.600
+about you know am I doing too much in e-max is literally a question that could be asked
+
+16:56.600 --> 17:01.960
+to every single presenter at all the e-max conference other ads because you know the
+
+17:01.960 --> 17:05.400
+whole point of e-max golf is showing what type of stuff you can do in e-max and naturally
+
+17:05.400 --> 17:09.440
+the question is going to follow that is are you just doing too much with e-max and that's
+
+17:09.440 --> 17:15.080
+always great question to take and I think you did spend it late yeah it's the old joke
+
+17:15.080 --> 17:22.640
+right it's a good editor in an awesome operating system yes I will allow you to do the usual
+
+17:22.640 --> 17:30.680
+jokes about e-max I will not allow you to refer to our core enemy that's they who may
+
+17:30.680 --> 17:37.320
+not be named okay fair okay so Michael we do have about five minutes of questions left
+
+17:37.320 --> 17:42.000
+I think you've answered all the questions and I don't see anyone else with a microphone
+
+17:42.000 --> 17:52.520
+on in BBB so we might we might leave it at that if you're okay with this okay well thank
+
+17:52.520 --> 17:56.200
+you so much Michael for taking the time to not only do a presentation for us but also
+
+17:56.200 --> 18:03.560
+for answering the questions in here no thank you all like I say I always learn as much
+
+18:03.560 --> 18:09.560
+as I teach here so great thank you okay amazing all right and for the others I'll hold you
+
+18:09.560 --> 18:13.600
+hostage a little while longer Michael we will be adding into the next talk in about four
+
+18:13.600 --> 18:18.800
+minutes and 30 seconds so we'll put up some music and I'll you'll hear my voice again
+
+18:18.800 --> 18:27.640
+when we are supposed to go live again so see you in a bit everyone and see you Michael
+
+18:27.640 --> 18:38.680
+and we are all fair okay I have to dash see you Michael you are calling music on Jen
+
+18:38.680 --> 18:59.040
+can we put yes thank you
+
+18:59.040 --> 19:16.440
+we volume again now to the original level
+
+19:16.440 --> 19:41.840
+very good
+
+19:41.840 --> 19:56.440
+you know what
+
+19:56.440 --> 20:21.880
+what
+
+20:21.880 --> 20:38.120
+Alright, I'm talking now. Okay, the audio is good. See you guys, see you in about 2 minutes.
+
diff --git a/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt
new file mode 100644
index 00000000..7446a15d
--- /dev/null
+++ b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt
@@ -0,0 +1,43 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:14.080
+Introduction
+
+00:00:14.080 --> 00:01:13.880
+Maintaining a personal website using Org mode
+
+00:01:13.880 --> 00:02:32.040
+Problems with comments and isolation
+
+00:02:32.040 --> 00:03:17.800
+The Indieweb
+
+00:03:17.800 --> 00:05:00.600
+Webmentions
+
+00:05:00.600 --> 00:07:04.160
+Decentralized commenting
+
+00:07:04.160 --> 00:08:48.080
+The publication framework
+
+00:08:48.080 --> 00:09:54.000
+Sending Webmentions
+
+00:09:54.000 --> 00:11:36.840
+The process of publication
+
+00:11:36.840 --> 00:12:31.920
+Defining new link types
+
+00:12:31.920 --> 00:14:07.349
+org-publish-to
+
+00:14:07.349 --> 00:14:46.520
+Sending Webmentions with request.el
+
+00:14:46.520 --> 00:15:51.400
+Summary
+
+00:15:51.400 --> 00:16:34.920
+The future
diff --git a/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt
new file mode 100644
index 00000000..f41a3981
--- /dev/null
+++ b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt
@@ -0,0 +1,1048 @@
+WEBVTT captioned by bhavin192
+
+00:00:00.000 --> 00:00:02.280
+Hey everyone, I'm Michael,
+
+00:00:02.280 --> 00:00:03.640
+and I'm going to be talking about
+
+00:00:03.640 --> 00:00:06.000
+Org mode and the IndieWeb.
+
+00:00:06.000 --> 00:00:08.840
+I am located in the San Francisco Bay Area,
+
+00:00:08.840 --> 00:00:10.321
+where I'm a developer as well as
+
+00:00:10.321 --> 00:00:14.080
+a longtime Emacs user.
+
+00:00:14.080 --> 00:00:17.560
+So, I maintain a personal website using Org mode.
+
+00:00:17.560 --> 00:00:19.080
+If you're watching this talk,
+
+00:00:19.080 --> 00:00:21.560
+I'm going to guess that you probably are too.
+
+00:00:21.560 --> 00:00:24.880
+For anybody who isn't,
+
+00:00:24.880 --> 00:00:28.680
+let me explain exactly what I mean by that.
+
+00:00:28.680 --> 00:00:32.280
+I have a static website. I author the pages
+
+00:00:32.280 --> 00:00:34.000
+in Org mode's markup language,
+
+00:00:34.000 --> 00:00:36.280
+otherwise known as Orgdown.
+
+00:00:36.280 --> 00:00:38.440
+I use the Org export facility
+
+00:00:38.440 --> 00:00:43.760
+to transcode that markup to HTML.
+
+00:00:43.760 --> 00:00:47.000
+And then I just use rsync to push
+
+00:00:47.000 --> 00:00:51.760
+the resulting HTML pages up to a VPS.
+
+00:00:51.760 --> 00:00:52.854
+I like the workflow.
+
+00:00:52.854 --> 00:00:57.840
+It's familiar to me as a coder.
+
+00:00:57.840 --> 00:01:03.960
+I get to use familiar tools like Git and Make.
+
+00:01:03.960 --> 00:01:06.120
+Publishing and then pushing the site
+
+00:01:06.120 --> 00:01:09.800
+to a local test server is just `make`.
+
+00:01:09.800 --> 00:01:13.880
+Pushing it to the live site is just `make prod`.
+
+00:01:13.880 --> 00:01:18.680
+That said, certain problems made themselves apparent
+
+00:01:18.680 --> 00:01:22.080
+with this arrangement pretty quickly.
+
+00:01:22.080 --> 00:01:25.840
+Commenting was one. It's very difficult
+
+00:01:25.840 --> 00:01:28.200
+to support commenting on a static website.
+
+00:01:28.200 --> 00:01:29.501
+I've got no database.
+
+00:01:29.501 --> 00:01:34.120
+I have no real server, and so on.
+
+00:01:34.120 --> 00:01:35.960
+Yes, of course, there is Disqus
+
+00:01:35.960 --> 00:01:37.868
+and other third party services
+
+00:01:37.868 --> 00:01:38.800
+that will do this for you,
+
+00:01:38.800 --> 00:01:43.880
+but I was uncomfortable outsourcing that job.
+
+00:01:43.880 --> 00:01:45.320
+And it was more than just comments.
+
+00:01:45.320 --> 00:01:48.360
+There was a general sense of isolation.
+
+00:01:48.360 --> 00:01:50.680
+There's no connection to places
+
+00:01:50.680 --> 00:01:53.360
+like Reddit, or Mastodon, or Twitter,
+
+00:01:53.360 --> 00:01:56.560
+you know, where all the people are.
+
+00:01:56.560 --> 00:01:59.520
+I guess you can post, then Tweet a link to it.
+
+00:01:59.520 --> 00:02:01.960
+But suppose somebody responds to your Tweet.
+
+00:02:01.960 --> 00:02:05.520
+Now you've got a conversation going on on Twitter
+
+00:02:05.520 --> 00:02:07.640
+that you're a visitor, and
+
+00:02:07.640 --> 00:02:09.960
+that a non-Twitter-using visitor to your site
+
+00:02:09.960 --> 00:02:15.400
+would be completely disconnected from.
+
+00:02:15.400 --> 00:02:19.000
+I am seeing people using Reddit effectively
+
+00:02:19.000 --> 00:02:22.640
+as the comment section for their sites.
+
+00:02:22.640 --> 00:02:24.760
+But unless you've got an audience, you know,
+
+00:02:24.760 --> 00:02:27.720
+the size of Derek's or Amos's,
+
+00:02:27.720 --> 00:02:32.040
+I don't think that's really feasible either.
+
+00:02:32.040 --> 00:02:34.200
+Now, after casting about for some time,
+
+00:02:34.200 --> 00:02:37.680
+I stumbled upon something called the IndieWeb.
+
+00:02:37.680 --> 00:02:39.280
+In their own words, the IndieWeb is
+
+00:02:39.280 --> 00:02:41.960
+a community of independent and personal websites
+
+00:02:41.960 --> 00:02:44.401
+connected by simple standards based on
+
+00:02:44.401 --> 00:02:46.720
+the principles of owning your domain
+
+00:02:46.720 --> 00:02:48.480
+and using it as your primary identity,
+
+00:02:48.480 --> 00:02:50.360
+publishing on your own site,
+
+00:02:50.360 --> 00:02:52.418
+and optionally syndicating elsewhere,
+
+00:02:52.418 --> 00:02:54.320
+and owning your data.
+
+00:02:54.320 --> 00:02:57.680
+I would describe it as a collection of individuals
+
+00:02:57.680 --> 00:03:01.360
+who've chosen to own their own platforms,
+
+00:03:01.360 --> 00:03:05.520
+alongside a loosely specked set of standards
+
+00:03:05.520 --> 00:03:07.480
+that tie those sites together.
+
+00:03:07.480 --> 00:03:09.218
+And it's really those standards
+
+00:03:09.218 --> 00:03:10.640
+that make the IndieWeb
+
+00:03:10.640 --> 00:03:13.120
+more than just a call for everybody
+
+00:03:13.120 --> 00:03:14.735
+to go back to the arts
+
+00:03:14.735 --> 00:03:17.800
+and blog on on their own sites.
+
+00:03:17.800 --> 00:03:19.640
+Now, this presentation isn't going to
+
+00:03:19.640 --> 00:03:21.480
+focus on the IndieWeb as such.
+
+00:03:21.480 --> 00:03:23.360
+It's more about using Org mode
+
+00:03:23.360 --> 00:03:24.640
+to put your site on the IndieWeb.
+
+00:03:24.640 --> 00:03:28.040
+I'm a little limited by time here,
+
+00:03:28.040 --> 00:03:30.351
+so I'm going to focus on
+
+00:03:30.351 --> 00:03:32.080
+just one of those protocols,
+
+00:03:32.080 --> 00:03:33.400
+and that's Webmentions.
+
+00:03:33.400 --> 00:03:35.720
+So, what's a Webmention?
+
+00:03:35.720 --> 00:03:38.520
+Let's begin with the inveterate Alice,
+
+00:03:38.520 --> 00:03:39.468
+who has a website
+
+00:03:39.468 --> 00:03:42.680
+and has posted content to that site.
+
+00:03:42.680 --> 00:03:46.080
+Her old friend Bob comes along,
+
+00:03:46.080 --> 00:03:47.440
+notices that content
+
+00:03:47.440 --> 00:03:49.360
+and wishes to say something about it.
+
+00:03:49.360 --> 00:03:51.468
+He posts to his site
+
+00:03:51.468 --> 00:03:54.920
+and his publication software will,
+
+00:03:54.920 --> 00:03:57.080
+if it supports Webmentions,
+
+00:03:57.080 --> 00:04:00.160
+will notice that he's mentioned Alice's post.
+
+00:04:00.160 --> 00:04:04.320
+At that point, his publication software
+
+00:04:04.320 --> 00:04:07.240
+reaches out to Alice's site,
+
+00:04:07.240 --> 00:04:11.040
+asks for the mentioned document,
+
+00:04:11.040 --> 00:04:12.560
+and will examine it to see
+
+00:04:12.560 --> 00:04:15.600
+if Alice advertises an endpoint at her site
+
+00:04:15.600 --> 00:04:18.160
+capable of receiving Webmentions.
+
+00:04:18.160 --> 00:04:19.600
+In this case, it does.
+
+00:04:19.600 --> 00:04:23.480
+So, Bob's publishing software does it.
+
+00:04:23.480 --> 00:04:24.468
+At the end of the day,
+
+00:04:24.468 --> 00:04:26.000
+a Webmention is really just
+
+00:04:26.000 --> 00:04:30.360
+an HTTP post request with two parameters,
+
+00:04:30.360 --> 00:04:33.000
+a source and a target.
+
+00:04:33.000 --> 00:04:36.818
+On receipt, Alice's server will
+
+00:04:36.818 --> 00:04:39.400
+reach out to Bob's site,
+
+00:04:39.400 --> 00:04:43.280
+request the document that contains the mention,
+
+00:04:43.280 --> 00:04:45.920
+and validate it, decide whether or not
+
+00:04:45.920 --> 00:04:48.120
+she wants to accept the Webmention.
+
+00:04:48.120 --> 00:04:50.960
+In this case, it's legit, it's accepted,
+
+00:04:50.960 --> 00:04:54.000
+and Alice chooses to make a note,
+
+00:04:54.000 --> 00:04:56.760
+to update her content,
+
+00:04:56.760 --> 00:04:58.720
+to make a note of the fact
+
+00:04:58.720 --> 00:05:00.600
+that it was mentioned by Bob.
+
+00:05:00.600 --> 00:05:01.960
+Now a couple of things to note here.
+
+00:05:01.960 --> 00:05:03.480
+The first is that this is effectively
+
+00:05:03.480 --> 00:05:04.960
+decentralized commenting.
+
+00:05:04.960 --> 00:05:07.440
+Both parties own their content,
+
+00:05:07.440 --> 00:05:09.080
+and there's no third party involved,
+
+00:05:09.080 --> 00:05:13.640
+trusted or otherwise.
+
+00:05:13.640 --> 00:05:16.080
+Now at this point, you might object that, well,
+
+00:05:16.080 --> 00:05:18.720
+as the owner of a statically generated site,
+
+00:05:18.720 --> 00:05:21.600
+I have essentially none of the infrastructure
+
+00:05:21.600 --> 00:05:22.920
+I need to implement this.
+
+00:05:22.920 --> 00:05:27.120
+I have no server above and beyond Apache.
+
+00:05:27.120 --> 00:05:30.600
+I can't really…, I have no database.
+
+00:05:30.600 --> 00:05:33.680
+I guess you could send Webmentions with curl,
+
+00:05:33.680 --> 00:05:37.040
+but now to do Webmention endpoint discovery,
+
+00:05:37.040 --> 00:05:39.640
+you're going to be parsing arbitrary HTML.
+
+00:05:39.640 --> 00:05:41.120
+It's a lot of work.
+
+00:05:41.120 --> 00:05:45.080
+That's okay. There are sites out there
+
+00:05:45.080 --> 00:05:48.840
+that offer Webmentions as a service.
+
+00:05:48.840 --> 00:05:51.000
+So, let's take a look at how that goes.
+
+00:05:51.000 --> 00:05:54.920
+We return to our original example.
+
+00:05:54.920 --> 00:05:57.840
+Alice continues to advertise an endpoint
+
+00:05:57.840 --> 00:06:00.320
+capable of receiving Webmentions,
+
+00:06:00.320 --> 00:06:01.840
+but it's no longer on her site.
+
+00:06:01.840 --> 00:06:03.840
+It's at webmention.io.
+
+00:06:03.840 --> 00:06:08.000
+Bob is essentially in the same position,
+
+00:06:08.000 --> 00:06:09.920
+but he now has in his world
+
+00:06:09.920 --> 00:06:13.920
+a third party site called Telegraph.
+
+00:06:13.920 --> 00:06:16.040
+When Bob wants to publish,
+
+00:06:16.040 --> 00:06:19.760
+he no longer needs to go through all the work
+
+00:06:19.760 --> 00:06:21.760
+of sending Webmention,
+
+00:06:21.760 --> 00:06:25.280
+and of carrying out Webmention endpoint discovery.
+
+00:06:25.280 --> 00:06:27.880
+He sends one API request to Telegraph,
+
+00:06:27.880 --> 00:06:31.120
+effectively saying, please send a Webmention for me.
+
+00:06:31.120 --> 00:06:36.640
+Asynchronously, telegraph.io is going to
+
+00:06:36.640 --> 00:06:38.718
+retrieve Alice's post,
+
+00:06:38.718 --> 00:06:41.320
+do Webmention endpoint discovery,
+
+00:06:41.320 --> 00:06:45.400
+and send the Webmention on Bob's behalf.
+
+00:06:45.400 --> 00:06:48.280
+Except this time he's sending it to webmention.io.
+
+00:06:48.280 --> 00:06:53.080
+Now, at some arbitrary point in the future,
+
+00:06:53.080 --> 00:06:55.800
+Alice can ask webmention.io,
+
+00:06:55.800 --> 00:06:57.720
+"Hey, do I have any new Webmentions?"
+
+00:06:57.720 --> 00:07:00.480
+And if she does, she may choose
+
+00:07:00.480 --> 00:07:04.160
+to update her content and publish.
+
+00:07:04.160 --> 00:07:07.240
+Okay, so let's code this up.
+
+00:07:07.240 --> 00:07:09.120
+Now, I'm recording this talk
+
+00:07:09.120 --> 00:07:10.960
+about a month ahead of time
+
+00:07:10.960 --> 00:07:12.520
+and I haven't been able to put together
+
+00:07:12.520 --> 00:07:13.920
+a little demo project.
+
+00:07:13.920 --> 00:07:16.600
+Hopefully, I can hack something together
+
+00:07:16.600 --> 00:07:18.920
+before this video streams.
+
+00:07:18.920 --> 00:07:20.920
+But in the meantime,
+
+00:07:20.920 --> 00:07:22.960
+I'd like to imagine a little test site.
+
+00:07:22.960 --> 00:07:25.218
+It has a single page,
+
+00:07:25.218 --> 00:07:28.880
+maybe we'll call it index.org,
+
+00:07:28.880 --> 00:07:30.520
+and we're going to publish it.
+
+00:07:30.520 --> 00:07:32.600
+We're going to export it to
+
+00:07:32.600 --> 00:07:35.840
+a subdirectory of our project directory,
+
+00:07:35.840 --> 00:07:39.080
+simply called www.
+
+00:07:39.080 --> 00:07:44.800
+So, the entry point to the Org export system
+
+00:07:44.800 --> 00:07:46.640
+is the function org-publish,
+
+00:07:46.640 --> 00:07:49.960
+whose docstring helpfully says,
+
+00:07:49.960 --> 00:07:52.240
+it publishes all projects.
+
+00:07:52.240 --> 00:07:56.760
+The set of all projects is defined by
+
+00:07:56.760 --> 00:07:59.520
+the variable `org-publish-project-alist`,
+
+00:07:59.520 --> 00:08:02.320
+which is a very flexible association list
+
+00:08:02.320 --> 00:08:03.868
+that lets you define
+
+00:08:03.868 --> 00:08:05.520
+what files are in your project,
+
+00:08:05.520 --> 00:08:07.000
+how you wish to export them,
+
+00:08:07.000 --> 00:08:10.320
+where they're going to go, etc, etc, etc.
+
+00:08:10.320 --> 00:08:13.840
+So great. This is actually pretty straightforward.
+
+00:08:13.840 --> 00:08:15.880
+We just give ourselves a little Elisp file
+
+00:08:15.880 --> 00:08:17.040
+and a single function.
+
+00:08:17.040 --> 00:08:18.640
+I'll call it publish,
+
+00:08:18.640 --> 00:08:22.360
+and all it will do is define
+
+00:08:22.360 --> 00:08:25.000
+`org-publish-project-alist`
+
+00:08:25.000 --> 00:08:26.840
+and invoke `org-publish-all`.
+
+00:08:26.840 --> 00:08:31.880
+At that point, exporting is a one-liner.
+
+00:08:31.880 --> 00:08:35.560
+We just invoke Emacs, load up our site.el file,
+
+00:08:35.560 --> 00:08:37.280
+and invoke the publish function.
+
+00:08:37.280 --> 00:08:43.668
+And if we want to publish to the live server,
+
+00:08:43.668 --> 00:08:45.520
+that's just another one-liner of ours.
+
+00:08:45.520 --> 00:08:48.080
+So, that's the publication framework.
+
+00:08:48.080 --> 00:08:51.280
+Now, let's take a look at sending Webmentions.
+
+00:08:51.280 --> 00:08:54.400
+The idea is that we're going to
+
+00:08:54.400 --> 00:08:57.240
+get our fingers into the publication process.
+
+00:08:57.240 --> 00:09:01.000
+Note when we see a Webmention in
+
+00:09:01.000 --> 00:09:04.000
+the process of exporting our Orgdown,
+
+00:09:04.000 --> 00:09:07.840
+and write it out to disk for sending later on.
+
+00:09:07.840 --> 00:09:11.520
+Now, I didn't want to send a Webmention
+
+00:09:11.520 --> 00:09:13.040
+for every single link in the post.
+
+00:09:13.040 --> 00:09:14.960
+I wanted this to be an intentional choice.
+
+00:09:14.960 --> 00:09:16.960
+And it turns out there are
+
+00:09:16.960 --> 00:09:19.120
+different sorts of Webmentions
+
+00:09:19.120 --> 00:09:20.160
+you can make on a page.
+
+00:09:20.160 --> 00:09:22.520
+For instance, if you add
+
+00:09:22.520 --> 00:09:26.800
+the CSS class u-in-reply-to to your link,
+
+00:09:26.800 --> 00:09:28.635
+the recipient will
+
+00:09:28.635 --> 00:09:30.920
+interpret this Webmention as a reply.
+
+00:09:30.920 --> 00:09:33.440
+There are similar CSS classes
+
+00:09:33.440 --> 00:09:37.240
+for likes, reposts, and generalized mentions.
+
+00:09:37.240 --> 00:09:42.800
+When the recipient gets your Webmention,
+
+00:09:42.800 --> 00:09:45.640
+if they want to know who's talking to them,
+
+00:09:45.640 --> 00:09:47.960
+they need to parse your page
+
+00:09:47.960 --> 00:09:51.800
+and look for DOM elements with certain CSS classes
+
+00:09:51.800 --> 00:09:54.000
+defined by the protocol as well.
+
+00:09:54.000 --> 00:09:57.520
+I'm a visual thinker,
+
+00:09:57.520 --> 00:10:00.680
+so I kind of drew out the process of publication,
+
+00:10:00.680 --> 00:10:03.320
+and exactly where we're going to
+
+00:10:03.320 --> 00:10:05.160
+get our fingers into this.
+
+00:10:05.160 --> 00:10:07.320
+So, this is me invoking make,
+
+00:10:07.320 --> 00:10:09.800
+which of course fires up Emacs.
+
+00:10:09.800 --> 00:10:14.440
+Just as before, my publish function will define
+
+00:10:14.440 --> 00:10:17.920
+`org-publish-project-alist` with one difference.
+
+00:10:17.920 --> 00:10:21.040
+There is an attribute,
+
+00:10:21.040 --> 00:10:23.520
+a property in the list called `publishing-function`.
+
+00:10:23.520 --> 00:10:26.280
+We're going to need to customize that.
+
+00:10:26.280 --> 00:10:28.960
+As usual, we then call…,
+
+00:10:28.960 --> 00:10:31.960
+we kick off the process by calling `org-publish-all`.
+
+00:10:31.960 --> 00:10:36.468
+org-publish-all will invoke
+
+00:10:36.468 --> 00:10:37.320
+your publishing function
+
+00:10:37.320 --> 00:10:40.560
+for each page, and it will hand to
+
+00:10:40.560 --> 00:10:42.520
+your publishing function for each page.
+
+00:10:42.520 --> 00:10:45.080
+The name of the file you're publishing,
+
+00:10:45.080 --> 00:10:50.680
+where it's going, and a parameter entitled plist.
+
+00:10:50.680 --> 00:10:53.200
+This is not super well documented.
+
+00:10:53.200 --> 00:10:55.280
+There are points in the docs
+
+00:10:55.280 --> 00:10:57.440
+that refer to this as a communication channel.
+
+00:10:57.440 --> 00:11:01.800
+What I discovered by simply reading the code was that
+
+00:11:01.800 --> 00:11:04.560
+it's a property list that is initialized
+
+00:11:04.560 --> 00:11:09.680
+for each invocation of your publication function.
+
+00:11:09.680 --> 00:11:13.560
+The initial properties are
+
+00:11:13.560 --> 00:11:16.200
+inherited from your project,
+
+00:11:16.200 --> 00:11:20.801
+but you are free to add properties as you go
+
+00:11:20.801 --> 00:11:23.880
+to communicate between different portions
+
+00:11:23.880 --> 00:11:25.520
+of the publication process.
+
+00:11:25.520 --> 00:11:30.400
+My publication function really does one thing,
+
+00:11:30.400 --> 00:11:34.080
+and that's simply swap out the HTML template
+
+00:11:34.080 --> 00:11:36.840
+that's passed to `org-publish-to`.
+
+00:11:36.840 --> 00:11:43.696
+Now, in order to take note of
+
+00:11:43.696 --> 00:11:45.680
+each Webmention that I send,
+
+00:11:45.680 --> 00:11:47.585
+I took advantage of another
+
+00:11:47.585 --> 00:11:49.880
+Org mode extension point
+
+00:11:49.880 --> 00:11:52.720
+called defining new link types.
+
+00:11:52.720 --> 00:11:54.851
+Here you can see
+
+00:11:54.851 --> 00:11:58.560
+I've created a new link type called reply.
+
+00:11:58.560 --> 00:12:01.960
+One of the attributes that you can attach to this
+
+00:12:01.960 --> 00:12:06.160
+is the function that is used to export your link.
+
+00:12:06.160 --> 00:12:08.562
+I've elided the code for
+
+00:12:08.562 --> 00:12:10.720
+mentions, likes, and reposts.
+
+00:12:10.720 --> 00:12:13.520
+If you look at my export function,
+
+00:12:13.520 --> 00:12:16.280
+you can see that it ultimately yields
+
+00:12:16.280 --> 00:12:19.440
+the appropriate HTML for this link.
+
+00:12:19.440 --> 00:12:22.320
+Before that, it calls a little helper function
+
+00:12:22.320 --> 00:12:24.518
+that will pull out the actual
+
+00:12:24.518 --> 00:12:26.160
+target URL of the link
+
+00:12:26.160 --> 00:12:28.680
+and shove it into this communication channel
+
+00:12:28.680 --> 00:12:31.920
+under the property name `sp1ff/mentions`.
+
+00:12:31.920 --> 00:12:37.360
+So, `org-publish-to` is really the workhorse
+
+00:12:37.360 --> 00:12:40.240
+of the publication process.
+
+00:12:40.240 --> 00:12:42.120
+The first thing it's going to do is
+
+00:12:42.120 --> 00:12:47.400
+transcode from the parsed Orgdown,
+
+00:12:47.400 --> 00:12:50.320
+which is an intermediate representation
+
+00:12:50.320 --> 00:12:53.200
+known as Org elements, to HTML.
+
+00:12:53.200 --> 00:12:57.680
+In particular, for every one of my new links
+
+00:12:57.680 --> 00:13:00.440
+that I'm using to mark Webmentions,
+
+00:13:00.440 --> 00:13:04.040
+it's going to invoke my little export function.
+
+00:13:04.040 --> 00:13:06.600
+And so as we work our way through the post,
+
+00:13:06.600 --> 00:13:09.040
+I'm going to accumulate all the Webmentions
+
+00:13:09.040 --> 00:13:10.920
+that I've made in the property list.
+
+00:13:10.920 --> 00:13:14.360
+The second step is to actually render
+
+00:13:14.360 --> 00:13:16.560
+the final HTML document,
+
+00:13:16.560 --> 00:13:18.800
+and that's where my specialized template comes in.
+
+00:13:18.800 --> 00:13:21.480
+All I do there is, use it to get
+
+00:13:21.480 --> 00:13:24.920
+my authorship information into the page.
+
+00:13:24.920 --> 00:13:29.000
+And then the last step is called finalization.
+
+00:13:29.000 --> 00:13:32.320
+At this point, we have the rendered HTML document,
+
+00:13:32.320 --> 00:13:35.720
+and Org mode gives you an extension point here,
+
+00:13:35.720 --> 00:13:38.080
+where you can do arbitrary post-processing
+
+00:13:38.080 --> 00:13:39.200
+on that document.
+
+00:13:39.200 --> 00:13:42.160
+I arguably abuse it to retrieve
+
+00:13:42.160 --> 00:13:44.440
+all the Webmentions I've made
+
+00:13:44.440 --> 00:13:46.280
+out of the communication channel
+
+00:13:46.280 --> 00:13:47.920
+and write them to disk.
+
+00:13:47.920 --> 00:13:54.840
+At this point, when we type make,
+
+00:13:54.840 --> 00:13:59.160
+we wind up with the rendered HTML
+
+00:13:59.160 --> 00:14:01.080
+for our Orgdown document,
+
+00:14:01.080 --> 00:14:03.880
+along with a little text file
+
+00:14:03.880 --> 00:14:06.040
+in which we've recorded all the Webmentions
+
+00:14:06.040 --> 00:14:07.349
+that need to be sent.
+
+00:14:07.349 --> 00:14:11.800
+The next step is to send said Webmentions.
+
+00:14:11.800 --> 00:14:15.560
+This is surprisingly easy in Emacs Lisp.
+
+00:14:15.560 --> 00:14:17.360
+This is my actual implementation.
+
+00:14:17.360 --> 00:14:22.360
+I use the request.el package to talk to Telegraph.
+
+00:14:22.360 --> 00:14:26.920
+And at this point, we really don't need to
+
+00:14:26.920 --> 00:14:30.640
+add a lot to our little site Elisp file.
+
+00:14:30.640 --> 00:14:34.320
+I sketched out a `send-webmentions` implementation
+
+00:14:34.320 --> 00:14:36.160
+that just goes through in a loop
+
+00:14:36.160 --> 00:14:39.000
+and calls my send-webmention function.
+
+00:14:39.000 --> 00:14:42.640
+And now publication becomes a two-step process.
+
+00:14:42.640 --> 00:14:46.520
+First, the org-publish, then sending Webmentions.
+
+00:14:46.520 --> 00:14:51.418
+Okay, so I realize this has been
+
+00:14:51.418 --> 00:14:52.800
+a bit of a whirlwind.
+
+00:14:52.800 --> 00:14:55.240
+So, where are we now?
+
+00:14:55.240 --> 00:15:00.600
+We have a sample site that we can publish
+
+00:15:00.600 --> 00:15:02.400
+and have sent Webmentions.
+
+00:15:02.400 --> 00:15:05.480
+And we've done it with just Emacs, Org mode,
+
+00:15:05.480 --> 00:15:07.080
+a little Lisp, and a make file.
+
+00:15:07.080 --> 00:15:09.080
+If you'd like to see more,
+
+00:15:09.080 --> 00:15:11.680
+I've put my library up on GitHub.
+
+00:15:11.680 --> 00:15:13.754
+It has logic for both
+
+00:15:13.754 --> 00:15:15.560
+sending and receiving Webmentions
+
+00:15:15.560 --> 00:15:16.960
+as well as something
+
+00:15:16.960 --> 00:15:19.120
+that on the IndieWeb is called POSSE,
+
+00:15:19.120 --> 00:15:22.400
+which is an acronym standing for
+
+00:15:22.400 --> 00:15:25.400
+Publish (on your) Own Site, Syndicate Elsewhere.
+
+00:15:25.400 --> 00:15:27.818
+What that means is that
+
+00:15:27.818 --> 00:15:31.400
+you turn the publication step
+
+00:15:31.400 --> 00:15:35.400
+from merely publishing new content to your site
+
+00:15:35.400 --> 00:15:36.920
+to also replicating it to places
+
+00:15:36.920 --> 00:15:39.160
+like Twitter and Facebook and so forth.
+
+00:15:39.160 --> 00:15:44.120
+And also when people like, comment,
+
+00:15:44.120 --> 00:15:45.960
+and retweet your content,
+
+00:15:45.960 --> 00:15:47.680
+that gets fed back to your site,
+
+00:15:47.680 --> 00:15:51.400
+where you can display it as comments.
+
+00:15:51.400 --> 00:15:52.600
+In terms of the future,
+
+00:15:52.600 --> 00:15:54.520
+I feel like I'm at a decision point.
+
+00:15:54.520 --> 00:15:58.000
+Org mode is admirably flexible,
+
+00:15:58.000 --> 00:16:00.320
+and I'm confident that I can continue to
+
+00:16:00.320 --> 00:16:02.560
+add support for IndieWeb protocols.
+
+00:16:02.560 --> 00:16:05.440
+On the other hand, it is so flexible
+
+00:16:05.440 --> 00:16:07.880
+that the process of figuring out
+
+00:16:07.880 --> 00:16:10.680
+which extension points to use in any situation
+
+00:16:10.680 --> 00:16:12.000
+is very challenging.
+
+00:16:12.000 --> 00:16:14.800
+When I started down this path,
+
+00:16:14.800 --> 00:16:17.840
+my mindset was keep it simple
+
+00:16:17.840 --> 00:16:20.400
+and let's just see how far I could get with Org mode.
+
+00:16:20.400 --> 00:16:23.160
+And I feel like I might be bumping up
+
+00:16:23.160 --> 00:16:25.800
+against the limitations of that approach now.
+
+00:16:25.800 --> 00:16:34.920
+Thank you very much.
diff --git a/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.vtt b/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.vtt
new file mode 100644
index 00000000..dd1a46d4
--- /dev/null
+++ b/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.vtt
@@ -0,0 +1,1019 @@
+WEBVTT
+
+00:00.000 --> 00:01.800
+Oh, it's already being recorded.
+
+00:01.800 --> 00:02.800
+Great.
+
+00:02.800 --> 00:03.800
+So, hi, Alfred.
+
+00:03.800 --> 00:04.800
+How are you doing?
+
+00:04.800 --> 00:05.800
+I'm doing great.
+
+00:05.800 --> 00:06.800
+Thank you.
+
+00:06.800 --> 00:07.800
+It's a bit dark outside.
+
+00:07.800 --> 00:09.840
+I understand it's morning for most of you.
+
+00:09.840 --> 00:12.000
+Yes, well, not for me.
+
+00:12.000 --> 00:16.280
+I'm also in Europe, and I can tell you it's going to get dark pretty damn quickly.
+
+00:16.280 --> 00:19.000
+So, thank you so much for your talk.
+
+00:19.000 --> 00:22.440
+I didn't get to ask you the question before, but do you have access to the pads and the
+
+00:22.440 --> 00:25.000
+questions?
+
+00:25.000 --> 00:26.520
+I do have access to it.
+
+00:26.520 --> 00:30.520
+I'll just open it up.
+
+00:30.520 --> 00:33.520
+I'm not sure Sasha had given it to me, no.
+
+00:33.520 --> 00:35.520
+Sorry, what was the question?
+
+00:35.520 --> 00:38.520
+Could you post a link to it in the chat?
+
+00:38.520 --> 00:39.520
+I can give you a link.
+
+00:39.520 --> 00:40.520
+You can press.
+
+00:40.520 --> 00:45.480
+I'm pretty much getting the chat, so it should appear on the left, but in the meantime, if
+
+00:45.480 --> 00:49.480
+you want, I can just ask you the question, and you can maybe, whilst you do the little
+
+00:49.480 --> 00:54.520
+thing to open the pad, we can actually start answering one of the questions.
+
+00:54.520 --> 00:56.520
+Do you mind if I read you one?
+
+00:56.520 --> 00:58.520
+Yeah, go ahead.
+
+00:58.520 --> 00:59.520
+Sure.
+
+00:59.520 --> 01:02.720
+So the first question that we had was, it'd be interesting if you explained why WeChat
+
+01:02.720 --> 01:04.440
+is a necessity for you.
+
+01:04.440 --> 01:07.760
+Outside China, most people have no reason to use it at all.
+
+01:07.760 --> 01:11.520
+So can you actually give up on this?
+
+01:11.520 --> 01:19.520
+My utility for WeChat is basically, I've got to have calls every morning, so my manager
+
+01:19.520 --> 01:20.520
+has to use the tool.
+
+01:20.520 --> 01:23.520
+He's not a huge fan of it either.
+
+01:23.520 --> 01:28.520
+It's company policy, and there's plenty of sharing that has to go through that.
+
+01:28.520 --> 01:37.520
+So it's kind of all, since it's the tool that's used by most companies in China, it's kind
+
+01:37.520 --> 01:39.520
+of a tool that you have to work around.
+
+01:39.520 --> 01:42.520
+Now, most people know this.
+
+01:42.520 --> 01:49.520
+WeChat is a privacy nightmare, and as I touched on during my talk, it's also just a nightmare
+
+01:49.520 --> 01:51.520
+in general to work around.
+
+01:51.520 --> 01:57.520
+It's interesting to try and find ways to work around it or to minimize its impact on my
+
+01:57.520 --> 01:59.520
+life as much as possible.
+
+01:59.520 --> 02:02.520
+So strictly speaking, I don't need to use it, obviously.
+
+02:02.520 --> 02:14.520
+Functions that it has can be used by other software, but yeah, that's most of it.
+
+02:14.520 --> 02:15.520
+Okay, great.
+
+02:15.520 --> 02:16.520
+Also, I'm really sorry.
+
+02:16.520 --> 02:19.520
+Apparently, my audio seems to be crackling a little bit.
+
+02:19.520 --> 02:23.520
+I will address this as soon as we're finished with this talk, but there isn't all that much
+
+02:23.520 --> 02:24.520
+I can do right now.
+
+02:24.520 --> 02:25.520
+So sorry, people.
+
+02:25.520 --> 02:28.520
+You'll have to deal with it for a little while.
+
+02:28.520 --> 02:30.520
+Okay, so next question.
+
+02:30.520 --> 02:33.520
+There's a question that is actually dear to my heart.
+
+02:33.520 --> 02:36.520
+I've looked at CRD.er for collaborative real-time editing.
+
+02:36.520 --> 02:39.520
+Do you actually know what it is?
+
+02:39.520 --> 02:42.520
+I hadn't looked at it, no.
+
+02:42.520 --> 02:51.520
+For me, collaborative is less important because most of my work is just like versions.
+
+02:51.520 --> 02:57.520
+So I have a version of a script that I send off to my editor, and we don't work on it
+
+02:57.520 --> 02:58.520
+together.
+
+02:58.520 --> 03:08.520
+So that's kind of been less of an important part for my workflow, but it is interesting.
+
+03:08.520 --> 03:10.520
+I'll have to take a look at it.
+
+03:10.520 --> 03:16.520
+It used to be a bigger part of my workflow when I was a student.
+
+03:16.520 --> 03:20.520
+So it's definitely interesting to look into, but unfortunately, I don't have much to say
+
+03:20.520 --> 03:23.520
+about it.
+
+03:23.520 --> 03:25.520
+Yeah, but you're fine.
+
+03:25.520 --> 03:28.520
+The reason is that I hope I don't have too much now.
+
+03:28.520 --> 03:31.520
+Alfred, can you tell me, am I cutting off a lot when I'm talking?
+
+03:31.520 --> 03:32.520
+Yeah, it's pretty bad.
+
+03:32.520 --> 03:38.520
+I thought it was my internet connection, but it's not great.
+
+03:38.520 --> 03:40.520
+You know what?
+
+03:40.520 --> 03:44.520
+What we'll do for the moment is that we'll stick to the audio simply.
+
+03:44.520 --> 03:48.520
+Can you still hear me right now?
+
+03:48.520 --> 03:51.520
+Yeah, I can hear you a little bit better.
+
+03:51.520 --> 03:52.520
+Okay, sure.
+
+03:52.520 --> 03:54.520
+I'll put up my webcam like this.
+
+03:54.520 --> 03:55.520
+You know what?
+
+03:55.520 --> 03:57.520
+We just care about you, so you'll have to be solid on the scene.
+
+03:57.520 --> 04:01.520
+The reason I was asking you about CRDT, is it better now?
+
+04:01.520 --> 04:03.520
+Can you just confirm the audio is better?
+
+04:03.520 --> 04:05.520
+Yeah, the audio is much better.
+
+04:05.520 --> 04:06.520
+Cool, thank you.
+
+04:06.520 --> 04:08.520
+I'm so happy to hear this.
+
+04:08.520 --> 04:13.520
+The reason we're mentioning CRDT is that it's actually pretty great.
+
+04:13.520 --> 04:19.520
+A lot of people think about collaborative editing, and they tend to think about Google Doc
+
+04:19.520 --> 04:25.520
+or any kind of proprietary solution, but CRDT is kind of broaching the gap
+
+04:25.520 --> 04:29.520
+to what you can do with multiple people using Emacs.
+
+04:29.520 --> 04:33.520
+Now, I'm talking about this because I've worked with Shantan Hong,
+
+04:33.520 --> 04:37.520
+who is the mentor of CRDT, and we've worked a little bit on it,
+
+04:37.520 --> 04:42.520
+and they are still infuriating problems with it, especially making it secure
+
+04:42.520 --> 04:45.520
+and all this jazzy nonsense.
+
+04:45.520 --> 04:51.520
+But I do recommend looking into it because it would make it much easier to work with other people.
+
+04:51.520 --> 04:58.520
+All right, now that I am not lagging anymore, do you have the pad in front of you?
+
+04:58.520 --> 04:59.520
+I do.
+
+04:59.520 --> 05:01.520
+Do you want me to answer questions directly?
+
+05:01.520 --> 05:04.520
+Yes, that might be best.
+
+05:04.520 --> 05:09.520
+I kind of like to work with the little hells in the background to make sure that I can...
+
+05:09.520 --> 05:11.520
+All right, I'll leave you to it.
+
+05:11.520 --> 05:17.520
+I'll answer the question about org-mode files and sharing, which I've encountered.
+
+05:17.520 --> 05:24.520
+I've kind of had a whole issue starting out with, well, I've started working with org-mode files,
+
+05:24.520 --> 05:27.520
+and now I've got to figure out what do I do with them.
+
+05:27.520 --> 05:32.520
+So my first instinct was I'll just share the org-mode file directly,
+
+05:32.520 --> 05:41.520
+which as some people might have figured out, if they've tried, is not very successful with normal people.
+
+05:41.520 --> 05:48.520
+I've also tried exporting it to docx or to ODT, but that's problematic because you have, well,
+
+05:48.520 --> 05:51.520
+plenty of standards in ODT which don't transfer well.
+
+05:51.520 --> 05:59.520
+So for example, by default, the ODT kind of adopts, what's it called, a latex-like structure.
+
+05:59.520 --> 06:08.520
+So it's like 1.1.1, which isn't optimal for writing and sharing documents, at least in the way that I write them.
+
+06:08.520 --> 06:15.520
+So what I've settled for is for now just not sharing the org directly.
+
+06:15.520 --> 06:25.520
+I wanted to be able to do that through GitHub or GitLab, but it's a bit too much of a hassle to ask people to create an account there.
+
+06:25.520 --> 06:34.520
+And I've just created some export profiles for my ODT documents, which sorts out that problem
+
+06:34.520 --> 06:40.520
+and allows me to just share that through that and kind of bypass org-mode files for now.
+
+06:40.520 --> 06:45.520
+So unfortunately, I kind of am not able to stay 100% org.
+
+06:45.520 --> 06:53.520
+My plan on the long term is to have it go up on a website, so kind of make a work wiki,
+
+06:53.520 --> 06:59.520
+which will allow me to link back to some research documents in the script.
+
+06:59.520 --> 07:12.520
+So that's the long term plan, and that'll be built with org-mode documents, so with OX Hugo and all that kind of thing.
+
+07:12.520 --> 07:15.520
+But yeah, that's most of it.
+
+07:15.520 --> 07:21.520
+Pandoc for incoming and outgoing docs, repeating conversions.
+
+07:21.520 --> 07:28.520
+So I do use Pandoc for outgoing docs, as I just said.
+
+07:28.520 --> 07:32.520
+I found some issues with document quality.
+
+07:32.520 --> 07:43.520
+So as I said, layouts are kind of wonky, but that's possible to work through if you go into the settings
+
+07:43.520 --> 07:49.520
+and adjust basically to how you want it to look like.
+
+07:49.520 --> 07:54.520
+And for incoming docs, so that's a bit more of a hassle.
+
+07:54.520 --> 08:02.520
+My plan for this talk was to have it a bit more ready, but I've got this integration for org-ic,
+
+08:02.520 --> 08:10.520
+org-apple-pages documents, that kind of thing.
+
+08:10.520 --> 08:22.520
+So that's often the documents that I get from my colleagues, and I found a way to transfer them into org documents.
+
+08:22.520 --> 08:29.520
+I did that kind of quickly, so I don't think I'm quite ready to share exactly how it went,
+
+08:29.520 --> 08:34.520
+but I'm planning on doing some documentation around that.
+
+08:34.520 --> 08:40.520
+But yeah, basically the gist of it is, I don't find it a huge issue.
+
+08:40.520 --> 08:52.520
+I do use other tools other than just Pandoc to complement that, because otherwise, yes, I wouldn't be able to use that for incoming and outgoing docs,
+
+08:52.520 --> 08:56.520
+and I'd have to copy and paste that. Yes?
+
+08:56.520 --> 09:00.520
+Sorry, I mispress my talking to production button. Don't mind me.
+
+09:00.520 --> 09:02.520
+No worries.
+
+09:02.520 --> 09:13.520
+Begin on Emacs again. Welcome. Yeah, that's an issue I've got as well.
+
+09:13.520 --> 09:14.520
+Let's take your time.
+
+09:14.520 --> 09:24.520
+So Alfred, what we're probably going to do soon is that, as we've probably told you in the opening remarks, we will be letting people in.
+
+09:24.520 --> 09:37.520
+So right now we are in the room with Alfred on BBB, BigBlueButton, and we have now opened the session so that people can join and ask questions with their voice rather than having to type them out.
+
+09:37.520 --> 09:40.520
+And we have about 10 more minutes until we need to move on to the next talk.
+
+09:40.520 --> 09:51.520
+So normally, if you go to the talk page or all the areas that Sasha pointed out earlier, you should be able to find the link to the room and join us to ask questions directly to Alfred.
+
+09:51.520 --> 09:56.520
+And Alfred, in the meantime, I don't think we have any more questions for now.
+
+09:56.520 --> 10:01.520
+You have the questions about beginning on Emacs that is now finished, if you want to take this one in the meantime.
+
+10:01.520 --> 10:08.520
+Yeah. And so the comments and all that, I'll go through the notes again once I've got a bit more time.
+
+10:08.520 --> 10:16.520
+It's been a bit of a hectic day and put some more references in.
+
+10:16.520 --> 10:21.520
+So what was your moment when you started to work in Emacs instead of config editing?
+
+10:21.520 --> 10:33.520
+Interesting. So basically, as I hinted at in my talk, I did spend a lot of time this summer just editing my configs.
+
+10:33.520 --> 10:50.520
+And I kind of had the click, the moment where, oh, I really need to stop doing just that after I had editing, well, text editing workflow that I was happy with.
+
+10:50.520 --> 10:56.520
+So I think it's possible to just jump into doing Emacs without editing the config at all.
+
+10:56.520 --> 10:58.520
+That's not the way that I work.
+
+10:58.520 --> 11:09.520
+But I think that, yeah, being able to not be too frustrated in like figuring out how to take notes, like the Space NMT in Doom Emacs,
+
+11:09.520 --> 11:18.520
+just creating an org capture templates or using an org capture templates and realizing, all right, I can just, any config idea that I have,
+
+11:18.520 --> 11:28.520
+I can put off to later and continue focusing on this work that I have right in front of me.
+
+11:28.520 --> 11:34.520
+I think that was kind of a moment where I realized, all right, I don't need to edit this config all day.
+
+11:34.520 --> 11:42.520
+And I like to edit my config for like a whole month, but obviously that's not quite feasible.
+
+11:42.520 --> 11:51.520
+I mean, working on a month on your config, you know, some of us have been working on our config for the better part of the last 30 years or 10 years or 20 years, depending on your age.
+
+11:51.520 --> 11:54.520
+So do not worry, you will find the time to work on your config.
+
+11:54.520 --> 11:57.520
+Emacs is just about editing your config.
+
+11:57.520 --> 11:59.520
+So before you continue, I just want to let people know.
+
+11:59.520 --> 12:05.520
+So we have opened up the question and answer room and now people can join and ask questions.
+
+12:05.520 --> 12:13.520
+But I see for now, we mostly have people wanting to listen in, but that's also because as soon as we'll need to move the stream to the next talk,
+
+12:13.520 --> 12:17.520
+you'll still be able to join the BBB room and it will still be open.
+
+12:17.520 --> 12:25.520
+So that if you want to ask questions to Alfred off stream, be careful, it will still be recorded and still be posted on the website afterwards.
+
+12:25.520 --> 12:26.520
+Well, you can do so.
+
+12:26.520 --> 12:30.520
+And as long as Alfred is available, he can answer your questions.
+
+12:30.520 --> 12:41.520
+And otherwise, if you don't want to join, you can still type your questions in a pad and I'm sure we'll find the time maybe after Christmas or whenever we are all a little more available to answer all the questions that we have.
+
+12:41.520 --> 12:45.520
+All right. So sorry, Alfred, you can go now again.
+
+12:45.520 --> 12:53.520
+OK, so I've seen I've seen the latest question from Vidianos.
+
+12:53.520 --> 12:55.520
+So why is Emacs recommended for journalism?
+
+12:55.520 --> 13:02.520
+It's actually an interesting question because that's that's what I had asked myself when I just started.
+
+13:02.520 --> 13:15.520
+And I wouldn't say it's recommended. Obviously, it's it's like just as Emacs isn't recommended to anyone in particular because you have you have to really figure out, oh, this is for me.
+
+13:15.520 --> 13:18.520
+But I think it's yeah.
+
+13:18.520 --> 13:25.520
+Sorry, sorry, sorry. Is my button not working again? I will, I will chastise myself.
+
+13:25.520 --> 13:29.520
+So I think it's.
+
+13:29.520 --> 13:40.520
+Gotta get back into it. And it's valuable for journalism in the sense that there are plenty of tools that are used for scientific research, which are also used for journalism research.
+
+13:40.520 --> 13:48.520
+And in the sense that Emacs is kind of tailored through big tags, through big latex, through like Orgrom and Orgrom Noter, that kind of thing.
+
+13:48.520 --> 13:56.520
+And it's it's very easy to transfer these skills into journalism.
+
+13:56.520 --> 14:05.520
+And because you're just researching topics and you're transcribing interviews, you're like going through data and trying to figure out, all right, this is the part that's that's valuable.
+
+14:05.520 --> 14:13.520
+This is like something that I'm going to research. And for me, Orgrom is kind of a game changer because it allows me to just.
+
+14:13.520 --> 14:22.520
+Set my set my thoughts aside, just create a create a Rome link and know that I'm going to I'm going to get back to it.
+
+14:22.520 --> 14:30.520
+And so I think it's recommended in that sense, because otherwise I'd just be writing in in a Google Drive document.
+
+14:30.520 --> 14:36.520
+And just be spending all my days working on stuff that's not exactly related.
+
+14:36.520 --> 14:45.520
+But obviously, for people who have a bit more self-control than I do, it's probably a bit easier and less less necessary.
+
+14:45.520 --> 14:51.520
+But it's so good to hear this. Sorry for the interruption, but it's so good to hear that Orgrom actually manages to.
+
+14:51.520 --> 14:55.520
+People manage to use Orgrom to, you know, give some more life to their notes.
+
+14:55.520 --> 15:00.520
+It's just not a scribbled notes in one of your book that you never open again.
+
+15:00.520 --> 15:06.520
+It's the fact that it's just a file and that you can link it very easily to the rest of your files.
+
+15:06.520 --> 15:14.520
+It makes it really easily accessible to not forget about it and to try to refine it later on into something more valuable.
+
+15:14.520 --> 15:17.520
+Be it an article, be it a research paper or stuff like this.
+
+15:17.520 --> 15:21.520
+So, yeah, I'm very pleased to hear that Orgrom is being put to such use.
+
+15:21.520 --> 15:29.520
+And we'll hear plenty more about Orgrom and Zettelkasten as usual ever since there was the boom in 2020 about Orgrom stuff and Zettelkasten stuff.
+
+15:29.520 --> 15:36.520
+So don't worry about it. And if you're tired about it, well, sorry, you can go watch that or something.
+
+15:36.520 --> 15:44.520
+Yeah, no, I think that when I realized how to use Orgrom was also kind of a moment that made me want to stay to stay there.
+
+15:44.520 --> 16:01.520
+Like I had shown it on the on the talk, but my my documentary ideas page is basically just like chock full of ideas of stuff that I have thought about for five minutes and just stuff there.
+
+16:01.520 --> 16:05.520
+And no, but I can I can create like stumble on the link at some point and work on it.
+
+16:05.520 --> 16:22.520
+So it's yeah, it's very valuable. I think it's something that we even outside of Emacs, we should probably be a bit more conscious of of using these kinds of tools and promoting promoting that kind of association and kind of linking.
+
+16:22.520 --> 16:29.520
+Even outside of the confines of Orgrom as much as as there are confines, I suppose.
+
+16:29.520 --> 16:44.520
+I think people are already complaining that there's too much Orgrom being talked about. So before we start, well, going outside of Emacs, you know, there are plenty of tools as well outside of Emacs tools, which are also floss, which allow you to have similar workflows.
+
+16:44.520 --> 16:57.520
+But I believe really that tools within Emacs are within the entire stack of Emacs with the philosophy of Emacs that allows so much different modes to be developed on top of it, which is amazing.
+
+16:57.520 --> 17:03.520
+Before we continue, I kind of want to check the clock because we will need to get started on the next talk eventually.
+
+17:03.520 --> 17:11.520
+We do have a lot of people joining on BBB and thank you. Hi, everyone. You are probably hearing me twice, once in BBB and once on the stream.
+
+17:11.520 --> 17:17.520
+So don't forget to pause the stream if you are hearing my voice in doubles.
+
+17:17.520 --> 17:27.520
+We will need to move at 45, so in five minutes, to the next talk. And until then, until then, it is very French of me to say then and not then.
+
+17:27.520 --> 17:31.520
+We can take a couple more questions then, Alfred, if you want.
+
+17:31.520 --> 17:34.520
+Absolutely.
+
+17:34.520 --> 17:47.520
+So yeah, open the questions to people joining in on the mic. And if there's nothing, I'm happy to chat around or to wait.
+
+17:47.520 --> 17:53.520
+Sure. Do we have any other questions on the panel? I think you've been pretty thorough and thank you so much for taking the time to answer this.
+
+17:53.520 --> 18:04.520
+One of the reasons that we wanted to have two tracks this year is to be able to spend a little more time with Spukers because it was really heart wrenching last year to have so many talks going one after the other.
+
+18:04.520 --> 18:10.520
+We barely had the time to talk. And this year, it's a more of a leisurely paced stream.
+
+18:10.520 --> 18:16.520
+And yeah, it feels like I can take my time. I'm not running constantly out of breath.
+
+18:16.520 --> 18:26.520
+It's still the beginning. OK, I still was extremely stressed whenever we need to press the start stream button, you know, all kinds of fire starts spawning left and right.
+
+18:26.520 --> 18:39.520
+But if we don't have any more questions, well, maybe we can just go on a little break and reconvene in four minutes because I don't see people on BBB having their mic open.
+
+18:39.520 --> 18:42.520
+So, Alfred, you're more than welcome to stay in the room.
+
+18:42.520 --> 18:48.520
+What we are probably going to do now is go on a little bit of a break. So we're going to try to put something on the screen.
+
+18:48.520 --> 18:55.520
+There's just been a question from Corwin. So are you closing out the room?
+
+18:55.520 --> 19:01.520
+Oh, no, no, no. We probably will. Well, OK, let me just read Corwin's question.
+
+19:01.520 --> 19:04.520
+Yes, you do have a question for Corwin, but we're not going to close the room.
+
+19:04.520 --> 19:12.520
+We're going to leave it open as long as you want to stay. You can stay five to ten minutes. Maybe people might show up. But otherwise.
+
+19:12.520 --> 19:17.520
+So just reading Corwin's questions because it's not in a pad yet, I think.
+
+19:17.520 --> 19:25.520
+So do you use any fancy solutions for annotating text onto particular video timestamps?
+
+19:25.520 --> 19:30.520
+Well, I don't use it yet, but it's planned.
+
+19:30.520 --> 19:38.520
+So I've started a Reddit thread and Sasha has been helpful with answering that one.
+
+19:38.520 --> 19:50.520
+But my plan is to work with subtitle editing at some points and to introduce.
+
+19:50.520 --> 20:00.520
+Wait, annotate. I might have misunderstood the question. Oh, sorry.
+
+20:00.520 --> 20:04.520
+I'm looking for the question as well. So don't worry if you're lost, I'm also lost.
+
+20:04.520 --> 20:18.520
+Annotation text. If it's possible to get a clarification for what you mean by annotation text, is that like text effects or is that subtitles?
+
+20:18.520 --> 20:28.520
+I think it was mostly about you were talking about notes taking. I think annotation in that sense on the videos would be you have a video and you're trying to take note on this video.
+
+20:28.520 --> 20:35.520
+Like either you have the timestamp on the side or you overlay something. But I think it's mostly about taking notes on videos.
+
+20:35.520 --> 20:43.520
+OK, yeah. So for now, I'm creating a new link between every video or podcast that I listen to,
+
+20:43.520 --> 20:56.520
+but I but I remember to do so and creating just an org room, an org room documents for every for every for every new episode or every new video.
+
+20:56.520 --> 21:12.520
+But I am definitely going to have to take some time and figure out a process in which I can link together RSS feeds or L feed as well to to be able to annotate that and link it up with my other text notes.
+
+21:12.520 --> 21:20.520
+So nothing fancy yet, but that is planned. So stick around till next year and I might have something for you.
+
+21:20.520 --> 21:23.520
+And we will love to have you back.
+
+21:23.520 --> 21:31.520
+Yeah, it's thanks. Thanks so much for organizing this. It's it's great to have to have these questions.
+
+21:31.520 --> 21:43.520
+Yeah, well, thank you so much, Alfred. It was you know, you had nothing to do with it, but you were the first speaker to come. And even though, you know, having a prereq makes it that much less stressful to be facing the crowd,
+
+21:43.520 --> 21:50.520
+you still had to take the first questions from the crowd. And thank you so much because you did it brilliantly and you answered so many questions considering.
+
+21:50.520 --> 21:55.520
+So, Alfred, you're going to probably stay in a room a little while. I don't see a lot of people joining quite yet.
+
+21:55.520 --> 22:05.520
+I don't think people are, I think most of the questions have already been addressed on the pad, but you can stick around in two minutes and we'll be with you shortly to help you close the room.
+
+22:05.520 --> 22:10.520
+But right now, what we're going to do is we're going to take, well, we're not going to take any break.
+
+22:10.520 --> 22:16.520
+We're just going to move straight into the next talk. Do bear with us because it's a it's a fine machinery.
+
+22:16.520 --> 22:22.520
+And if something flashes on the screen, bear with us. It will be live pretty soon.
+
+22:22.520 --> 22:31.520
+OK, it's apparently live. Bye bye. Take care.
+
+22:31.520 --> 22:39.520
+OK, so we are now off the stream. We are playing the next prereq. Thank you so much, Alfred, and sorry for the intermittent microphone tuning in.
+
+22:39.520 --> 22:43.520
+It was basically my push to talk button with production that is misbehaving a little bit.
+
+22:43.520 --> 22:52.520
+It's working so well that I'm actually if I keep talking whilst I'm releasing the button, I'm talking to you, which is really weird and really confusing.
+
+22:52.520 --> 23:00.520
+OK, you know, it's always it's always rough with new audio setups going live with them at the same time as you're discovering them.
+
+23:00.520 --> 23:05.520
+It's always an interesting, interesting, especially since it's only one aspect of the stuff we're doing.
+
+23:05.520 --> 23:08.520
+You know, we're doing so much stuff on the side as well. OK, I'm going to have to get going.
+
+23:08.520 --> 23:13.520
+I don't see I don't see any people joining on BBB, so you can stick around a little while.
+
+23:13.520 --> 23:16.520
+Corwin might be back in about two to three minutes to help you close the room.
+
+23:16.520 --> 23:20.520
+But otherwise, you can just leave if no one shows up in two minutes. OK. All right.
+
+23:20.520 --> 23:25.520
+Thanks so much. And thank you so much.
+
+23:25.520 --> 23:54.520
+Merci and see you next time. All right, guys, if you have any questions, this is the last the last the last moment.
+
+23:54.520 --> 24:04.520
+To launch launch a question, if you're if you don't want to be recorded, I'm happy to I'm happy to take a question off off air or something.
+
+24:04.520 --> 24:08.520
+I don't know. I don't know if the chats. Oh, Max. Yes.
+
+24:08.520 --> 24:17.520
+When I get stuck with the next problem.
+
+24:17.520 --> 24:26.520
+For non-tech people, do you mean non-technical minded like I'm.
+
+24:26.520 --> 24:30.520
+I'm trying to figure out. Oh, great.
+
+24:30.520 --> 24:37.520
+Well, typically, typically, I try and just research on on.
+
+24:37.520 --> 24:49.520
+On Stack Overflow or other platforms where you can share code and share problems, but I typically don't go into too much like non-tech places for EMAX problems.
+
+24:49.520 --> 24:54.520
+I have other problems. So, for example, research problems and that kind of thing.
+
+24:54.520 --> 25:00.520
+And I'm not sure I answered the core of your question.
+
+25:00.520 --> 25:03.520
+The.
+
+25:03.520 --> 25:15.520
+Oh, all right. Yes.
+
+25:15.520 --> 25:27.520
+Yeah, I mean, I do, I do have other other communities that I joined in, but I try to talk talk about these issues with that aren't that aren't EMAX.
+
+25:27.520 --> 25:33.520
+But obviously, it's difficult to talk about EMAX problems with non EMAX users.
+
+25:33.520 --> 25:43.520
+So, yeah, that's that's the whole the whole issue with it being so complicated to get started is that you can you can say you can say all you want about how great it is.
+
+25:43.520 --> 25:52.520
+But people people aren't always keen to spend three months of their life trying to learn it, which fair enough.
+
+25:52.520 --> 26:04.520
+All right. Well, I hope I answered the I answered your questions to the as much as I could, I'll get back to the to the note documents.
+
+26:04.520 --> 26:13.520
+And at some point in the coming week and putting in some more notes about about the stuff you guys were interested in.
+
+26:13.520 --> 26:23.520
+And, yeah, well thanks for thanks for asking questions thanks for being here and hopefully, hopefully see you next time in the EMAX Conf.
+
+26:23.520 --> 26:45.520
+You are currently the only person in this conference.
+
+26:53.520 --> 27:18.520
+Okay.
+
+27:23.520 --> 27:25.520
+You
+
+27:53.520 --> 27:55.520
+You
+
+28:23.520 --> 28:25.520
+You
+
+28:53.520 --> 28:55.520
+You
+
+29:23.520 --> 29:25.520
+You
+
+29:53.520 --> 29:55.520
+You
+
+30:23.520 --> 30:25.520
+You
+
+30:53.520 --> 30:55.520
+You
+
+31:23.520 --> 31:25.520
+You
+
+31:53.520 --> 31:55.520
+You
+
+32:23.520 --> 32:25.520
+You
+
+32:53.520 --> 32:55.520
+You
+
+33:23.520 --> 33:25.520
+You
+
+33:53.520 --> 33:55.520
+You
+
+34:23.520 --> 34:25.520
+You
+
+34:53.520 --> 34:55.520
+You
+
+35:23.520 --> 35:25.520
+You
+
+35:53.520 --> 35:55.520
+You
+
+36:23.520 --> 36:25.520
+You
+
+36:53.520 --> 36:55.520
+You
+
+37:23.520 --> 37:25.520
+You
+
+37:53.520 --> 37:55.520
+You
+
+38:23.520 --> 38:25.520
+You
+
+38:53.520 --> 38:55.520
+You
+
+39:23.520 --> 39:25.520
+You
+
+39:53.520 --> 39:55.520
+You
+
+40:23.520 --> 40:25.520
+You
+
+40:53.520 --> 40:55.520
+You
+
+41:23.520 --> 41:25.520
+You
+
+41:53.520 --> 41:55.520
+You
+
+42:23.520 --> 42:25.520
+You
+
+42:53.520 --> 42:55.520
+You
+
+43:23.520 --> 43:25.520
+You
+
+43:53.520 --> 43:55.520
+You
+
+44:23.520 --> 44:25.520
+You
+
+44:53.520 --> 44:55.520
+You
+
+45:23.520 --> 45:25.520
+You
+
+45:53.520 --> 45:55.520
+You
+
+46:23.520 --> 46:25.520
+You
+
+46:53.520 --> 46:55.520
+You
+
+47:23.520 --> 47:25.520
+You
+
+47:53.520 --> 47:55.520
+You
+
+48:23.520 --> 48:25.520
+You
+
+48:53.520 --> 48:55.520
+You
+
+49:23.520 --> 49:25.520
+You
+
+49:53.520 --> 49:55.520
+You
+
+50:23.520 --> 50:25.520
+You
+
+50:53.520 --> 50:55.520
+You
+
+51:23.520 --> 51:25.520
+You
+
+51:53.520 --> 51:55.520
+You
+
+52:23.520 --> 52:25.520
+You
+
+52:53.520 --> 52:55.520
+You
+
+53:23.520 --> 53:25.520
+You
+
+53:53.520 --> 53:55.520
+You
+
+54:23.520 --> 54:25.520
+You
+
+54:53.520 --> 54:55.520
+You
+
+55:23.520 --> 55:25.520
+You
+
+55:53.520 --> 55:55.520
+You
+
+56:23.520 --> 56:25.520
+You
+
+56:53.520 --> 56:55.520
+You
+
+57:23.520 --> 57:25.520
+You
+
+57:53.520 --> 57:55.520
+You
+
+58:23.520 --> 58:25.520
+You
+
+58:53.520 --> 58:55.520
+You
+
+59:23.520 --> 59:25.520
+You
+
+59:53.520 --> 59:55.520
+You
+
+01:00:23.520 --> 01:00:25.520
+You
+
+01:00:53.520 --> 01:00:55.520
+You
+
+01:01:23.520 --> 01:01:25.520
+You
+
+01:01:53.520 --> 01:01:55.520
+You
+
+01:02:23.520 --> 01:02:25.520
+You
+
diff --git a/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main--chapters.vtt b/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main--chapters.vtt
new file mode 100644
index 00000000..682d1920
--- /dev/null
+++ b/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main--chapters.vtt
@@ -0,0 +1,29 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:36.119
+Introduction
+
+00:00:36.120 --> 00:01:52.159
+Why this talk
+
+00:01:52.160 --> 00:02:39.119
+Thinking about workflows
+
+00:02:39.120 --> 00:04:05.279
+My old workflow
+
+00:04:05.280 --> 00:06:56.799
+Finding my workflow
+
+00:06:56.800 --> 00:09:37.639
+Literate configuration
+
+00:09:37.640 --> 00:11:52.959
+Org Mode
+
+00:11:52.960 --> 00:14:26.959
+Collaborating with Pandoc
+
+00:14:26.960 --> 00:16:44.400
+You don't have to get lost in the weeds
diff --git a/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.vtt b/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.vtt
new file mode 100644
index 00000000..54cf0992
--- /dev/null
+++ b/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.vtt
@@ -0,0 +1,818 @@
+WEBVTT captioned by alfred
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:06.959
+All right. Hello, everyone. Welcome to my talk.
+
+00:00:06.960 --> 00:00:10.119
+We'll be talking today about Emacs journalism
+
+00:00:10.120 --> 00:00:12.279
+and what that means.
+
+00:00:12.280 --> 00:00:14.999
+First of all, I'd like to thank the EmacsConf organizers.
+
+00:00:15.000 --> 00:00:20.039
+Thank you very much, Sacha, for being very patient with me.
+
+00:00:20.040 --> 00:00:22.679
+Let's get right into it. So who's this talk for?
+
+00:00:22.680 --> 00:00:24.799
+First of all, it's for anyone
+
+00:00:24.800 --> 00:00:26.359
+who wants to learn about workflows
+
+00:00:26.360 --> 00:00:28.519
+and how you can work with Emacs
+
+00:00:28.520 --> 00:00:31.279
+to basically do anything you want.
+
+00:00:31.280 --> 00:00:33.679
+And it's for all levels of Emacs lovers.
+
+00:00:33.680 --> 00:00:36.119
+So I'll keep it accessible.
+
+NOTE Why this talk
+
+00:00:36.120 --> 00:00:37.479
+Why this talk? So first of all,
+
+00:00:37.480 --> 00:00:40.519
+I want to share a lot of Emacs.
+
+00:00:40.520 --> 00:00:42.519
+I also wanted to learn about workflows myself.
+
+00:00:42.520 --> 00:00:46.319
+So what better way than to talk about them
+
+00:00:46.320 --> 00:00:49.519
+to be able to learn? And we could maybe learn a thing
+
+00:00:49.520 --> 00:00:56.799
+or two about collaboration and using Emacs to that motive.
+
+00:00:56.800 --> 00:01:00.479
+I think it's useful to try and figure out who am I?
+
+00:01:00.480 --> 00:01:03.159
+Why am I having this talk? I'm a journalist based
+
+00:01:03.160 --> 00:01:06.799
+in Hong Kong and a documentary filmmaker. So that means
+
+00:01:06.800 --> 00:01:08.959
+that I have interviews quite often.
+
+00:01:08.960 --> 00:01:11.519
+I'm dealing with texts and subtitles,
+
+00:01:11.520 --> 00:01:14.039
+which I have to transcribe.
+
+00:01:14.040 --> 00:01:16.879
+And I'm also dealing with a lot of research.
+
+00:01:16.880 --> 00:01:22.159
+So that means going through a lot of documents and a lot of,
+
+00:01:22.160 --> 00:01:26.759
+well, skimming through documents
+
+00:01:26.760 --> 00:01:30.279
+to be able to have something to write.
+
+00:01:30.280 --> 00:01:34.119
+And I also use Emacs since basically one year ago,
+
+00:01:34.120 --> 00:01:35.399
+I started using it full time
+
+00:01:35.400 --> 00:01:39.639
+to have a great detriment of my productivity.
+
+00:01:39.640 --> 00:01:45.599
+So we'll be talking about, we'll be talking about, well,
+
+00:01:45.600 --> 00:01:48.439
+basically, my workflow for Emacs
+
+00:01:48.440 --> 00:01:52.159
+and how I went about having an Emacs workflow.
+
+NOTE Thinking about workflows
+
+00:01:52.160 --> 00:01:56.799
+So what is best when you're thinking about your own workflow
+
+00:01:56.800 --> 00:01:59.199
+and some things to think about journalism
+
+00:01:59.200 --> 00:02:03.199
+and about using these kinds of tools
+
+00:02:03.200 --> 00:02:09.479
+in combination for this? So where do we all start?
+
+00:02:09.480 --> 00:02:11.559
+Let's start with a simple-ish definition
+
+00:02:11.560 --> 00:02:14.959
+of what is a workflow. A workflow is
+
+00:02:14.960 --> 00:02:18.359
+any sequence of actions or tools you use to accomplish that.
+
+00:02:18.360 --> 00:02:23.199
+So it doesn't have to be through text processing,
+
+00:02:23.200 --> 00:02:27.759
+though obviously being a text-oriented community,
+
+00:02:27.760 --> 00:02:31.439
+it will most likely be partially text.
+
+00:02:31.440 --> 00:02:34.999
+But it's just about how we accomplish a task
+
+00:02:35.000 --> 00:02:39.119
+and which tools and mindsets we go into it with.
+
+NOTE My old workflow
+
+00:02:39.120 --> 00:02:42.759
+For example, let's talk about my old workflow.
+
+00:02:42.760 --> 00:02:46.879
+That workflow was basically just Google Drive
+
+00:02:46.880 --> 00:02:50.759
+using proprietary tools like Notion, Google Drive, Office,
+
+00:02:50.760 --> 00:02:55.839
+Storyboarder, and for communication, WeChat.
+
+00:02:55.840 --> 00:02:59.559
+If I could forgive all the privacy concerns of WeChat,
+
+00:02:59.560 --> 00:03:03.279
+I wouldn't, but I still wouldn't forgive
+
+00:03:03.280 --> 00:03:06.759
+the terribly buggy interface, and I hate it.
+
+00:03:06.760 --> 00:03:09.119
+So there are certain tools that you have to use
+
+00:03:09.120 --> 00:03:11.359
+and you have to modify your workflow
+
+00:03:11.360 --> 00:03:13.839
+or just adapt your workflow to the tools
+
+00:03:13.840 --> 00:03:17.119
+that you have to use. So for me, unfortunately,
+
+00:03:17.120 --> 00:03:23.399
+that means having to use WeChat. You compartmentalize it
+
+00:03:23.400 --> 00:03:27.479
+and set it aside, try not to think about it too hard.
+
+00:03:27.480 --> 00:03:29.319
+And this is the part that hurts the most, right?
+
+00:03:29.320 --> 00:03:31.039
+You're thinking about your workflow,
+
+00:03:31.040 --> 00:03:32.239
+you're thinking about, all right,
+
+00:03:32.240 --> 00:03:37.199
+I have this thing that works, I don't think about it.
+
+00:03:37.200 --> 00:03:40.039
+And all of a sudden, oh, I'm not happy
+
+00:03:40.040 --> 00:03:44.239
+with what I have right now. So let's get into,
+
+00:03:44.240 --> 00:03:50.079
+let's get into how, oops. So let's get into how and why
+
+00:03:50.080 --> 00:03:51.479
+we're not happy with our workflows.
+
+00:03:51.480 --> 00:03:55.679
+Because obviously, it's quite nice
+
+00:03:55.680 --> 00:03:57.159
+to not have to think about things.
+
+00:03:57.160 --> 00:03:58.719
+But once you've thought about it,
+
+00:03:58.720 --> 00:04:01.399
+and once you're not happy with how it works,
+
+00:04:01.400 --> 00:04:03.559
+I think it's quite useful to think about
+
+00:04:03.560 --> 00:04:05.279
+why we're not happy about it.
+
+NOTE Finding my workflow
+
+00:04:05.280 --> 00:04:10.199
+A huge part of what Emacs is being conscious of, well,
+
+00:04:10.200 --> 00:04:11.679
+how do we find our workflows?
+
+00:04:11.680 --> 00:04:17.839
+How do we find what we want to do? And for me, obviously,
+
+00:04:17.840 --> 00:04:19.839
+the best way to find that is to write it down
+
+00:04:19.840 --> 00:04:24.239
+and to try and tailor my tools to it.
+
+00:04:24.240 --> 00:04:26.239
+This is what I came up with.
+
+00:04:26.240 --> 00:04:28.039
+I want to be able to manage my accounting,
+
+00:04:28.040 --> 00:04:30.719
+to manage collaboration. So: working on files
+
+00:04:30.720 --> 00:04:33.439
+alongside my colleagues, communication,
+
+00:04:33.440 --> 00:04:38.839
+so that's planning out and managing meetings,
+
+00:04:38.840 --> 00:04:43.999
+managing teammates, managing tasks, information gathering.
+
+00:04:44.000 --> 00:04:45.959
+So that's what I was saying, going through documents,
+
+00:04:45.960 --> 00:04:49.999
+going through all these lists of tasks and all of these,
+
+00:04:50.000 --> 00:04:54.079
+not lists of tasks, all of these, well, basically,
+
+00:04:54.080 --> 00:04:59.799
+scientific papers, notes, references and wikis, media.
+
+00:04:59.800 --> 00:05:02.319
+So I want to be able to have a music player,
+
+00:05:02.320 --> 00:05:06.159
+a podcast player, a movie player. That's outside of work,
+
+00:05:06.160 --> 00:05:09.999
+but it's still one of the tasks that I do. Media processing,
+
+00:05:10.000 --> 00:05:13.559
+so this is where my job kind of gets into it a bit more.
+
+00:05:13.560 --> 00:05:15.159
+So I want to be able to take notes
+
+00:05:15.160 --> 00:05:16.479
+on the media that I watch,
+
+00:05:16.480 --> 00:05:19.559
+to transcribe the interviews
+
+00:05:19.560 --> 00:05:21.559
+and even the conversations that I have,
+
+00:05:21.560 --> 00:05:26.439
+to be able to later on have an easier time.
+
+00:05:26.440 --> 00:05:32.119
+Photo editing, video editing, so unfortunately,
+
+00:05:32.120 --> 00:05:35.959
+Emacs isn't quite quite oriented to that.
+
+00:05:35.960 --> 00:05:40.519
+Graphic design, color grading, storyboarding.
+
+00:05:40.520 --> 00:05:43.479
+And so obviously, you go into it a bit more.
+
+00:05:43.480 --> 00:05:46.519
+So managing to do scheduling tasks, interviews,
+
+00:05:46.520 --> 00:05:49.159
+preparing shot lists, tracking time,
+
+00:05:49.160 --> 00:05:53.319
+setting daily work goals, setting priorities,
+
+00:05:53.320 --> 00:05:55.479
+independent tasks, publishing,
+
+00:05:55.480 --> 00:05:59.079
+so publishing stuff for my work on my work CMS,
+
+00:05:59.080 --> 00:06:01.519
+publishing stuff on my personal CMS,
+
+00:06:01.520 --> 00:06:06.079
+although that's not happened yet. I've been kind of busy.
+
+00:06:06.080 --> 00:06:08.639
+Security and privacy, so making sure
+
+00:06:08.640 --> 00:06:13.279
+that everything that I use respects my data and respects me.
+
+00:06:13.280 --> 00:06:18.399
+Unfortunately, not the case, but you take what you can.
+
+00:06:18.400 --> 00:06:20.599
+Text processing. So that's journaling,
+
+00:06:20.600 --> 00:06:26.039
+writing down articles, my personal wiki, my work wiki,
+
+00:06:26.040 --> 00:06:34.679
+which I use to document, well, for example,
+
+00:06:34.680 --> 00:06:37.159
+several projects that I have currently.
+
+00:06:37.160 --> 00:06:43.319
+So I basically have my work wiki that I'm trying
+
+00:06:43.320 --> 00:06:45.159
+to fill out where I'll be able
+
+00:06:45.160 --> 00:06:47.199
+to basically go into it later on
+
+00:06:47.200 --> 00:06:50.399
+and have my thoughts written down.
+
+00:06:50.400 --> 00:06:56.799
+And programming, which I'm not very good at.
+
+NOTE Literate configuration
+
+00:06:56.800 --> 00:06:59.399
+Some people might have noticed
+
+00:06:59.400 --> 00:07:17.159
+that this looks a lot like [literate] programming.
+
+00:07:17.160 --> 00:07:18.639
+If you go into my config file,
+
+00:07:18.640 --> 00:07:20.159
+I have something kind of similar.
+
+00:07:20.160 --> 00:07:22.439
+I was planning on having a bit more time
+
+00:07:22.440 --> 00:07:26.359
+for this presentation and making it stick to that.
+
+00:07:26.360 --> 00:07:30.999
+But you'll see basically the mess that is my Emacs config.
+
+00:07:31.000 --> 00:07:33.319
+But it kind of sticks to the same thoughts, right?
+
+00:07:33.320 --> 00:07:37.399
+Text processing, web browsing, finances,
+
+00:07:37.400 --> 00:07:39.879
+that's my accounting, media and research.
+
+00:07:39.880 --> 00:07:43.879
+So my BibTeX... Here be dragons.
+
+00:07:43.880 --> 00:07:45.119
+Terrible, terrible config
+
+00:07:45.120 --> 00:07:47.719
+that I've stolen from plenty of people.
+
+00:07:47.720 --> 00:07:52.479
+So basically, that's how Emacs fits into this.
+
+00:07:52.480 --> 00:07:57.399
+So this is where I talk about literate configs
+
+00:07:57.400 --> 00:08:01.919
+and how that's helped me. Obviously, I've extolled
+
+00:08:01.920 --> 00:08:04.199
+the virtue of literate configs
+
+00:08:04.200 --> 00:08:09.359
+to quite an extent right here. It's basically...
+
+00:08:09.360 --> 00:08:15.239
+The concept is to have documents, living documents
+
+00:08:15.240 --> 00:08:18.239
+and documentation as code.
+
+00:08:18.240 --> 00:08:22.239
+So basically, let's go back into my config.
+
+00:08:22.240 --> 00:08:31.279
+I talk about what the config file does, have code blocks.
+
+00:08:31.280 --> 00:08:33.599
+So this is something that Emacs does. I'm pretty sure
+
+00:08:33.600 --> 00:08:36.639
+that there are some resources about that accessible online,
+
+00:08:36.640 --> 00:08:46.439
+which are even accessible in the Emacs Gulf. And so, yeah,
+
+00:08:46.440 --> 00:08:50.199
+basically just having everything accessible
+
+00:08:50.200 --> 00:08:52.479
+in one single source, one single file,
+
+00:08:52.480 --> 00:08:54.879
+which allows you to basically put everything down
+
+00:08:54.880 --> 00:09:00.639
+and integrate things from your config much much more easily.
+
+00:09:00.640 --> 00:09:05.239
+That's something that I found very useful in Emacs
+
+00:09:05.240 --> 00:09:07.599
+and which I think everyone can benefit from
+
+00:09:07.600 --> 00:09:11.279
+or the idea of it, like having everything stored centrally.
+
+00:09:11.280 --> 00:09:14.999
+It doesn't have to be used just for Emacs.
+
+00:09:15.000 --> 00:09:21.999
+It can be used also, it can be used also for, for example,
+
+00:09:22.000 --> 00:09:26.679
+a Qt browser or for other window manager configs.
+
+00:09:26.680 --> 00:09:28.239
+That kind of thing.
+
+00:09:28.240 --> 00:09:32.919
+And it's not been very easy to set a place.
+
+00:09:32.920 --> 00:09:37.639
+So I haven't done that just yet, but that's the plan.
+
+NOTE Org Mode
+
+00:09:37.640 --> 00:09:41.479
+Basically, this is all thanks to Org mode.
+
+00:09:41.480 --> 00:09:45.639
+So, small presentation of what Org mode is. Org mode
+
+00:09:45.640 --> 00:09:49.599
+is basically a project / task management,
+
+00:09:49.600 --> 00:09:52.479
+past management and task management,
+
+00:09:52.480 --> 00:09:54.319
+and writing mode for Emacs.
+
+00:09:54.320 --> 00:10:00.039
+So I can just put in a heading to do Hello World,
+
+00:10:00.040 --> 00:10:10.319
+send a message to Rosie tomorrow about the shoot space MDS--
+
+00:10:10.320 --> 00:10:15.399
+that's thanks to wonderful Doom Emacs--and schedule it.
+
+00:10:15.400 --> 00:10:21.799
+I don't know. It's tomorrow. Let's go and set it to 9am.
+
+00:10:21.800 --> 00:10:28.759
+And say, maybe it's it's tomorrow already. I've done it.
+
+00:10:28.760 --> 00:10:31.439
+I've sent a message. Perfect. It's done.
+
+00:10:31.440 --> 00:10:33.679
+And it also allows you to have an agenda view.
+
+00:10:33.680 --> 00:10:37.719
+So I hope there's nothing too compromising right here.
+
+00:10:37.720 --> 00:10:41.879
+Whatever. It's fine. So it allows you
+
+00:10:41.880 --> 00:10:45.199
+to basically manage your agenda from there.
+
+00:10:45.200 --> 00:10:54.439
+And you might have seen me doing my little space nrf
+
+00:10:54.440 --> 00:10:58.359
+and wonderful key binding by Org Roam. So this
+
+00:10:58.360 --> 00:11:01.039
+is also another thing which is quite quite nice
+
+00:11:01.040 --> 00:11:06.079
+with Emacs is that you can you can have Org Roam, which
+
+00:11:06.080 --> 00:11:09.079
+is basically a database management program.
+
+00:11:09.080 --> 00:11:12.959
+So I can have documentary ideas
+
+00:11:12.960 --> 00:11:21.799
+and have basically my ideas which link up to another file.
+
+00:11:21.800 --> 00:11:25.839
+So for example, this one, which I have nothing for,
+
+00:11:25.840 --> 00:11:29.239
+but you get the idea. So it allows you to apps
+
+00:11:29.240 --> 00:11:33.719
+to link up with different files and to manage your thoughts.
+
+00:11:33.720 --> 00:11:37.959
+And this gets back into the workflow part of my talk,
+
+00:11:37.960 --> 00:11:41.879
+which is, well, this, this is a way
+
+00:11:41.880 --> 00:11:44.319
+to control what your workflow
+
+00:11:44.320 --> 00:11:49.759
+is control what the tools you're using are and to control,
+
+00:11:49.760 --> 00:11:52.079
+basically the way in which you interact
+
+00:11:52.080 --> 00:11:52.959
+with your technology.
+
+NOTE Collaborating with Pandoc
+
+00:11:52.960 --> 00:11:59.799
+So I am getting back into the way that I collaborate.
+
+00:11:59.800 --> 00:12:02.799
+Because obviously it's no good having just
+
+00:12:02.800 --> 00:12:07.919
+one Emacs user who's trying to share to share things
+
+00:12:07.920 --> 00:12:11.159
+with his editor. So I use pandoc.
+
+00:12:11.160 --> 00:12:17.479
+For example, let's go back into my file right here.
+
+00:12:17.480 --> 00:12:24.359
+Obviously, I don't spend much time inside of tables.
+
+00:12:24.360 --> 00:12:29.199
+But if I select this one, that's "SPC m e".
+
+00:12:29.200 --> 00:12:32.079
+Thank you, Doom Emacs for the for the keybindings.
+
+00:12:32.080 --> 00:12:38.239
+And I can just export it via pandoc right here, So "p".
+
+00:12:38.240 --> 00:12:50.719
+And I can just export it to doc, docx, or export it to ODT.
+
+00:12:50.720 --> 00:12:55.119
+So as an ODT file, which is typically what I do.
+
+00:12:55.120 --> 00:12:57.119
+And then I just send it through WeChat,
+
+00:12:57.120 --> 00:13:00.359
+which is not optimal, but I'm not allowed
+
+00:13:00.360 --> 00:13:04.079
+to do anything else. So it is what it is.
+
+00:13:04.080 --> 00:13:12.759
+Basically, this is how I export my files. And I re-import,
+
+00:13:12.760 --> 00:13:15.519
+I re-import them with pandoc as well.
+
+00:13:15.520 --> 00:13:19.799
+So I convert my Pages files, which I receive
+
+00:13:19.800 --> 00:13:22.879
+through an ICS plugin. It's not quite finalized,
+
+00:13:22.880 --> 00:13:24.119
+so I'm not ready to show it,
+
+00:13:24.120 --> 00:13:26.359
+but there's a link that I'll be putting
+
+00:13:26.360 --> 00:13:29.479
+in the description which talks about this.
+
+00:13:29.480 --> 00:13:32.959
+So this is my sharing part.
+
+00:13:32.960 --> 00:13:35.439
+It's nothing very special, honestly.
+
+00:13:35.440 --> 00:13:38.319
+It's just making sure that your documents
+
+00:13:38.320 --> 00:13:41.479
+are able to be shared.
+
+NOTE My own
+00:13:41.480 --> 00:13:44.079
+I have certain things. So for example,
+
+00:13:44.080 --> 00:13:47.839
+if I go into retro gaming in Hong Kong,
+
+00:13:47.840 --> 00:13:53.919
+if I go into my scripts, there are certain headings
+
+00:13:53.920 --> 00:13:55.519
+which I have. So for example, they ignore...
+
+00:13:55.520 --> 00:13:58.759
+My editor doesn't like to have some headings.
+
+00:13:58.760 --> 00:14:02.599
+But when I have a video script that I'm preparing,
+
+00:14:02.600 --> 00:14:05.519
+I like to have them for my own organization
+
+00:14:05.520 --> 00:14:09.399
+and for my thinking. So I keep them in right there
+
+00:14:09.400 --> 00:14:11.760
+and put in ignore. This is the advantage
+
+00:14:11.761 --> 00:14:17.280
+of the Emacs because you can just SPC m e o o,
+
+00:14:17.281 --> 00:14:20.479
+and this is ready to send, basically.
+
+00:14:20.480 --> 00:14:24.039
+There are ways to have export presets,
+
+00:14:24.040 --> 00:14:26.959
+but I'm not quite there yet. It's a lot of work.
+
+NOTE You don't have to get lost in the weeds
+
+00:14:26.960 --> 00:14:30.119
+So, getting back to my presentation.
+
+00:14:30.120 --> 00:14:36.719
+This all goes into basically other packages,
+
+00:14:36.720 --> 00:14:39.319
+which I want to implement, but I haven't been able to.
+
+00:14:39.320 --> 00:14:43.839
+My main conclusion: you don't have to get lost in the weeds.
+
+00:14:43.840 --> 00:14:48.279
+I kind of did that while preparing this talk.
+
+00:14:48.280 --> 00:14:51.719
+So basically, you don't have to do it all at once.
+
+00:14:51.720 --> 00:14:55.639
+Don't let it consume your life.
+
+00:14:55.640 --> 00:14:57.319
+I probably should have done this earlier.
+
+00:14:57.320 --> 00:15:02.119
+But Emacs configs are forever work in progress.
+
+00:15:02.120 --> 00:15:04.919
+So there are lots of features which you can add,
+
+00:15:04.920 --> 00:15:08.119
+a lot of things which you can implement if you only had,
+
+00:15:08.120 --> 00:15:11.639
+I don't know, five weeks to be able to implement them.
+
+00:15:11.640 --> 00:15:12.959
+But you're working right now.
+
+00:15:12.960 --> 00:15:16.319
+And this is a message to me five months ago.
+
+00:15:16.320 --> 00:15:19.639
+Don't do it. Just keep working
+
+00:15:19.640 --> 00:15:23.639
+and don't get lost in configuration all day.
+
+00:15:23.640 --> 00:15:27.559
+So yeah, basically the aim is to use software that you love,
+
+00:15:27.560 --> 00:15:29.439
+but not die in the process.
+
+00:15:29.440 --> 00:15:34.719
+And yeah, basically just using it as much as you can
+
+00:15:34.720 --> 00:15:36.519
+using fast software as much as you can.
+
+00:15:36.520 --> 00:15:39.839
+I'm doing that as well for...
+
+00:15:39.840 --> 00:15:46.679
+I have certain software such as storyboarder or bit tags,
+
+00:15:46.680 --> 00:15:50.159
+that kind of thing, which I try to use as much as possible,
+
+00:15:50.160 --> 00:15:51.839
+even outside of Emacs.
+
+00:15:51.840 --> 00:15:56.279
+And the aim is to get the work done in the end.
+
+00:15:56.280 --> 00:16:00.679
+I'm not an absolutist on this. So yeah, basically,
+
+00:16:00.680 --> 00:16:03.919
+let's keep modding our configs and having fun.
+
+00:16:03.920 --> 00:16:06.479
+If you've got any questions about the talk,
+
+00:16:06.480 --> 00:16:10.439
+I'm happy to answer. I am a novice at this,
+
+00:16:10.440 --> 00:16:12.959
+both presenting in front of camera
+
+00:16:12.960 --> 00:16:15.719
+and at talking about Emacs.
+
+00:16:15.720 --> 00:16:18.679
+I'm sure I've gotten a few things wrong,
+
+00:16:18.680 --> 00:16:23.719
+and it's not been the smoothest talk, but it's 10pm, almost.
+
+00:16:23.720 --> 00:16:28.759
+I need to get back home. Yeah, take care, everyone.
+
+00:16:28.760 --> 00:16:32.719
+Thanks again to the organizers. Here's my contact info.
+
+00:16:32.720 --> 00:16:36.199
+And I'll be in touch with the questions.
+
+00:16:36.200 --> 00:16:38.319
+I don't think I'll be able to do the live answers,
+
+00:16:38.320 --> 00:16:41.879
+but that's more or less it. Thanks so much for listening,
+
+00:16:41.880 --> 00:16:44.400
+if you've been listening, and take care.
diff --git a/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.vtt b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.vtt
new file mode 100644
index 00000000..38b57dc8
--- /dev/null
+++ b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.vtt
@@ -0,0 +1,464 @@
+WEBVTT
+
+00:00.000 --> 00:07.200
+Okay, so we are live now. So hi, everyone. Sorry, we were doing some last minute verification
+
+00:07.200 --> 00:12.720
+with Blaine. We wanted to share screens, but somehow the Firefox gods are not in our favor
+
+00:12.720 --> 00:15.640
+today. So hi, Blaine. How are you doing?
+
+00:15.640 --> 00:21.480
+I'm doing great, Will. This has been a great conference. I've seen some talks this morning
+
+00:21.480 --> 00:27.100
+that are going to change my life. I just can't wait to start applying some of the packages
+
+00:27.100 --> 00:28.100
+I've learned about.
+
+00:28.100 --> 00:33.240
+That's amazing. And it's only day one. We've got more of this coming today, too.
+
+00:33.240 --> 00:34.240
+Exactly.
+
+00:34.240 --> 00:38.000
+So, Blaine, we haven't had the chance to tell you, but do you have the pad open on
+
+00:38.000 --> 00:39.000
+your end?
+
+00:39.000 --> 00:40.000
+Let's see.
+
+00:40.000 --> 00:45.040
+Oh, yes, because I asked you to close Firefox, so you don't have it. Do you need the URL,
+
+00:45.040 --> 00:46.040
+maybe?
+
+00:46.040 --> 00:48.080
+Yeah, that would be great.
+
+00:48.080 --> 00:52.280
+I will put it into BBB, the chat right on your left.
+
+00:52.280 --> 00:58.200
+Okay. I see it. So if I click on this and open a new window?
+
+00:58.200 --> 01:00.520
+Yes, don't worry about it.
+
+01:00.520 --> 01:05.600
+Okay. So I have some questions. Oh, that's fantastic. This is kind of a silly question,
+
+01:05.600 --> 01:10.560
+but I'm curious. Do you have a favorite color theme?
+
+01:10.560 --> 01:21.120
+So I do. I've been using a color theme that is sort of light green. It's from a set of
+
+01:21.120 --> 01:29.760
+themes that Prot put together and made available this fall on Melpa, and in some of the slides
+
+01:29.760 --> 01:36.880
+you'll see that I have this, like, white background, but I'm currently using a sort of a mint green
+
+01:36.880 --> 01:45.240
+color, which I find actually has great contrast, and I had to install some fonts for the Mac
+
+01:45.240 --> 01:52.360
+to be able to use that theme, but Prot provides detailed instructions, and it was pretty easy
+
+01:52.360 --> 01:54.360
+to do.
+
+01:54.360 --> 02:03.960
+Okay. Let's see. To your knowledge, so the second question is, to your knowledge, are
+
+02:03.960 --> 02:09.000
+recent coming security changes in Chrome going to impact browser extension?
+
+02:09.000 --> 02:16.560
+Oh, that's a great question. I, to be honest, I don't know. I'm not aware of that issue
+
+02:16.560 --> 02:23.400
+because I ran and I installed some extension I probably shouldn't have installed in Chrome
+
+02:23.400 --> 02:30.120
+a couple weeks ago, and I've been getting pop-up ads, and so I switched to Firefox,
+
+02:30.120 --> 02:39.960
+but so far I have used GhostText in a number of browsers. I can vouch that it works in
+
+02:39.960 --> 02:50.120
+Safari, Chrome, obviously Firefox, Brave, and then amongst the Firefox family of browsers
+
+02:50.120 --> 02:56.240
+there's WaterFox and IceCat. It works in those two.
+
+02:56.240 --> 03:02.400
+So if Chrome's security issues become a problem, then there are other browsers for which maybe
+
+03:02.400 --> 03:07.960
+that problem won't be an issue.
+
+03:07.960 --> 03:14.580
+Is this, a third question is, is this browser, is this browser agnostic, or do you have to
+
+03:14.580 --> 03:17.760
+use Chrome?
+
+03:17.760 --> 03:25.460
+That's a good question. So obviously, as you've seen that, or just heard, it works in a number
+
+03:25.460 --> 03:30.480
+of other browsers. There's probably at least ten other browsers in which it will work.
+
+03:30.480 --> 03:35.840
+So there's sort of three families of extensions, one for Safari, one for Firefox, and one for
+
+03:35.840 --> 03:47.580
+Chrome, and often one of those extensions will work in a different browser.
+
+03:47.580 --> 03:53.060
+You mentioned, fourth question is, you mentioned a couple other solutions to allow Emacs editing
+
+03:53.060 --> 04:02.600
+of text areas, pointers. Well, unfortunately, I didn't do my due diligence in researching
+
+04:02.600 --> 04:07.000
+those other solutions. I'm aware that there's something called Emacs Everywhere that's supposed
+
+04:07.000 --> 04:13.840
+to have a similar capability, but I haven't dug into using it, so I can't say anything
+
+04:13.840 --> 04:14.840
+about it.
+
+04:14.840 --> 04:27.040
+I'll have to say that. So because you're setting up a server from an editor, and you have this
+
+04:27.040 --> 04:35.520
+extension in a browser, things don't always mesh. You may have port 4001 occupied by some
+
+04:35.520 --> 04:43.720
+other server from Emacs or another application, and so you have to sort that out. That can
+
+04:43.720 --> 04:49.360
+happen from time to time. I've had trouble with the Emacs server sometimes using that
+
+04:49.360 --> 04:57.800
+port, but I think you can redirect that Emacs server to another port to avoid that issue.
+
+04:57.800 --> 05:02.240
+That would be the greatest difficulty is just getting the two sides talking to each other
+
+05:02.240 --> 05:10.160
+through the web socket, but once that's going, I use it every day, and I'll go for weeks
+
+05:10.160 --> 05:16.560
+without any issue, and then, of course, I'll be changing something about Emacs configuration
+
+05:16.560 --> 05:22.520
+where I'm turning on some new server that fires up when I start Emacs, and then I break
+
+05:22.520 --> 05:28.760
+it there, or something along those lines, but the great hazard of fiddling with your
+
+05:28.760 --> 05:49.520
+Emacs configuration, just a hazard of being an Emacs user. Let's see. Why not save text?
+
+05:49.520 --> 05:56.120
+So I have a fifth question, which is why not save text from Emacs? I would like to hear
+
+05:56.120 --> 06:04.560
+some solution to the issue I ran into. So if I am editing a document in a web browser
+
+06:04.560 --> 06:13.200
+and then via Emacs, and I save that to a document on disk, then I, okay, that's great if I'm
+
+06:13.200 --> 06:19.020
+not going to make any more changes, everything's fine, that works great, but if I then decide
+
+06:19.020 --> 06:27.200
+to make more changes in the browser, and then I try to save those changes, the copy on disk
+
+06:27.200 --> 06:32.280
+is out of sync with the copy in the browser, and I've had the connection break when I do
+
+06:32.280 --> 06:42.080
+that. So I heard that there might be a way of solving that problem. I'm not, but I have
+
+06:42.080 --> 06:48.040
+not implemented the solution. I forget what the suggestion was. Maybe somebody in the
+
+06:48.040 --> 06:51.840
+audience has an idea.
+
+06:51.840 --> 06:56.760
+Speaking of the audience, we have opened up the chat now, so if you want to join the current
+
+06:56.760 --> 07:02.200
+BBB Discord room in which we are and ask questions directly to Blaine, feel free to do so, otherwise
+
+07:02.200 --> 07:05.840
+we're still taking questions on the pad as long as we have them, although right now I
+
+07:05.840 --> 07:10.120
+think we have answered all of them. Am I wrong, Blaine, or did we answer all of them already?
+
+07:10.120 --> 07:13.200
+You're correct, we've answered all of them.
+
+07:13.200 --> 07:18.120
+So we're going to still discuss for about 2-3 minutes. If people want to add last questions
+
+07:18.120 --> 07:23.360
+to the pad, feel free to do so. If you want to join us in BBB, the link is at the top
+
+07:23.360 --> 07:28.140
+of the talk of Blaine, Euclid Maxco 2022. You know everything now. We are at the end
+
+07:28.140 --> 07:33.640
+of the day, and you can tell it's the end of the day because my accent is getting significantly
+
+07:33.640 --> 07:40.840
+Frencher as a result. It's not getting any better since last year, I think. I wish I
+
+07:40.840 --> 07:44.760
+could contribute, Blaine, more to your talk, but I feel like I'm way out of my league.
+
+07:44.760 --> 07:50.280
+I'm the guy who plays with Org on the side, and I tune into your talks every year, and
+
+07:50.280 --> 07:54.840
+I see molecules, and I see stuff that I can barely comprehend, and I feel very humbled
+
+07:54.840 --> 07:56.840
+as a result.
+
+07:56.840 --> 08:03.320
+Well, I'm just trying to make my talks kind of unique.
+
+08:03.320 --> 08:07.960
+You are succeeding amazingly well. It reminds me, have you been talking with John Kinchin
+
+08:07.960 --> 08:15.680
+or something? Because you seem to be evolving in seminal fields, in a way, with Emacs.
+
+08:15.680 --> 08:26.160
+I have been. I'm a fan of his. I have installed CyMax and his configuration for Emacs, but
+
+08:26.160 --> 08:33.960
+I haven't. I've just started poking around with it, and I've used his configuration.
+
+08:33.960 --> 08:43.280
+I've got it up and running, and I've used GhostText with it, and I was trying to tap
+
+08:43.280 --> 08:49.880
+into his OrgRef package, which is super powerful for managing bibliographies.
+
+08:49.880 --> 08:50.880
+Yeah.
+
+08:50.880 --> 08:53.880
+Yeah, he's very inspiring.
+
+08:53.880 --> 08:59.880
+I'm glad to hear you're very much inspired. Go on, please.
+
+08:59.880 --> 09:05.280
+He's very amazing. He's very accomplished in Emacs and a very accomplished teacher,
+
+09:05.280 --> 09:11.160
+and he has now, as you probably know, a series of videos on YouTube that he's been putting
+
+09:11.160 --> 09:18.920
+together about programming. So he's teaching students at Carnegie Mellon University how
+
+09:18.920 --> 09:26.200
+to program in Python via Emacs, and he has been sharing these videos on YouTube, and
+
+09:26.200 --> 09:30.720
+they're like just 20-minute videos, kind of short snippets, but you can learn a lot from
+
+09:30.720 --> 09:33.480
+them. It's really fantastic.
+
+09:33.480 --> 09:39.240
+It's an amazing journey, isn't it? You start from a field that has nothing to do whatsoever
+
+09:39.240 --> 09:43.800
+with Emacs, and yet you find yourself so attracted to the idea of programming and making your
+
+09:43.800 --> 09:49.620
+workflow easier that you end up actually transitioning into a little bit of a programming role or
+
+09:49.620 --> 09:54.900
+teaching programming role. I mean, I was studying literature. I was all well and good in my
+
+09:54.900 --> 10:00.040
+English faculty, and then I decided to say, oh yeah, let's try Emacs, and 10 years later
+
+10:00.040 --> 10:06.160
+I find myself spending more time working on Emacs than working on my literature papers.
+
+10:06.160 --> 10:12.920
+My history is that I developed a dozen years ago, started teaching students how to do molecular
+
+10:12.920 --> 10:17.960
+graphics, and then I got into Python programming to develop tools to make it easier for them
+
+10:17.960 --> 10:22.680
+to use molecular graphics, and then evolved into making these snippets available for a
+
+10:22.680 --> 10:29.680
+wide range of text editors that meant learning about – so I prepared these snippets for
+
+10:29.680 --> 10:35.440
+about 20 different text editors, leading ones, and of course I saved for the end Emacs. First
+
+10:35.440 --> 10:42.800
+I went through Vim and the month of hell of rewiring your brain to do the Vim key bindings
+
+10:42.800 --> 10:51.920
+and then on to Emacs, which I call the ultimate text editor, because there is no other text
+
+10:51.920 --> 10:56.040
+editor beyond Emacs. It's the end of the line.
+
+10:56.040 --> 11:01.360
+I absolve you for your herrings with Vim as a result of the last comment you just made.
+
+11:01.360 --> 11:05.680
+Actually, no, I have new write of that solution. I can agree to your solution. You'll have
+
+11:05.680 --> 11:09.200
+to ask RMS tomorrow.
+
+11:09.200 --> 11:16.800
+Well, I spent a year in evil mode, but I switched about half a year ago to just Emacs key bindings
+
+11:16.800 --> 11:24.840
+and bye-bye Vim. I use Vim when I log into remote servers and have to edit something
+
+11:24.840 --> 11:30.720
+really quick, but I've probably forgotten most of the key bindings. There's only about
+
+11:30.720 --> 11:36.560
+a dozen you really need to know to get the essential work done. But yeah, it's been
+
+11:36.560 --> 11:37.560
+quite a journey.
+
+11:37.560 --> 11:45.160
+Sorry for the interruption. We do have one question, a very simple question about what
+
+11:45.160 --> 11:51.200
+was the key binding for Linux Firefox. Do you have it on top of your mind?
+
+11:51.200 --> 11:52.200
+So Linux Firefox.
+
+11:52.200 --> 11:57.240
+I'm not sure what they're referring to as well, which is why I threw you this purple,
+
+11:57.240 --> 11:59.240
+hoping that it would make sense for you.
+
+11:59.240 --> 12:00.240
+It's Control-Shift-H.
+
+12:00.240 --> 12:14.120
+I hope this answers your questions. So I think Control-Shift-H, yes. Well Blaine, I see some
+
+12:14.120 --> 12:18.120
+people have joined on BBB, but no one with a microphone still. I will tide you at the
+
+12:18.120 --> 12:21.560
+end. We are reaching the end of the day. We are reaching closing remarks and I will be
+
+12:21.560 --> 12:26.720
+making a plea for more people to join with a microphone. Last year we had pretty much
+
+12:26.720 --> 12:30.440
+the same setting. We were opening the room afterwards and people were showing up with
+
+12:30.440 --> 12:33.760
+the microphones and we had lovely discussions. So in this year, it feels like everyone's
+
+12:33.760 --> 12:38.940
+a little shy, shouldn't you know? That's the whole point is for you to talk and for
+
+12:38.940 --> 12:43.160
+us all to listen. Well Blaine, that was very insightful. Thank you so much for both the
+
+12:43.160 --> 12:44.960
+presentation and the questions. Go on.
+
+12:44.960 --> 12:51.200
+We have a question in the panel on the left and blue button. So how long have I been using
+
+12:51.200 --> 13:03.520
+Emacs? I made a commitment to use it full-time about 18 months ago, maybe 20 months ago.
+
+13:03.520 --> 13:09.240
+So I'm a newbie. I'm still in the steep part of the learning curve.
+
+13:09.240 --> 13:13.640
+You just have to provide context for the people. Blaine presented something at the last year's
+
+13:13.640 --> 13:19.440
+EmacsConf and it was as impressive as this year's presentation. And afterwards he told
+
+13:19.440 --> 13:23.760
+us, oh yeah, I've been using Emacs for six months or so. And that's where everyone's
+
+13:23.760 --> 13:28.920
+jewels dropped to the floor because some people have been using Emacs for 10 years and we
+
+13:28.920 --> 13:31.960
+couldn't even imagine doing some of the stuff you're doing with it.
+
+13:31.960 --> 13:33.960
+Thank you.
+
+13:33.960 --> 13:40.880
+Do we have any other questions? I think that's pretty much it. I'm not seeing anything appear
+
+13:40.880 --> 13:48.520
+on the other screen. I think we're pretty much good. So Blaine, I'm not going to keep
+
+13:48.520 --> 13:52.880
+you any longer. We are probably going to bring this Q&A to a close. Thank you so much for
+
+13:52.880 --> 13:59.880
+all the answers. What are we going to do for the stream? We still have a talk going on
+
+13:59.880 --> 14:05.960
+on the dev channel currently. And then we'll be going to the closing remarks for the day
+
+14:05.960 --> 14:10.680
+at about 55 of the current hour. So we are going on a break for 20 to 25 minutes. So
+
+14:10.680 --> 14:14.040
+Blaine, sorry for keeping you off stage as I'm making the announcement, but it's the
+
+14:14.040 --> 14:16.520
+best way for people to see my face as I do it.
+
+14:16.520 --> 14:20.800
+Thank you very much, Leo. I appreciate it.
+
+14:20.800 --> 14:26.720
+And thank you so much for all your time and all your answers. I will be closing BBB now
+
+14:26.720 --> 14:31.600
+and we will put some music on and some announcements and see you at the top of the hour for the
+
+14:31.600 --> 14:57.720
+others or 55 rather than top of the hour. All right. Bye bye everyone. Bye bye Blaine.
+
diff --git a/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main--chapters.vtt b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main--chapters.vtt
new file mode 100644
index 00000000..a00d9c58
--- /dev/null
+++ b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main--chapters.vtt
@@ -0,0 +1,41 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:51.519
+Introduction
+
+00:00:51.520 --> 00:01:26.919
+GhostText and Atomic Chrome
+
+00:01:26.920 --> 00:03:13.119
+GhostText
+
+00:03:13.120 --> 00:05:57.039
+Live coding demo
+
+00:05:57.040 --> 00:07:57.159
+Editing code cells
+
+00:07:57.160 --> 00:11:11.039
+Python
+
+00:11:11.040 --> 00:11:59.599
+Julia
+
+00:11:59.600 --> 00:12:44.319
+How does GhostText work?
+
+00:12:44.320 --> 00:13:32.999
+Supported web browsers
+
+00:13:33.000 --> 00:14:21.559
+Atomic Chrome configuration
+
+00:14:21.560 --> 00:15:21.479
+Precautions
+
+00:15:21.480 --> 00:15:48.559
+Conclusions
+
+00:15:48.560 --> 00:17:07.760
+Thanks
diff --git a/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt
new file mode 100644
index 00000000..e51ef23b
--- /dev/null
+++ b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt
@@ -0,0 +1,792 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:03.839
+Hi, my name is Blaine Mooers.
+
+00:00:03.840 --> 00:00:05.399
+I'm an associate professor of biochemistry
+
+00:00:05.400 --> 00:00:08.199
+at the University of Oklahoma Health Sciences Center
+
+00:00:08.200 --> 00:00:09.759
+in Oklahoma City.
+
+00:00:09.760 --> 00:00:11.999
+I'm going to talk about the use of Emacs
+
+00:00:12.000 --> 00:00:16.239
+to edit live Jupyter notebook cells
+
+00:00:16.240 --> 00:00:20.519
+as well as text areas on web pages.
+
+00:00:20.520 --> 00:00:22.519
+So like a lot of technical workers,
+
+00:00:22.520 --> 00:00:24.879
+I find myself having to write prose
+
+00:00:24.880 --> 00:00:28.679
+in text areas on web pages,
+
+00:00:28.680 --> 00:00:31.719
+as well as working with code
+
+00:00:31.720 --> 00:00:36.999
+in Jupyter notebooks and Colab notebooks,
+
+00:00:37.000 --> 00:00:39.319
+and often I have wished for
+
+00:00:39.320 --> 00:00:43.479
+the full power of Emacs while doing so.
+
+NOTE GhostText and Atomic Chrome
+
+00:00:43.480 --> 00:00:45.319
+Well, now that is possible.
+
+00:00:45.320 --> 00:00:46.799
+Actually, there are several solutions
+
+00:00:46.800 --> 00:00:49.039
+that have been available for some time.
+
+00:00:49.040 --> 00:00:50.399
+I'm going to talk about one solution
+
+00:00:50.400 --> 00:00:55.319
+that I'm familiar with and has worked out for me.
+
+00:00:55.320 --> 00:00:58.119
+So this requires the use of two software packages,
+
+00:00:58.120 --> 00:01:01.599
+GhostText and Atomic Chrome.
+
+00:01:01.600 --> 00:01:04.239
+GhostText is an extension for the web browser,
+
+00:01:04.240 --> 00:01:07.279
+whereas Atomic Chrome is a package for Emacs.
+
+00:01:07.280 --> 00:01:10.879
+You have to have both of these.
+
+00:01:10.880 --> 00:01:13.399
+So Chrome is for the editor side
+
+00:01:13.400 --> 00:01:18.919
+and GhostText handles the browser side.
+
+NOTE GhostText
+
+00:01:18.920 --> 00:01:22.479
+The GhostText extension is available
+
+00:01:22.480 --> 00:01:26.799
+in the Chrome web store.
+
+00:01:26.800 --> 00:01:29.519
+And GhostText is represented by this icon,
+
+00:01:29.520 --> 00:01:31.519
+which has a ghost in front of the capital letter T.
+
+00:01:31.520 --> 00:01:36.399
+It is being developed by Federico Brigante.
+
+00:01:36.400 --> 00:01:41.239
+He is a very prolific JavaScript developer.
+
+00:01:41.240 --> 00:01:44.279
+He has a web page committed to GhostText,
+
+00:01:44.280 --> 00:01:47.199
+as well as a GitHub site.
+
+00:01:47.200 --> 00:01:50.159
+So here's an example of GhostText.
+
+00:01:50.160 --> 00:01:54.839
+This is a snapshot from a session
+
+00:01:54.840 --> 00:02:01.279
+that I had while editing LaTeX on the Overleaf website.
+
+00:02:01.280 --> 00:02:03.759
+Overleaf is this web service
+
+00:02:03.760 --> 00:02:09.719
+that empowers the editing of LaTeX documents on the web.
+
+00:02:09.720 --> 00:02:14.039
+So I have clicked on this GhostText icon in the toolbar.
+
+00:02:14.040 --> 00:02:17.039
+I had already opened up Emacs,
+
+00:02:17.040 --> 00:02:19.879
+and I had the Atomic Chrome server running.
+
+00:02:19.880 --> 00:02:21.799
+So a connection was established,
+
+00:02:21.800 --> 00:02:28.599
+as indicated by this blue border around this text area.
+
+00:02:28.600 --> 00:02:30.519
+And as soon as that appeared,
+
+00:02:30.520 --> 00:02:35.319
+the text appeared in a buffer inside of Emacs.
+
+00:02:35.320 --> 00:02:40.159
+So I have overlaid the area where normally the compiled PDF
+
+00:02:40.160 --> 00:02:43.919
+would appear in an Overleaf session.
+
+00:02:43.920 --> 00:02:47.679
+So I'm using a configuration for LaTeX that I developed,
+
+00:02:47.680 --> 00:02:52.159
+which is available through the MooersLab GitHub site.
+
+00:02:52.160 --> 00:02:55.919
+I also gave a talk about how I use LaTeX in Emacs
+
+00:02:55.920 --> 00:02:58.839
+at the Berlin Emacs meetup in August.
+
+00:02:58.840 --> 00:03:00.039
+This talk was not recorded,
+
+00:03:00.040 --> 00:03:05.119
+but the slides are available on this website.
+
+NOTE Live coding demo
+
+00:03:05.120 --> 00:03:09.519
+So I would like to now switch to a little live coding
+
+00:03:09.520 --> 00:03:12.359
+to make this a little more interesting.
+
+00:03:12.360 --> 00:03:22.439
+So I start my day at this other website called 750Words.
+
+00:03:22.440 --> 00:03:25.279
+This site just takes plain text,
+
+00:03:25.280 --> 00:03:28.559
+but I like to write in LaTeX.
+
+00:03:28.560 --> 00:03:31.519
+So GhostText came to my rescue
+
+00:03:31.520 --> 00:03:34.479
+when I started using this everyday last May.
+
+00:03:34.480 --> 00:03:37.239
+So I clicked on the GhostText icon.
+
+00:03:37.240 --> 00:03:39.759
+It highlighted that area in blue.
+
+00:03:39.760 --> 00:03:41.839
+There's some boilerplate
+
+00:03:41.840 --> 00:03:45.919
+that I like to start my day with.
+
+00:03:45.920 --> 00:03:50.599
+I like to get a list of my deadlines
+
+00:03:50.600 --> 00:03:54.239
+that are coming up, as shown here,
+
+00:03:54.240 --> 00:03:55.839
+for the next several months.
+
+00:03:55.840 --> 00:03:59.399
+And then I have landed at this tab stop.
+
+00:03:59.400 --> 00:04:04.239
+And so I had issued a tab trigger
+
+00:04:04.240 --> 00:04:09.519
+which inserted this almost 50 lines of text
+
+00:04:09.520 --> 00:04:13.639
+from a snippet through Yasnippet.
+
+00:04:13.640 --> 00:04:17.479
+And then I'll change this text to whatever.
+
+00:04:17.480 --> 00:04:29.279
+And then I can hit TAB to move to the next site.
+
+00:04:29.280 --> 00:04:38.439
+I was dead tired last night, so I fell asleep at my desk,
+
+00:04:38.440 --> 00:04:42.439
+and whatever. So I just keep on going
+
+00:04:42.440 --> 00:04:47.319
+and then hit TAB again and enter my "To Be Done" items.
+
+00:04:47.320 --> 00:04:50.239
+And then what I love about Emacs is that
+
+00:04:50.240 --> 00:04:56.119
+you can hit C-c C-j to insert a new item and so forth,
+
+00:04:56.120 --> 00:05:03.239
+so you can extend the list.
+
+00:05:03.240 --> 00:05:05.079
+Initially, I just have 10 items.
+
+00:05:05.080 --> 00:05:08.839
+I'm going to have more. And on I go,
+
+00:05:08.840 --> 00:05:12.359
+using the full power of LaTeX.
+
+00:05:12.360 --> 00:05:16.119
+So I have configured Atomic Chrome
+
+00:05:16.120 --> 00:05:19.999
+so it will recognize this website as a –
+
+00:05:20.000 --> 00:05:21.399
+it will open up this website –
+
+00:05:21.400 --> 00:05:26.159
+the connection to this website with this buffer
+
+00:05:26.160 --> 00:05:36.559
+in the LaTeX major mode. To turn this off,
+
+00:05:36.560 --> 00:05:40.319
+we can close – simply just close the buffer
+
+00:05:40.320 --> 00:05:42.959
+and that will shut things down.
+
+00:05:42.960 --> 00:05:46.399
+On the browser side, you can right-click on the icon
+
+00:05:46.400 --> 00:05:49.039
+and disconnect GhostText on this page.
+
+NOTE Editing code cells
+
+00:05:49.040 --> 00:05:53.639
+Okay, let's go to a different situation.
+
+00:05:53.640 --> 00:05:57.359
+This is not a feature that's advertised by the developer,
+
+00:05:57.360 --> 00:06:00.119
+but I discovered that you can edit code cells
+
+00:06:00.120 --> 00:06:02.799
+(or any kind of cell for that matter)
+
+00:06:02.800 --> 00:06:04.439
+in a Jupyter Notebook.
+
+00:06:04.440 --> 00:06:05.719
+However, we have a challenge here.
+
+00:06:05.720 --> 00:06:09.319
+We have three text areas open – three code cells.
+
+00:06:09.320 --> 00:06:14.759
+So if we click on the GhostText icon,
+
+00:06:14.760 --> 00:06:17.479
+these three areas will show up in green
+
+00:06:17.480 --> 00:06:19.119
+and we'll be prompted to select the one
+
+00:06:19.120 --> 00:06:20.279
+that we want to activate.
+
+00:06:20.280 --> 00:06:22.359
+We want to activate the one with text.
+
+00:06:22.360 --> 00:06:31.399
+So then we can go in here and make edits, of course,
+
+00:06:31.400 --> 00:06:33.359
+and you can do this in Emacs
+
+00:06:33.360 --> 00:06:35.639
+or we can do it in the browser. It doesn't matter.
+
+00:06:35.640 --> 00:06:38.359
+You saw me editing in Emacs,
+
+00:06:38.360 --> 00:06:40.359
+but we can also make the edits
+
+00:06:40.360 --> 00:06:44.879
+in the text area of the browser
+
+00:06:44.880 --> 00:06:47.519
+and they will show up immediately in Emacs.
+
+00:06:47.520 --> 00:06:54.439
+So we could change the case of that M and that's going to –
+
+00:06:54.440 --> 00:06:59.279
+shows up over here. Okay, we can run this code.
+
+00:06:59.280 --> 00:07:03.439
+So this is R, one of the three major
+
+00:07:03.440 --> 00:07:05.159
+programming languages for data science.
+
+00:07:05.160 --> 00:07:07.319
+At least, Jupyter is supposed to be
+
+00:07:07.320 --> 00:07:13.479
+a combination of Julia, Python, and R.
+
+00:07:13.480 --> 00:07:17.559
+So we're running mcmc to get the posterior distribution
+
+00:07:17.560 --> 00:07:21.119
+and we're going to plot those out with this pyplots package,
+
+00:07:21.120 --> 00:07:24.079
+and we have these beautiful plots showing the median
+
+00:07:24.080 --> 00:07:27.039
+of the posterior distribution for four variables in –
+
+00:07:27.040 --> 00:07:31.559
+four parameters in the CARS data set,
+
+00:07:31.560 --> 00:07:38.039
+which is available – built into the R package.
+
+00:07:38.040 --> 00:07:45.559
+And then these shaded areas are the 80% interval.
+
+00:07:45.560 --> 00:07:49.159
+Okay. Oops.
+
+NOTE Python
+
+00:07:49.160 --> 00:08:07.639
+So now for the Python side,
+
+00:08:07.640 --> 00:08:13.359
+here's an example in which I'm going to actually
+
+00:08:13.360 --> 00:08:18.679
+insert a snippet of that cell
+
+00:08:18.680 --> 00:08:27.279
+and then I'm going to enter nvlig for nglview ligand,
+
+00:08:27.280 --> 00:08:43.319
+and just hit enter. Oops. Hit TAB, excuse me,
+
+00:08:43.320 --> 00:08:47.999
+and we don't need this line of code, so delete that.
+
+00:08:48.000 --> 00:08:52.199
+Yep, we want to load up this pdb file
+
+00:08:52.200 --> 00:08:54.279
+that's in this subdirectory.
+
+00:08:54.280 --> 00:08:56.919
+So the pdb file is a plain text file
+
+00:08:56.920 --> 00:08:58.839
+that contains atomic coordinates
+
+00:08:58.840 --> 00:09:00.159
+of protein crystal structure.
+
+00:09:00.160 --> 00:09:02.999
+This protein happens to be important in cancer
+
+00:09:03.000 --> 00:09:09.079
+and we have – we screened by docking 55,000 compounds
+
+00:09:09.080 --> 00:09:10.679
+on a supercomputer
+
+00:09:10.680 --> 00:09:12.743
+and then we did MD [molecular dynamics] simulations
+
+00:09:12.744 --> 00:09:14.159
+of the top 10 [actually 20] leads.
+
+00:09:14.160 --> 00:09:18.319
+Twelve of them had the compound remain bound
+
+00:09:18.320 --> 00:09:19.679
+during the period of the simulation,
+
+00:09:19.680 --> 00:09:22.559
+so those have some potential for –
+
+00:09:22.560 --> 00:09:25.159
+and require experimental validation.
+
+00:09:25.160 --> 00:09:28.639
+So we'll run this chunk of code,
+
+00:09:28.640 --> 00:09:30.839
+and this will give a view of the molecule
+
+00:09:30.840 --> 00:09:36.479
+that we can interact with by using the mouse.
+
+00:09:36.480 --> 00:09:39.879
+But I want to share this with my colleague.
+
+00:09:39.880 --> 00:09:42.919
+My colleague is not set up to use Jupyter,
+
+00:09:42.920 --> 00:09:46.959
+but instead we can write this out to a HTML file,
+
+00:09:46.960 --> 00:09:48.319
+which I have loaded up already.
+
+00:09:48.320 --> 00:09:55.319
+And so we can actually – perhaps.
+
+00:09:55.320 --> 00:10:01.679
+We click on these two arrows pointing at each other,
+
+00:10:01.680 --> 00:10:05.159
+and we can get a full screen view of this molecule
+
+00:10:05.160 --> 00:10:10.439
+and he can identify each atom in this structure.
+
+00:10:10.440 --> 00:10:12.719
+Over a thousand atoms present.
+
+00:10:12.720 --> 00:10:14.959
+We're just hovering over a specific atom.
+
+00:10:14.960 --> 00:10:27.759
+So shown in gray is the ligand that is bound. Okay.
+
+00:10:27.760 --> 00:10:32.079
+So we still have this box selected
+
+00:10:32.080 --> 00:10:36.559
+and we still have these two different –
+
+00:10:36.560 --> 00:10:40.519
+so for each of the – our selected text areas
+
+00:10:40.520 --> 00:11:03.839
+we have a separate – we have a separate buffer open. Okay.
+
+NOTE Julia
+
+00:11:03.840 --> 00:11:06.839
+To wrap things up here, here's an example of using –
+
+00:11:06.840 --> 00:11:08.919
+with evolving Julia code.
+
+00:11:08.920 --> 00:11:12.919
+And so this Julia code in this cell is in a Emacs buffer.
+
+00:11:12.920 --> 00:11:19.279
+So you've got an idea now, I think.
+
+00:11:19.280 --> 00:11:23.759
+So in terms of plain text areas like in Overleaf
+
+00:11:23.760 --> 00:11:27.519
+and then these cells in Jupyter Notebooks,
+
+00:11:27.520 --> 00:11:30.959
+these are other areas that can be edited
+
+00:11:30.960 --> 00:11:37.919
+like in the text areas within Outlook Webmail and Gmail.
+
+00:11:37.920 --> 00:11:42.639
+Instead of having to point with the mouse
+
+00:11:42.640 --> 00:11:43.519
+or click with the mouse,
+
+00:11:43.520 --> 00:11:48.079
+one can also use keybindings or keyboard shortcuts.
+
+00:11:48.080 --> 00:11:51.599
+So here are the ones for three major operating systems.
+
+NOTE How does GhostText work?
+
+00:11:51.600 --> 00:11:54.639
+So how does GhostText work?
+
+00:11:54.640 --> 00:11:57.199
+Main thing is you have to open up Emacs
+
+00:11:57.200 --> 00:11:59.679
+and get this Atomic Chrome server running.
+
+00:11:59.680 --> 00:12:03.119
+And then with it up and going,
+
+00:12:03.120 --> 00:12:06.679
+GhostText will be able to – has to be activated
+
+00:12:06.680 --> 00:12:09.639
+and it will find the GhostText server
+
+00:12:09.640 --> 00:12:15.079
+through the localhost port 4001.
+
+00:12:15.080 --> 00:12:19.039
+Put that into the web browser.
+
+00:12:19.040 --> 00:12:21.639
+If you navigate to that port,
+
+00:12:21.640 --> 00:12:23.719
+you'll get output that looks like this
+
+00:12:23.720 --> 00:12:25.639
+if everything's working well.
+
+00:12:25.640 --> 00:12:27.919
+Otherwise, you'll get a error message
+
+00:12:27.920 --> 00:12:30.519
+and it should have a port socket –
+
+00:12:30.520 --> 00:12:34.319
+a web socket port number.
+
+00:12:34.320 --> 00:12:36.319
+It will not be the same every time.
+
+NOTE Supported web browsers
+
+00:12:36.320 --> 00:12:42.319
+So these are the supported web browsers
+
+00:12:42.320 --> 00:12:45.359
+in addition to Chrome. These are supported
+
+00:12:45.360 --> 00:12:47.279
+and likewise anything in these –
+
+00:12:47.280 --> 00:12:49.879
+any browser related to these
+
+00:12:49.880 --> 00:12:53.079
+can probably use these extensions.
+
+00:12:53.080 --> 00:12:56.359
+For example, the Brave browser will use Chrome extension
+
+00:12:56.360 --> 00:13:01.679
+and the Firefox browser extension works with WaterFox.
+
+00:13:01.680 --> 00:13:05.239
+These are the supported editors.
+
+00:13:05.240 --> 00:13:10.199
+Each editor has its own extension
+
+00:13:10.200 --> 00:13:15.719
+and this GhostText was initially developed for SublimeText.
+
+00:13:15.720 --> 00:13:17.919
+So if you have SublimeText,
+
+00:13:17.920 --> 00:13:21.959
+then you can use its smooth operation as positive control
+
+00:13:21.960 --> 00:13:24.999
+when things go wrong with Emacs.
+
+NOTE Atomic Chrome configuration
+
+00:13:25.000 --> 00:13:29.479
+This is Atomic. This is a GitHub site for Atomic Chrome.
+
+00:13:29.480 --> 00:13:33.159
+Atomic Chrome is available for installation through Melpa.
+
+00:13:33.160 --> 00:13:40.319
+This is my configuration for Atomic Chrome.
+
+00:13:40.320 --> 00:13:45.519
+So I have this setup so the server starts whenever I log in,
+
+00:13:45.520 --> 00:13:50.319
+and I have it set up so that default major mode is Python
+
+00:13:50.320 --> 00:13:55.559
+to deal with the Jupyter notebooks and Colab notebooks.
+
+00:13:55.560 --> 00:13:57.719
+And then I have major modes
+
+00:13:57.720 --> 00:13:59.839
+for these other websites defined below.
+
+00:13:59.840 --> 00:14:06.079
+This is a testing site so the developer has made
+
+00:14:06.080 --> 00:14:08.119
+to help with troubleshooting.
+
+00:14:08.120 --> 00:14:11.159
+He also has a protocol on his website
+
+00:14:11.160 --> 00:14:13.559
+to follow during troubleshooting.
+
+NOTE Precautions
+
+00:14:13.560 --> 00:14:16.639
+So here are some precautions.
+
+00:14:16.640 --> 00:14:19.079
+You'll find that GhostText doesn't work with Pluto.
+
+00:14:19.080 --> 00:14:21.239
+Pluto is a new computational notebook
+
+00:14:21.240 --> 00:14:23.479
+for working with Julia.
+
+00:14:23.480 --> 00:14:27.039
+My suggestion would be just to run IJulia in Jupyter.
+
+00:14:27.040 --> 00:14:31.999
+It also doesn't work, of course, with RStudio.
+
+00:14:32.000 --> 00:14:35.199
+Even though RStudio sort of resembles
+
+00:14:35.200 --> 00:14:38.999
+a web page, web browser, it's not.
+
+00:14:39.000 --> 00:14:41.359
+Of course, you can always run R,
+
+00:14:41.360 --> 00:14:48.239
+as you've just seen, using the IPy kernel.
+
+00:14:48.240 --> 00:14:52.239
+I will also caution you that if you use the Emacs server,
+
+00:14:52.240 --> 00:14:53.519
+you may run into issues
+
+00:14:53.520 --> 00:14:57.999
+with the server competing with the port 4001.
+
+00:14:58.000 --> 00:15:01.919
+So instead, you should probably configure the Emacs server
+
+00:15:01.920 --> 00:15:04.999
+to use a specific port.
+
+00:15:05.000 --> 00:15:07.639
+So far – although I haven't done that myself –
+
+00:15:07.640 --> 00:15:10.999
+so far, I haven't found any conflicts
+
+00:15:11.000 --> 00:15:13.479
+with the Org Roam user interface.
+
+NOTE Conclusions
+
+00:15:13.480 --> 00:15:20.919
+So my conclusions are: GhostText allows you to edit prose
+
+00:15:20.920 --> 00:15:24.439
+with your favorite major mode
+
+00:15:24.440 --> 00:15:28.119
+in the text areas of web pages
+
+00:15:28.120 --> 00:15:31.079
+and in the cells of Jupyter notebooks.
+
+00:15:31.080 --> 00:15:34.359
+This allows you to tap into snippets
+
+00:15:34.360 --> 00:15:37.519
+and thereby save time as you have – probably have –
+
+00:15:37.520 --> 00:15:39.719
+hopefully got an idea of.
+
+NOTE Thanks
+
+00:15:39.720 --> 00:15:44.039
+I'd like to thank my friends and mentors
+
+00:15:44.040 --> 00:15:46.599
+who've helped me out during my second year
+
+00:15:46.600 --> 00:15:49.359
+in my Emacs learning spiral.
+
+00:15:49.360 --> 00:15:55.839
+These include my local colleagues.
+
+00:15:55.840 --> 00:15:58.679
+We meet once a month in the Oklahoma Data Science Workshop.
+
+00:15:58.680 --> 00:16:01.719
+Last July, I gave a presentation about GhostText.
+
+00:16:01.720 --> 00:16:08.359
+And then also my friends at Berlin and Austin Emacs meetups
+
+00:16:08.360 --> 00:16:12.959
+and in the UK research software engineer
+
+00:16:12.960 --> 00:16:17.599
+Emacs research Slack channel.
+
+00:16:17.600 --> 00:16:18.919
+So I don't attend these every month,
+
+00:16:18.920 --> 00:16:21.439
+but I try to make the meetings as often as I can.
+
+00:16:21.440 --> 00:16:25.399
+Then I'm supported by the following grants,
+
+00:16:25.400 --> 00:16:28.359
+which allow me to spend
+
+00:16:28.360 --> 00:16:30.679
+at least some time each day in Emacs.
+
+00:16:30.680 --> 00:16:34.960
+I'll be happy to take any questions.
diff --git a/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt
new file mode 100644
index 00000000..836e8d54
--- /dev/null
+++ b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt
@@ -0,0 +1,43 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:39.320
+Introduction
+
+00:00:39.320 --> 00:01:48.520
+Justfiles
+
+00:01:48.520 --> 00:02:27.680
+Executing recipes
+
+00:02:27.680 --> 00:02:56.440
+Other features
+
+00:02:56.440 --> 00:04:19.280
+Comparison with Makefiles
+
+00:04:19.280 --> 00:04:52.400
+justl.el
+
+00:04:52.400 --> 00:06:17.280
+Executing recipes in Emacs
+
+00:06:17.280 --> 00:06:36.600
+Options
+
+00:06:36.600 --> 00:06:57.320
+Eshell
+
+00:06:57.320 --> 00:07:15.520
+Going to the recipe line
+
+00:07:15.520 --> 00:07:39.560
+Re-executing recipes
+
+00:07:39.560 --> 00:08:56.600
+Example
+
+00:08:56.600 --> 00:09:34.680
+justl-exec-recipe-in-dir
+
+00:09:34.680 --> 00:10:02.040
+End
diff --git a/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt
new file mode 100644
index 00000000..cd239aa8
--- /dev/null
+++ b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt
@@ -0,0 +1,826 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:04.240
+Hi everyone, I am Sibi Prabakaran
+
+00:00:04.240 --> 00:00:09.560
+and welcome to my session on Justl Emacs Mode.
+
+00:00:09.560 --> 00:00:11.640
+A bit about me, I have been working
+
+00:00:11.640 --> 00:00:12.880
+as a Haskell Engineer
+
+00:00:12.880 --> 00:00:15.600
+at FPComplete for the last 4 years.
+
+00:00:15.600 --> 00:00:17.400
+I am based out of India.
+
+00:00:17.400 --> 00:00:20.680
+I occasionally blog at my website psibi.in
+
+00:00:20.680 --> 00:00:23.560
+where you can find more information about me.
+
+00:00:23.560 --> 00:00:25.000
+I have been using Emacs
+
+00:00:25.000 --> 00:00:26.920
+for more than a decade now.
+
+00:00:26.920 --> 00:00:28.160
+I help in the maintenance
+
+00:00:28.160 --> 00:00:31.080
+of the Terraform client for LSP mode.
+
+00:00:31.080 --> 00:00:33.960
+I have also authored dhall-mode and rego-mode
+
+00:00:33.960 --> 00:00:35.000
+which are the major modes
+
+00:00:35.000 --> 00:00:39.320
+for the respective languages.
+
+00:00:39.320 --> 00:00:40.680
+Before jumping into the demo
+
+00:00:40.680 --> 00:00:42.040
+of the Emacs package,
+
+00:00:42.040 --> 00:00:44.160
+I would like to give a brief introduction
+
+00:00:44.160 --> 00:00:46.280
+about justfiles and what it is.
+
+00:00:46.280 --> 00:00:49.000
+I will also try to compare it with Makefiles
+
+00:00:49.000 --> 00:00:53.640
+as it takes a lot of inspiration from it.
+
+00:00:53.640 --> 00:00:55.640
+What you see currently in the buffer
+
+00:00:55.640 --> 00:00:57.320
+is a sample justfile.
+
+00:00:57.320 --> 00:00:59.480
+If you have previously used Makefiles,
+
+00:00:59.480 --> 00:01:00.480
+you would be able to see
+
+00:01:00.480 --> 00:01:02.280
+that there is quite a bit of similarity
+
+00:01:02.280 --> 00:01:03.560
+between them.
+
+00:01:03.560 --> 00:01:05.080
+Anything that starts with hash
+
+00:01:05.080 --> 00:01:07.120
+is a documentation comment.
+
+00:01:07.120 --> 00:01:09.160
+You can see that I have the first recipe
+
+00:01:09.160 --> 00:01:10.920
+which is named as default.
+
+00:01:10.920 --> 00:01:12.520
+So if you run the just executable
+
+00:01:12.520 --> 00:01:14.120
+without any arguments,
+
+00:01:14.120 --> 00:01:15.400
+by default it is going to run
+
+00:01:15.400 --> 00:01:17.200
+the first recipe.
+
+00:01:17.200 --> 00:01:18.440
+This recipe's definition
+
+00:01:18.440 --> 00:01:20.080
+calls the just command
+
+00:01:20.080 --> 00:01:21.920
+in turn, with the two arguments,
+
+00:01:21.920 --> 00:01:24.080
+namely --list and --unsorted,
+
+00:01:24.080 --> 00:01:25.680
+which basically asks just
+
+00:01:25.680 --> 00:01:27.800
+to list down all the recipes
+
+00:01:27.800 --> 00:01:29.680
+in an unsorted order.
+
+00:01:29.680 --> 00:01:32.400
+Each line of each recipe is executed
+
+00:01:32.400 --> 00:01:33.920
+by a fresh shell.
+
+00:01:33.920 --> 00:01:35.120
+That pretty much
+
+00:01:35.120 --> 00:01:36.360
+is the high level overview
+
+00:01:36.360 --> 00:01:38.520
+of getting started to use this tool.
+
+00:01:38.520 --> 00:01:40.760
+This tool assumes the presence of a shell
+
+00:01:40.760 --> 00:01:43.480
+which is bash in most GNU/Linux systems,
+
+00:01:43.480 --> 00:01:44.840
+but you can configure it
+
+00:01:44.840 --> 00:01:47.160
+to explicitly use any specific shell
+
+00:01:47.160 --> 00:01:48.520
+you have in mind.
+
+00:01:48.520 --> 00:01:50.480
+Let me in fact go and try executing
+
+00:01:50.480 --> 00:01:52.600
+the first recipe.
+
+00:01:52.600 --> 00:01:53.760
+I will first execute it
+
+00:01:53.760 --> 00:01:55.160
+without any arguments,
+
+00:01:55.160 --> 00:01:59.000
+which will force it to run the first recipe.
+
+00:01:59.000 --> 00:02:01.800
+As you can see, it listed all the recipes.
+
+00:02:01.800 --> 00:02:03.200
+Now I can actually execute
+
+00:02:03.200 --> 00:02:04.200
+a particular recipe
+
+00:02:04.200 --> 00:02:06.640
+by passing an explicit recipe name.
+
+00:02:06.640 --> 00:02:08.400
+Let me execute the hello recipe now
+
+00:02:08.400 --> 00:02:11.920
+which will basically print "hello world".
+
+00:02:11.920 --> 00:02:15.320
+It works as expected.
+
+00:02:15.320 --> 00:02:17.040
+As you can see, that's all that's required
+
+00:02:17.040 --> 00:02:18.600
+to get started with this tool.
+
+00:02:18.600 --> 00:02:20.348
+You create a file named justfile
+
+00:02:20.349 --> 00:02:22.800
+in a directory, define some recipes
+
+00:02:22.800 --> 00:02:23.640
+and then run them
+
+00:02:23.640 --> 00:02:27.680
+via the just executable.
+
+00:02:27.680 --> 00:02:28.440
+Note that there are
+
+00:02:28.440 --> 00:02:30.680
+various other features in justfile.
+
+00:02:30.680 --> 00:02:32.240
+You can define variables,
+
+00:02:32.240 --> 00:02:33.280
+mark some variables
+
+00:02:33.280 --> 00:02:35.520
+to be exported as environment variables,
+
+00:02:35.520 --> 00:02:37.280
+have optional parameters
+
+00:02:37.280 --> 00:02:38.800
+that can be passed to a recipe.
+
+00:02:38.800 --> 00:02:40.960
+You can also set up dependency
+
+00:02:40.960 --> 00:02:42.480
+between recipes
+
+00:02:42.480 --> 00:02:44.920
+and also write scripts within a recipe
+
+00:02:44.920 --> 00:02:46.800
+in a language of your choice.
+
+00:02:46.800 --> 00:02:48.560
+I won't be going into the details,
+
+00:02:48.560 --> 00:02:50.120
+but I encourage you to go through
+
+00:02:50.120 --> 00:02:51.640
+the very helpful manual page
+
+00:02:51.640 --> 00:02:56.440
+to learn more about it.
+
+00:02:56.440 --> 00:02:59.200
+Also, let me compare it with Makefiles.
+
+00:02:59.200 --> 00:03:00.800
+I do think it's kind of unfair
+
+00:03:00.800 --> 00:03:02.160
+to compare both the tools
+
+00:03:02.160 --> 00:03:04.760
+since make is a build automation tool
+
+00:03:04.760 --> 00:03:07.520
+whereas just's goal is a task runner,
+
+00:03:07.520 --> 00:03:09.320
+and since just doesn't try to be
+
+00:03:09.320 --> 00:03:10.440
+a build system,
+
+00:03:10.440 --> 00:03:12.480
+it can avoid the associated complexity
+
+00:03:12.480 --> 00:03:15.080
+that comes with the tool like make.
+
+00:03:15.080 --> 00:03:17.040
+There is one nice historical fact
+
+00:03:17.040 --> 00:03:18.200
+about just.
+
+00:03:18.200 --> 00:03:19.560
+The initial version of just
+
+00:03:19.560 --> 00:03:21.640
+relied on make command being available,
+
+00:03:21.640 --> 00:03:23.360
+so it was basically
+
+00:03:23.360 --> 00:03:25.440
+a glorified wrapper around it.
+
+00:03:25.440 --> 00:03:26.440
+But it was removed,
+
+00:03:26.440 --> 00:03:27.760
+and justfile doesn't have
+
+00:03:27.760 --> 00:03:29.680
+that dependency anymore.
+
+00:03:29.680 --> 00:03:31.680
+If you are using make as a task runner
+
+00:03:31.680 --> 00:03:33.400
+then you would have to use
+
+00:03:33.400 --> 00:03:35.400
+something called phony targets.
+
+00:03:35.400 --> 00:03:37.240
+I don't want to go into the details,
+
+00:03:37.240 --> 00:03:39.240
+but makefiles have good reason
+
+00:03:39.240 --> 00:03:41.040
+for why they need something like that.
+
+00:03:41.040 --> 00:03:44.080
+Since justfile is not a build system,
+
+00:03:44.080 --> 00:03:45.200
+it doesn't have to deal with them.
+
+00:03:45.200 --> 00:03:47.400
+The error message
+
+00:03:47.400 --> 00:03:48.680
+and user experience of this tool,
+
+00:03:48.680 --> 00:03:50.480
+in my opinion, is better.
+
+00:03:50.480 --> 00:03:52.760
+To show you a concrete example,
+
+00:03:52.760 --> 00:03:54.920
+justfile errors out by default
+
+00:03:54.920 --> 00:03:56.400
+if you have duplicate recipes.
+
+00:03:56.400 --> 00:03:58.840
+This is in contrast with make
+
+00:03:58.840 --> 00:04:00.720
+where I believe it prints out
+
+00:04:00.720 --> 00:04:01.760
+a warning about it,
+
+00:04:01.760 --> 00:04:03.840
+but still executes the target action.
+
+00:04:03.840 --> 00:04:06.600
+Justfile also gives you the ability
+
+00:04:06.600 --> 00:04:08.200
+to easily create scripts
+
+00:04:08.200 --> 00:04:10.680
+written in any language within a recipe.
+
+00:04:10.680 --> 00:04:12.680
+My personal opinion is that
+
+00:04:12.680 --> 00:04:14.200
+if you are using makefile
+
+00:04:14.200 --> 00:04:15.200
+as a task runner,
+
+00:04:15.200 --> 00:04:17.440
+you might want to check out justfile
+
+00:04:17.440 --> 00:04:19.280
+to see if it will suit your workflow.
+
+00:04:19.280 --> 00:04:25.000
+With that, I'll move on to justl.el,
+
+00:04:25.000 --> 00:04:26.800
+which is basically an Emacs package
+
+00:04:26.800 --> 00:04:28.120
+for driving justfiles.
+
+00:04:28.120 --> 00:04:29.920
+I started writing this tool
+
+00:04:29.920 --> 00:04:31.200
+around a year ago
+
+00:04:31.200 --> 00:04:33.720
+when my usage of justfile increased.
+
+00:04:33.720 --> 00:04:35.440
+The objective of the tool
+
+00:04:35.440 --> 00:04:37.480
+is to reduce the usage of the CLI
+
+00:04:37.480 --> 00:04:40.040
+and drive the execution of the recipes
+
+00:04:40.040 --> 00:04:41.480
+natively within the editor.
+
+00:04:41.480 --> 00:04:44.000
+Let me take you back to the justfile
+
+00:04:44.000 --> 00:04:45.240
+which we saw previously.
+
+00:04:45.240 --> 00:04:47.320
+This time we will drive it
+
+00:04:47.320 --> 00:04:48.840
+within the editor itself,
+
+00:04:48.840 --> 00:04:51.400
+instead of executing commands via vterm
+
+00:04:51.400 --> 00:04:52.400
+as done previously.
+
+00:04:52.400 --> 00:04:54.640
+So the idea is you either
+
+00:04:54.640 --> 00:04:56.000
+open the justfile,
+
+00:04:56.000 --> 00:04:57.840
+or any other file in the directory.
+
+00:04:57.840 --> 00:04:59.160
+That doesn't matter, actually.
+
+00:04:59.160 --> 00:05:00.720
+Once you do that,
+
+00:05:00.720 --> 00:05:02.360
+you call the justl command.
+
+00:05:02.360 --> 00:05:06.640
+Now as you can see, it lists down
+
+00:05:06.640 --> 00:05:07.520
+all the recipes,
+
+00:05:07.520 --> 00:05:09.280
+along with the description if present.
+
+00:05:09.280 --> 00:05:11.520
+You can move on to different recipes
+
+00:05:11.520 --> 00:05:13.080
+by your usual keybinding.
+
+00:05:13.080 --> 00:05:15.680
+And for executing a specific recipe,
+
+00:05:15.680 --> 00:05:18.240
+you have to press the e keybinding,
+
+00:05:18.240 --> 00:05:19.720
+and that will run the recipe
+
+00:05:19.720 --> 00:05:21.600
+and show its output
+
+00:05:21.600 --> 00:05:23.400
+on a special buffer named *just*
+
+00:05:23.400 --> 00:05:25.000
+which is built on top of
+
+00:05:25.000 --> 00:05:27.040
+the compilation mode available in Emacs.
+
+00:05:27.040 --> 00:05:28.760
+Let me actually try
+
+00:05:28.760 --> 00:05:30.240
+executing the hello recipe
+
+00:05:30.240 --> 00:05:32.440
+which we previously executed in vterm.
+
+00:05:32.440 --> 00:05:38.160
+As you can see,
+
+00:05:38.160 --> 00:05:39.680
+it executed the recipe
+
+00:05:39.680 --> 00:05:41.120
+and the "hello world" output
+
+00:05:41.120 --> 00:05:42.400
+is visible in the just buffer.
+
+00:05:42.400 --> 00:05:44.400
+You can also see that there is
+
+00:05:44.400 --> 00:05:45.880
+other metadata like
+
+00:05:45.880 --> 00:05:47.480
+when it started executing
+
+00:05:47.480 --> 00:05:49.520
+and when did it finish executing.
+
+00:05:49.520 --> 00:05:51.520
+If a recipe execution fails,
+
+00:05:51.520 --> 00:05:53.160
+it will also change the color
+
+00:05:53.160 --> 00:05:55.760
+and print the corresponding exit code.
+
+00:05:55.760 --> 00:05:57.320
+Let me actually show you
+
+00:05:57.320 --> 00:05:59.080
+by modifying the hello recipe
+
+00:05:59.080 --> 00:06:03.600
+and making it exit.
+
+00:06:03.600 --> 00:06:08.400
+As you can see,
+
+00:06:08.400 --> 00:06:10.480
+it clearly indicates the error message now.
+
+00:06:10.480 --> 00:06:12.720
+That is a pretty much
+
+00:06:12.720 --> 00:06:14.240
+a good high level overview
+
+00:06:14.240 --> 00:06:15.680
+of how to execute recipes
+
+00:06:15.680 --> 00:06:17.280
+using this Emacs extension.
+
+00:06:17.280 --> 00:06:21.720
+If I press the h or the ? key,
+
+00:06:21.720 --> 00:06:23.520
+it will display the various ways
+
+00:06:23.520 --> 00:06:24.160
+to drive it.
+
+00:06:24.160 --> 00:06:27.480
+Now as you can see,
+
+00:06:27.480 --> 00:06:29.320
+you can pass various options to it.
+
+00:06:29.320 --> 00:06:31.600
+I find the dry run option effective
+
+00:06:31.600 --> 00:06:34.560
+whenever I have to print the recipe contents
+
+00:06:34.560 --> 00:06:36.600
+without actually executing the recipe.
+
+00:06:36.600 --> 00:06:39.720
+There are also various ways to execute it.
+
+00:06:39.720 --> 00:06:42.960
+You can use Emacs's eshell to execute it
+
+00:06:42.960 --> 00:06:45.040
+by pressing the E keybinding.
+
+00:06:45.040 --> 00:06:48.400
+Let me try executing the hello recipe again,
+
+00:06:48.400 --> 00:06:50.760
+but this time via Emacs's eshell.
+
+00:06:50.760 --> 00:06:54.840
+As you can see now I have an eshell instance
+
+00:06:54.840 --> 00:06:57.320
+where it executed the just hello recipe.
+
+00:06:57.320 --> 00:07:02.440
+You can also directly
+
+00:07:02.440 --> 00:07:03.680
+go to the recipe line
+
+00:07:03.680 --> 00:07:05.000
+by pressing the return key.
+
+00:07:05.000 --> 00:07:08.040
+So let's say if I want to
+
+00:07:08.040 --> 00:07:09.360
+go to the recipe build app
+
+00:07:09.360 --> 00:07:12.160
+all I have to do is press the return key
+
+00:07:12.160 --> 00:07:14.400
+and it will go to the just file
+
+00:07:14.400 --> 00:07:15.520
+with the proper line.
+
+00:07:15.520 --> 00:07:19.800
+You can also re-execute the same recipe
+
+00:07:19.800 --> 00:07:21.320
+from the output just buffer.
+
+00:07:21.320 --> 00:07:23.320
+I find this very helpful
+
+00:07:23.320 --> 00:07:25.080
+when iterating on certain things.
+
+00:07:25.080 --> 00:07:26.720
+In my day job,
+
+00:07:26.720 --> 00:07:29.240
+I often have to work with a Kubernetes cluster,
+
+00:07:29.240 --> 00:07:30.480
+and I would have to write
+
+00:07:30.480 --> 00:07:33.360
+resource manifest files for applications.
+
+00:07:33.360 --> 00:07:36.376
+Having the ability to run the recipes
+
+00:07:36.377 --> 00:07:37.942
+while iterating on the project
+
+00:07:37.943 --> 00:07:39.560
+is very useful, in my opinion.
+
+00:07:39.560 --> 00:07:42.000
+Let me actually show you
+
+00:07:42.000 --> 00:07:43.680
+an example of what I am talking about.
+
+00:07:43.680 --> 00:07:46.680
+Let me run the build app recipe now,
+
+00:07:46.680 --> 00:07:48.400
+which will basically build the manifest
+
+00:07:48.400 --> 00:07:49.600
+and print it out.
+
+00:07:49.600 --> 00:07:58.160
+Now let me open one of the application files.
+
+00:07:58.160 --> 00:07:59.960
+I will open the ingress.yaml file.
+
+00:07:59.960 --> 00:08:06.120
+So I have this YAML file which I am working on,
+
+00:08:06.120 --> 00:08:08.600
+and I also have this output buffer
+
+00:08:08.600 --> 00:08:10.160
+which is basically the output
+
+00:08:10.160 --> 00:08:11.840
+of the build app recipe.
+
+00:08:11.840 --> 00:08:14.200
+Now I can basically go through this buffer
+
+00:08:14.200 --> 00:08:18.320
+and see if everything is alright,
+
+00:08:18.320 --> 00:08:21.760
+but I find out that I didn't want
+
+00:08:21.760 --> 00:08:23.920
+the hostname to be emacs2022.
+
+00:08:23.920 --> 00:08:25.840
+I wanted it to be just emacs.
+
+00:08:25.840 --> 00:08:29.000
+I can go and fix it in my YAML file,
+
+00:08:29.000 --> 00:08:34.160
+and then I can go on
+
+00:08:34.160 --> 00:08:36.160
+to the output buffer
+
+00:08:36.160 --> 00:08:38.520
+and basically just re-run the command
+
+00:08:38.520 --> 00:08:40.080
+by pressing the g key binding.
+
+00:08:40.080 --> 00:08:42.800
+As you can see,
+
+00:08:42.800 --> 00:08:48.160
+it executed the same recipe again,
+
+00:08:48.160 --> 00:08:49.440
+and I can see that
+
+00:08:49.440 --> 00:08:51.280
+the hostname is indeed emacs.
+
+00:08:51.280 --> 00:08:55.000
+I find this kind of workflow very convenient
+
+00:08:55.000 --> 00:08:56.600
+while I am working on a project.
+
+00:08:56.600 --> 00:08:59.320
+Another way of interacting
+
+00:08:59.320 --> 00:09:00.440
+with the justl extension
+
+00:09:00.440 --> 00:09:02.400
+is by using the interactive function
+
+00:09:02.400 --> 00:09:04.280
+justl-exec-recipe-in-dir.
+
+00:09:04.280 --> 00:09:06.040
+The use case of this function
+
+00:09:06.040 --> 00:09:07.840
+is executing a one-off recipe
+
+00:09:07.840 --> 00:09:09.920
+while you are working on something else.
+
+00:09:09.920 --> 00:09:11.960
+Let me show you an example of it.
+
+00:09:11.960 --> 00:09:19.800
+As you can see, it shows me
+
+00:09:19.800 --> 00:09:21.320
+a drop down of various recipes
+
+00:09:21.320 --> 00:09:22.640
+available in the justfile.
+
+00:09:22.640 --> 00:09:24.880
+You can choose any particular one
+
+00:09:24.880 --> 00:09:26.800
+and execute the corresponding recipe.
+
+00:09:26.800 --> 00:09:28.360
+In this case, I will choose
+
+00:09:28.360 --> 00:09:29.640
+the build-app recipe,
+
+00:09:29.640 --> 00:09:31.320
+and we will get the output
+
+00:09:31.320 --> 00:09:32.280
+in the *just* buffer
+
+00:09:32.280 --> 00:09:33.200
+which should be similar
+
+00:09:33.200 --> 00:09:34.680
+to what we saw previously.
+
+00:09:34.680 --> 00:09:43.920
+So this was a quick introduction
+
+00:09:43.920 --> 00:09:45.120
+to what justfile is
+
+00:09:45.120 --> 00:09:46.800
+and how to drive them within Emacs.
+
+00:09:46.800 --> 00:09:48.600
+Hopefully it was helpful
+
+00:09:48.600 --> 00:09:50.160
+and it would encourage you
+
+00:09:50.160 --> 00:09:51.480
+to use justfiles in your workflow.
+
+00:09:51.480 --> 00:09:53.800
+Thank you for allowing me to present.
+
+00:09:53.800 --> 00:09:55.480
+I am available in IRC
+
+00:09:55.480 --> 00:10:02.040
+if you have any questions.
diff --git a/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.vtt b/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.vtt
new file mode 100644
index 00000000..a6a4ba40
--- /dev/null
+++ b/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.vtt
@@ -0,0 +1,497 @@
+WEBVTT
+
+00:00.000 --> 00:09.260
+Excellent. Thank you for the great talk. As someone whose first language wasn't English
+
+00:09.260 --> 00:14.960
+and speaks other languages, I think localization and internationalization is a very important
+
+00:14.960 --> 00:20.920
+topic that's near and dear to my heart, and especially when it comes to Emacs. I think
+
+00:20.920 --> 00:26.700
+there's a lot that we could do better. So, yeah, thanks so much. Folks, if you have questions,
+
+00:26.700 --> 00:32.880
+you can post them on IRC on the pad, and Jon-Karstof will answer them, and we will also open up
+
+00:32.880 --> 00:37.600
+this big blue button for people who would like to join here and ask their questions
+
+00:37.600 --> 00:45.760
+directly. Jon-Karstof, please take it away. Okay, thank you. I'm not seeing much activity
+
+00:45.760 --> 00:55.920
+on IRC or the pad, so let me add a few things. First, that patch was really interesting in
+
+00:55.920 --> 01:03.680
+terms of actually getting into the code and understanding how really can a beginner join
+
+01:03.680 --> 01:11.080
+development, even if it's just a few lines. I mentioned in the first part of the presentation
+
+01:11.080 --> 01:17.600
+that there was this small integration bug with Mac, and that's the thing that actually
+
+01:17.600 --> 01:22.400
+got me started, and that was interesting because at the time I was trying to use Aquamax because
+
+01:22.400 --> 01:28.280
+it looked simpler, and I thought, okay, if I need to fix that, rather than fixing it
+
+01:28.280 --> 01:34.400
+in Aquamax, maybe I should just go to Emacs and fix it there. So, that was the first attempt
+
+01:34.400 --> 01:40.440
+for me to actually contribute something serious, and it was really nice to – I mean, this
+
+01:40.440 --> 01:47.160
+Emacs development list is really amazing. 99% of the discussion is just way above your
+
+01:47.160 --> 01:54.120
+head, but sometimes you grasp something, and the more you grasp it, the more you understand
+
+01:54.120 --> 02:00.600
+and the more you feel like you can actually do something, especially since – I mean,
+
+02:00.600 --> 02:06.640
+as for all the free software development projects, most of them, I guess, it's really just do
+
+02:06.640 --> 02:13.920
+it kind of thing. And if you try to do something, somebody's going to help you, and what I
+
+02:13.920 --> 02:21.200
+really enjoy when being there is that the people are always very nice. Sometimes you
+
+02:21.200 --> 02:28.080
+feel some tension when there are discussions about a specific topic, but it's – everybody
+
+02:28.080 --> 02:37.520
+is really polite, I mean, 99% of the time. And what I like the most is all the people
+
+02:37.520 --> 02:42.680
+are very strong opinionated, so they have a very good idea of what Emacs should be or
+
+02:42.680 --> 02:47.640
+should not be, and so it gives you a very good idea of in what direction you should
+
+02:47.640 --> 02:57.400
+go. So that experience – I mean, pretty much those 2017, 2018 years were until now
+
+02:57.400 --> 03:02.040
+the peak of my Emacs activity. I've had to craddle with that because I was busy with
+
+03:02.040 --> 03:07.160
+other things, but I'm really planning to go back to working on maybe not localization
+
+03:07.160 --> 03:13.480
+because it's really – it's too big for me right now. And what I was told is that
+
+03:13.480 --> 03:20.520
+it involved a bit of C programming and things like this, so I'm not really into that right
+
+03:20.520 --> 03:30.840
+now. But I think eventually one day – I just turned 53, so I guess in a few years
+
+03:30.840 --> 03:36.800
+from now when I have more time, I guess I'll just dive in and just work on those localization
+
+03:36.800 --> 03:43.800
+issues and really to bring Emacs to a different world because I think it's – if we were
+
+03:43.800 --> 03:49.920
+able to have – it's a big job. I mean, it's really – if you check the threads
+
+03:49.920 --> 03:55.400
+on dev, check my name, you will see that I mostly post on translation or localization
+
+03:55.400 --> 04:01.360
+issues at least at the time. And I did an estimate of the sheer volume of strings to
+
+04:01.360 --> 04:10.360
+translate. For example, the manuals were about 2 million words. That's big. That's big.
+
+04:10.360 --> 04:14.040
+But it's okay. I mean, it's not something that's impossible. And if you check the strings
+
+04:14.040 --> 04:20.160
+– that was a really rough estimate. If you check the strings for Emacs proper, not even
+
+04:20.160 --> 04:29.120
+talking about the packages and things, I think that would add probably like 500,000 words.
+
+04:29.120 --> 04:34.360
+I mean, I have no idea, but my very rough estimate would be that. So it's not something
+
+04:34.360 --> 04:41.120
+that's impossible to do. And we'd have to ensure that we have a good process for people
+
+04:41.120 --> 04:46.200
+who review the strings and contribute new strings and things like this and also best
+
+04:46.200 --> 04:53.560
+practices like what I tried to show in this video. And I was really not trying to be dismissive
+
+04:53.560 --> 04:58.680
+about the people who worked on Package L because they did a wonderful job at actually helping
+
+04:58.680 --> 05:02.840
+people like me access all those packages. So it's – I mean, the point of the video
+
+05:02.840 --> 05:10.840
+is naturally to dismiss the code. But I was kind of scared because I was like, if they
+
+05:10.840 --> 05:18.720
+write code like this for strings, then what about the rest of the code? Is it – so it
+
+05:18.720 --> 05:25.560
+was kind of – I mean, something that I really can't evaluate. But I'm like – I mean,
+
+05:25.560 --> 05:30.600
+those guys obviously are really smart and they're trying to make intelligent things
+
+05:30.600 --> 05:37.400
+about how they want to factor their code, et cetera. But if they do that for strings,
+
+05:37.400 --> 05:44.400
+which is quite simple actually – I mean, it's simple to mess up strings. So I was
+
+05:44.400 --> 05:50.320
+like, what about the rest of the code? Is it that complex or that difficult to understand?
+
+05:50.320 --> 05:56.000
+So that's kind of a put off for me. I'm like, I really don't want to try to envisage
+
+05:56.000 --> 06:01.760
+that more because – plus it's not – it's really not my area at all. So anyway, that's
+
+06:01.760 --> 06:04.400
+what I wanted to add. Yeah.
+
+06:04.400 --> 06:11.680
+Awesome. Yeah, I think I pretty much agree with all of what you said.
+
+06:11.680 --> 06:17.360
+Yeah, yeah, yeah. I have a question – I see a question on the pad. I use Emacs on
+
+06:17.360 --> 06:23.520
+English, but my mother language is – no, no, no. Okay. So the answer is that Emacs
+
+06:23.520 --> 06:33.760
+is not localized. And my understanding is that right now it's not localizable. And
+
+06:33.760 --> 06:40.840
+those discussions took place about four or five years ago. So check on the dev list and
+
+06:40.840 --> 06:46.280
+you'll see the state of the discussion because there is only a discussion at the moment.
+
+06:46.280 --> 06:57.480
+What I did for package L, I think it was really just a one-time attempt at fixing one package.
+
+06:57.480 --> 07:05.640
+And I did check the other – a number of other packages in core Emacs. And not a lot
+
+07:05.640 --> 07:12.280
+of them had – I mean, as far as I checked. And I really did not check everything. But
+
+07:12.280 --> 07:20.840
+basically what you have to do is check all the functions that impact strings. And some
+
+07:20.840 --> 07:28.600
+are really not user-facing strings, so they're not really interesting for us. And actually,
+
+07:28.600 --> 07:34.640
+that's really interesting to do that. So if you just take one list package, list code
+
+07:34.640 --> 07:40.480
+and just go through the thing and just check all of print1, printc, message, format, concat
+
+07:40.480 --> 07:43.520
+and stuff and just see how it goes.
+
+07:43.520 --> 07:50.240
+So basically right now there is no infrastructure to localize the thing. There is no process
+
+07:50.240 --> 07:56.720
+to extract the strings. And there is no way to actually import them back into the code.
+
+07:56.720 --> 08:02.800
+So what we can do right now is really just what I did, make sure that it's eventually
+
+08:02.800 --> 08:10.760
+possible one day. And as I just shown, it's really not such a big deal. If you're very
+
+08:10.760 --> 08:19.800
+careful about understanding the way that the strings are handled, it's just a few rewrites
+
+08:19.800 --> 08:24.560
+away. I mean, it's really not much. So there's – I mean, there's not a lot to be proud
+
+08:24.560 --> 08:31.140
+about in my patch. But it was really fun. And I think it's a very good entry point
+
+08:31.140 --> 08:39.480
+for people like us. I suppose – I mean, I suppose the first person question. I mean,
+
+08:39.480 --> 08:44.240
+I don't know. Maybe I'm just – I should not suppose that. But people who really enjoy
+
+08:44.240 --> 08:51.320
+working in Emacs and just sometimes would like to contribute something and are not programmers
+
+08:51.320 --> 08:56.320
+or anything or maybe even programmers. I mean, I'm not excluding them. But that's really
+
+08:56.320 --> 09:02.280
+a good way to just start doing something. And eventually from there, you can – I mean,
+
+09:02.280 --> 09:07.020
+you just use a package that you like and that you think is important and just check the
+
+09:07.020 --> 09:10.200
+strings and do things like this. And then eventually, you'll find other parts of the
+
+09:10.200 --> 09:18.840
+code that you want to improve or add functions. So yeah, actually, the patch that I did, this
+
+09:18.840 --> 09:26.840
+patch is actually in the process of the thing that I started with Equimax. So I did one
+
+09:26.840 --> 09:35.600
+little thing regarding those that were not fully integrated in macOS. And then I did
+
+09:35.600 --> 09:41.880
+something about a small function. I think I added the possibility to add an option.
+
+09:41.880 --> 09:48.960
+I did documentation improvement as well. So really just little things. And then the deeper
+
+09:48.960 --> 09:53.000
+you dive, the more interesting it gets. And then you find something that you really want
+
+09:53.000 --> 10:07.160
+to do. So just use that entry point as a way to have fun in Emacs.
+
+10:07.160 --> 10:15.240
+Well, so I mentioned Regex on strings. Well, it's not really a red flag for localization.
+
+10:15.240 --> 10:28.080
+But the way it's used, I mean, I guess there are ways to properly use it. But I think really
+
+10:28.080 --> 10:38.400
+the basically using that means that you're making assumptions on the way language is
+
+10:38.400 --> 10:45.800
+structured. And I did exactly the same mistake on a different project that I'm working on.
+
+10:45.800 --> 10:51.280
+Actually, I'm in charge of rewriting a manual. And we were using Docbook. And I just thought
+
+10:51.280 --> 10:57.240
+it would be smart to have automated links to parts of the chapters, et cetera. And the
+
+10:57.240 --> 11:01.240
+thing is that depending on the language, you've got different ways to introduce chapters.
+
+11:01.240 --> 11:10.540
+So I should know that. I should know that. You should not automatically insert strings
+
+11:10.540 --> 11:20.720
+in code because it's going to produce something that can't be handled by the translator. So
+
+11:20.720 --> 11:28.840
+basically Regex on strings is something that probably you might use. But if you see, I
+
+11:28.840 --> 11:33.320
+mean, you can see the way it was used in the original code. So if you see something like
+
+11:33.320 --> 11:39.360
+that, I mean, just don't run and just fix the thing because there is no way these can
+
+11:39.360 --> 11:44.920
+be localized, I mean, extracted properly and then localized. And that's the reason too
+
+11:44.920 --> 11:50.480
+why numbers are a big problem because, for example, in English but in French too, we
+
+11:50.480 --> 11:56.920
+have only singular forms and plural forms. But some languages have zero forms. Some languages
+
+11:56.920 --> 12:03.720
+have two forms like pair forms. Some languages don't have a different form for anything.
+
+12:03.720 --> 12:09.920
+For example, I live in Japan. I work in Japanese. And in Japanese, you don't have a form. You
+
+12:09.920 --> 12:16.640
+don't have different inflections for words based on their number. So saying one whatever
+
+12:16.640 --> 12:23.400
+or two whatevers or an infinity of whatevers or even zero whatever, it's just the same
+
+12:23.400 --> 12:28.480
+form. So making assumption on the number of things and the way it's expressed in the language
+
+12:28.480 --> 12:34.640
+is usually, and that's something that we already know in free software. I mean, if you check
+
+12:34.640 --> 12:40.060
+the getex library, they've got everything sorted out. And that's something that was
+
+12:40.060 --> 12:46.880
+created in the 90s at Sun Microsystem. And then it was freed, et cetera. But when you
+
+12:46.880 --> 12:52.560
+see the work that it did at the time, you would kind of expect that people understand
+
+12:52.560 --> 12:58.920
+that. But no. And that's OK because developers develop and localizers localize. So we kind
+
+12:58.920 --> 13:04.820
+of split. But everything has been done already. So we just have to be aware of what's being
+
+13:04.820 --> 13:11.720
+done. And we have to be aware of the rules. And I think of one very good set of rules
+
+13:11.720 --> 13:19.880
+that's been online for a while. It's the Worldwide Consortium. They have a really good internationalization
+
+13:19.880 --> 13:26.640
+page where everything is pretty much black on white on paper, on the web at least. And
+
+13:26.640 --> 13:31.960
+if you read that, you can see exactly what should be done for localization, what should
+
+13:31.960 --> 13:35.880
+not be done, what should be avoided at all costs, et cetera, et cetera.
+
+13:35.880 --> 13:44.440
+So there are plenty of references here and there. And in terms of software localization,
+
+13:44.440 --> 13:49.980
+it's the same. If you check the getex page, you should be able to get an idea of what
+
+13:49.980 --> 13:59.240
+should be good. So is my project to localize all of Emacs? I wish it were. Eventually I'll
+
+13:59.240 --> 14:05.160
+be rich. Hopefully. I don't know. I'm working on that. It's not working well. But the day
+
+14:05.160 --> 14:11.540
+I can take just one year off totally and focus on that, I think that's something I would
+
+14:11.540 --> 14:18.760
+love to work on and just get up to speed with the process of programming all the things,
+
+14:18.760 --> 14:23.080
+checking all the things, and organizing the infrastructure. But seriously, I don't think
+
+14:23.080 --> 14:31.240
+that will ever happen because I'm a poor translator. And I still have, what, like 20 years to go
+
+14:31.240 --> 14:40.560
+before I can't work anymore. And we don't have savings or anything with the corona shit.
+
+14:40.560 --> 14:47.560
+So I don't think that's ever going to happen. But I would love to help. And yes, yes. How
+
+14:47.560 --> 14:53.480
+deep would useful localization go? Because the core of Emacs are duck strings and localization.
+
+14:53.480 --> 15:00.280
+Yes, yes, yes. I mean, all those discussions have been made. I mean, no conclusion reached.
+
+15:00.280 --> 15:07.880
+But we have addressed those things on the discussions. And so just, I mean, it's really
+
+15:07.880 --> 15:13.560
+pretentious to say, check my name on the Emacs table list because I've talked about that.
+
+15:13.560 --> 15:18.680
+It's really pretentious. But that's not what I'm saying. I mean, there has been a lot of
+
+15:18.680 --> 15:24.400
+discussion on the development list. So if you check for localization, translation, stuff
+
+15:24.400 --> 15:30.800
+like that, you'll see keywords, and you'll see the discussion. And people are aware of
+
+15:30.800 --> 15:36.440
+the issues. So I mean, we just need to have a framework for that.
+
+15:36.440 --> 15:40.120
+Thank you. Just to quickly chime in to say, I think we have about two more minutes of
+
+15:40.120 --> 15:45.800
+on stream Q&A. And then you're welcome to either stay here, Jean-Christophe, or continue
+
+15:45.800 --> 15:48.800
+taking questions on the pad on IRC.
+
+15:48.800 --> 15:57.120
+I think, well, I got to go to work. So I need to get ready. But I think, unless we have
+
+15:57.120 --> 16:08.760
+something on IRC, I think we're good. If you find something else that I've not addressed,
+
+16:08.760 --> 16:19.840
+I'm good. Otherwise, yes, yes, yeah, we need to take all the C code. But I mean, you can
+
+16:19.840 --> 16:29.160
+decide the level down to which you want to work. So you can go all the way to the C code.
+
+16:29.160 --> 16:32.920
+But actually, the C code is actually easier to extract because there is all these get
+
+16:32.920 --> 16:40.280
+text things that works on the C code already. So the issue is pretty much the Emacs Lisp
+
+16:40.280 --> 16:47.760
+code, as far as I can understand. So that would be the process that we need to address.
+
+16:47.760 --> 16:56.800
+Doc strings, indeed. But then the doc strings and the manual, they are very close. And actually,
+
+16:56.800 --> 17:03.560
+yeah, my estimate of the 500,000 word, I think it was based on doc strings. So yeah, we need
+
+17:03.560 --> 17:09.760
+to take all that. And that's an ongoing project that's not going to go away anyway. So we'll
+
+17:09.760 --> 17:12.760
+be here 10 years from now, I'm sure.
+
+17:12.760 --> 17:17.680
+OK, cool. And yeah, I think that's about all the time that we have on the stream. I guess
+
+17:17.680 --> 17:21.720
+if folks have further questions, they could maybe reach out to you later on IRC or via
+
+17:21.720 --> 17:22.720
+email.
+
+17:22.720 --> 17:29.640
+And I'll be back on the development list shortly, maybe six months from now. So yeah, I can
+
+17:29.640 --> 17:30.640
+take it from there.
+
+17:30.640 --> 17:31.640
+Sounds great.
+
+17:31.640 --> 17:32.640
+Thank you very much.
+
+17:32.640 --> 17:33.640
+Thank you very much.
+
+17:33.640 --> 17:34.640
+Yeah, thanks again for your great talk. Cheers.
+
+17:34.640 --> 17:35.640
+Cheers.
+
+17:35.640 --> 17:56.640
+OK, bye.
+
diff --git a/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.vtt b/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.vtt
new file mode 100644
index 00000000..a86af897
--- /dev/null
+++ b/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.vtt
@@ -0,0 +1,726 @@
+WEBVTT captioned by brandelune and bhavin192
+
+NOTE Introduction
+
+00:00.000 --> 00:00:05.400
+Hello everyone, I am Jean-Christophe Helary,
+
+00:00:05.400 --> 00:00:09.680
+I live in Japan, and I'm a translator.
+
+00:09.680 --> 00:00:12.633
+Here is my second presentation on this very
+
+00:00:12.633 --> 00:00:15.300
+prestigious stage that is the Emacs conference.
+
+00:00:15.300 --> 00:00:18.367
+Following my "Let's Translate the 2 million words
+
+00:00:18.367 --> 00:00:21.767
+in the Emacs manual" in 2021, my topic this year,
+
+00:00:21.767 --> 00:00:25.167
+always related to translation, is
+
+00:00:25.167 --> 00:00:28.400
+pre-localizing Emacs or much less pretentiously,
+
+00:00:28.400 --> 00:00:31.933
+"Just make sure that your strings don't mix up plurals".
+
+NOTE Usage of package.el
+
+00:00:31.933 --> 00:00:36.133
+So, for some reason I resumed Emacs use
+
+00:00:36.133 --> 00:00:39.940
+around 2016, and as I was rediscovering the thing
+
+00:00:39.940 --> 00:00:42.800
+I found really old outline-mode files here
+
+00:00:42.800 --> 00:00:44.033
+and there on my machine.
+
+00:00:44.033 --> 00:00:45.140
+And I started to experiment
+
+00:00:45.140 --> 00:00:47.167
+again and write again with Emacs.
+
+00:00:47.167 --> 00:00:48.564
+I think that at the time,
+
+00:00:48.564 --> 00:00:50.433
+I was coming from Aquamacs and because of
+
+00:00:50.433 --> 00:00:53.400
+an integration bug with macOS, I decided
+
+00:00:53.400 --> 00:00:55.440
+to check what was going on in the code.
+
+00:55.440 --> 00:00:59.040
+That was my first official contribution.
+
+NOTE The bug in strings
+
+00:59.040 --> 00:01:02.233
+So as I was happily installing and uninstalling
+
+00:01:02.233 --> 00:01:05.267
+things, I noticed something weird one day.
+
+00:01:05.267 --> 00:01:09.080
+Let me enlarge that picture.
+
+01:09.080 --> 00:01:12.400
+See? And even if I were not a translator,
+
+00:01:12.400 --> 00:01:14.960
+I would not like that string, and obviously
+
+01:14.960 --> 00:01:16.833
+the same bug bites you when the string
+
+00:01:16.833 --> 00:01:20.520
+tells you to erase the package.
+
+01:20.520 --> 00:01:26.720
+Boom, so we agree that we have a problem here.
+
+NOTE Natural language engineering
+
+01:26.720 --> 00:01:29.067
+So, I started to do some spelunking into the code,
+
+00:01:29.067 --> 00:01:31.067
+and at least that was my feeling
+
+00:01:31.067 --> 00:01:33.100
+because I really am not a programmer
+
+00:01:33.100 --> 00:01:37.240
+by any stretch of the imagination.
+
+01:37.240 --> 00:01:39.467
+And what I found was an amazing piece of
+
+00:01:39.467 --> 00:01:41.840
+natural language engineering that was mixing code
+
+01:41.840 --> 00:01:44.267
+with English suffixes and all that,
+
+00:01:44.267 --> 00:01:46.267
+and I could see that the people who had
+
+00:01:46.267 --> 00:01:47.767
+written that code were pretty smart,
+
+00:01:47.767 --> 00:01:49.533
+but had missed a number of edge cases
+
+00:01:49.533 --> 00:01:51.280
+that produced the above bugs.
+
+01:51.280 --> 00:01:53.500
+That was my first experience with
+
+00:01:53.500 --> 00:01:55.033
+all the message related functions,
+
+00:01:55.033 --> 00:01:58.360
+"format", "concat", "message", etc.
+
+01:58.360 --> 00:02:00.433
+But even with my beginner's eyes I could see that
+
+00:02:00.433 --> 00:02:03.040
+something was off because when you want
+
+02:03.040 --> 00:02:06.000
+to produce natural language strings you never ever
+
+00:02:06.000 --> 00:02:08.600
+should use "replace-regex-in-string" to
+
+02:08.600 --> 00:02:11.067
+add an "ing" or an "ed" suffix
+
+00:02:11.067 --> 00:02:12.980
+to change the mode of a sentence.
+
+02:12.980 --> 00:02:16.840
+But that's what I was seeing was happening.
+
+NOTE More than a missed plural
+
+02:16.840 --> 00:02:20.333
+So, what we had to deal with here
+
+00:02:20.333 --> 00:02:22.220
+was way more than just a missed plural.
+
+02:22.220 --> 00:02:24.000
+It was an attempt at engineering all
+
+00:02:24.000 --> 00:02:26.400
+the message strings destined to the user
+
+00:02:26.400 --> 00:02:28.567
+with the smart code that was making assumptions
+
+00:02:28.567 --> 00:02:30.067
+on the structure of words,
+
+00:02:30.067 --> 00:02:33.220
+and in the localization world that's a big no-no.
+
+02:33.220 --> 00:02:36.667
+I'm a translator, and such UI strings issues
+
+00:02:36.667 --> 00:02:38.433
+have been sorted out decades ago.
+
+00:02:38.433 --> 00:02:41.320
+So I was a bit shocked.
+
+NOTE The final patch
+
+02:41.320 --> 00:02:43.533
+The final patch took me about a year to write,
+
+00:02:43.533 --> 00:02:45.380
+because I'm slow, because I needed to verify
+
+02:45.380 --> 00:02:47.167
+and understand a lot, because there are
+
+00:02:47.167 --> 00:02:49.100
+plenty of rules and plenty of people who are
+
+00:02:49.100 --> 00:02:51.433
+explaining you very nicely what the rules are,
+
+00:02:51.433 --> 00:02:53.733
+because I have kids, and because the
+
+00:02:53.733 --> 00:02:55.600
+Emacs development list is such a cool place to be
+
+00:02:55.600 --> 00:02:58.560
+that you often forget why you're there sometimes.
+
+02:58.560 --> 00:03:01.800
+Anyway, for people who can't click on a video,
+
+00:03:01.800 --> 00:03:03.640
+and I can't either, here are the relevant
+
+03:03.640 --> 00:03:05.840
+parts with some short comments.
+
+03:05.840 --> 00:03:07.800
+I'll be talking with localization in mind,
+
+00:03:07.800 --> 00:03:09.640
+knowing full well that Emacs localization
+
+03:09.640 --> 00:03:12.800
+is not on the map at the moment.
+
+03:12.800 --> 00:03:14.167
+So first, there is this thing
+
+00:03:14.167 --> 00:03:15.520
+about "format" and "concat".
+
+03:15.520 --> 00:03:17.800
+And if I remember correctly,
+
+00:03:17.800 --> 00:03:20.300
+"format" is better for user-facing things,
+
+00:03:20.300 --> 00:03:25.160
+and "concat" is better for internal things.
+
+03:25.160 --> 00:03:26.800
+Here, there are two things.
+
+03:26.800 --> 00:03:28.800
+First, a rule that we have when we prepare
+
+00:03:28.800 --> 00:03:30.700
+strings that need to be localized is
+
+00:03:30.700 --> 00:03:33.333
+never ever make assumptions on the way
+
+00:03:33.333 --> 00:03:35.780
+numbers are expressed in the language.
+
+03:35.780 --> 00:03:37.067
+Here, the assumption is that
+
+00:03:37.067 --> 00:03:40.000
+we have either a singular or plural form,
+
+00:03:40.000 --> 00:03:42.040
+and that's not always the case.
+
+03:42.040 --> 00:03:44.067
+That usually means that you should externalize
+
+00:03:44.067 --> 00:03:48.280
+numbers and find a generic way to express them.
+
+03:48.280 --> 00:03:50.833
+So it makes for slightly less natural
+
+00:03:50.833 --> 00:03:54.400
+language strings, but it's better anyway.
+
+03:54.400 --> 00:03:56.667
+Then we have that comma there that's trying
+
+00:03:56.667 --> 00:03:58.167
+to be externalized and that's weird,
+
+00:03:58.167 --> 00:04:02.620
+so I put it back into the sentence.
+
+04:02.620 --> 00:04:04.967
+Here we have another construct, or two rather,
+
+00:04:04.967 --> 00:04:06.960
+that really should not be used like this.
+
+04:06.960 --> 00:04:10.033
+It's "prin1" that uses quoting characters,
+
+00:04:10.033 --> 00:04:12.480
+just like "print", and "princ" that does not.
+
+04:12.480 --> 00:04:15.400
+And you see why they were combined together.
+
+04:15.400 --> 00:04:17.133
+And they were both trying to be really smart
+
+00:04:17.133 --> 00:04:19.780
+about which article to put in front of a vowel.
+
+04:19.780 --> 00:04:20.960
+And you just don't do that.
+
+04:20.960 --> 00:04:25.000
+You just keep things simple.
+
+04:25.000 --> 00:04:26.633
+Here again, the code is trying to be smart,
+
+00:04:26.633 --> 00:04:28.480
+but it's really not much more efficient than
+
+04:28.480 --> 00:04:34.940
+plainly stating what you want.
+
+04:34.940 --> 00:04:36.500
+And here again, we have "concat" things
+
+00:04:36.500 --> 00:04:40.367
+that we could just use to plainly state
+
+00:04:40.367 --> 00:04:41.980
+what we want to state.
+
+04:41.980 --> 00:04:49.880
+So, instead of "concat" I just put a "message".
+
+04:49.880 --> 00:04:52.260
+And here we have something that's very cute.
+
+04:52.260 --> 00:04:54.540
+It's a computerized plural.
+
+04:54.540 --> 00:04:55.700
+Here again, assuming that
+
+00:04:55.700 --> 00:04:58.640
+there are only plural or singular forms.
+
+04:58.640 --> 00:05:00.867
+But the end string is not that much more natural
+
+00:05:00.867 --> 00:05:02.700
+than the fix, the code is less efficient
+
+00:05:02.700 --> 00:05:07.760
+and is harder to understand.
+
+05:07.760 --> 00:05:09.433
+Here again, the code is trying to make
+
+00:05:09.433 --> 00:05:13.520
+smart things where it could be much simpler.
+
+05:13.520 --> 00:05:14.667
+That is the part where you get the
+
+00:05:14.667 --> 00:05:19.480
+number of packages and their names.
+
+05:19.480 --> 00:05:22.067
+Here the whole sentence with the semicolons
+
+00:05:22.067 --> 00:05:26.333
+and the question mark is split in parts,
+
+00:05:26.333 --> 00:05:29.180
+between which something will be inserted.
+
+05:29.180 --> 00:05:34.240
+That's really ugly and difficult to read.
+
+05:34.240 --> 00:05:37.700
+Here again, another "ing" waiting to be
+
+00:05:37.700 --> 00:05:44.840
+regex-inserted into the code.
+
+05:44.840 --> 00:05:46.633
+And here at last, we get to the point
+
+00:05:46.633 --> 00:05:48.760
+where everything started.
+
+05:48.760 --> 00:05:50.833
+And you can see that unlike in the other spots,
+
+00:05:50.833 --> 00:05:52.400
+there is no possibility for the expression
+
+05:52.400 --> 00:05:54.680
+to be singular.
+
+05:54.680 --> 00:05:57.600
+So, I guess that if it hadn't been for that bug,
+
+00:05:57.600 --> 00:05:59.320
+I would not have found the other items,
+
+05:59.320 --> 00:06:01.033
+and we would be left with code that works,
+
+00:06:01.033 --> 00:06:02.033
+of course, but that is
+
+00:06:02.033 --> 00:06:06.020
+harder to understand, and maintain.
+
+06:06.020 --> 00:06:08.333
+Last but not least, a last version of
+
+00:06:08.333 --> 00:06:10.920
+"just plainly state what you mean to state".
+
+06:10.920 --> 00:06:14.880
+Keep it simple.
+
+NOTE "What did I learn, and how did I learn it?"
+
+06:14.880 --> 00:06:19.267
+So first, we have this wonderful CONTRIBUTE file
+
+00:06:19.267 --> 00:06:21.267
+that is very explicit about
+
+00:06:21.267 --> 00:06:23.520
+how we must proceed when contributing code.
+
+06:23.520 --> 00:06:25.233
+So, that's really the first place
+
+00:06:25.233 --> 00:06:27.760
+that we should all read.
+
+06:27.760 --> 00:06:29.333
+The README file is pretty cool too,
+
+00:06:29.333 --> 00:06:30.967
+especially at the beginning of the process,
+
+00:06:30.967 --> 00:06:31.867
+when you're not sure whether
+
+00:06:31.867 --> 00:06:36.240
+you want to fix that bug or just report it.
+
+NOTE Useful packages
+
+06:36.240 --> 00:06:37.920
+And then we've got packages.
+
+06:37.920 --> 00:06:39.900
+We've got a number of packages that are really
+
+00:06:39.900 --> 00:06:42.600
+helpful when it comes to reading
+
+00:06:42.600 --> 00:06:45.880
+the information and the manuals.
+
+06:45.880 --> 00:06:48.000
+I'm mentioning three of them here,
+
+00:06:48.000 --> 00:06:53.720
+and I think they are the most important for us.
+
+NOTE Package: helpful
+
+06:53.720 --> 00:06:55.600
+So "helpful" is on the right,
+
+00:06:55.600 --> 00:06:58.667
+and it's overflowing the window with
+
+00:06:58.667 --> 00:07:01.900
+all the contextualized information it provides,
+
+00:07:01.900 --> 00:07:05.280
+and the standard "help" is on the left.
+
+07:05.280 --> 00:07:07.933
+I mean, really there are like two or three
+
+00:07:07.933 --> 00:07:11.567
+screen-full of information in the "helpful" output,
+
+00:07:11.567 --> 00:07:13.233
+so you really only see a part,
+
+00:07:13.233 --> 00:07:16.320
+but I guess if you use it, you know what I'm saying.
+
+07:16.320 --> 00:07:18.867
+What I like the most here is the "view in manual"
+
+00:07:18.867 --> 00:07:21.800
+part, where you can actually click and even get
+
+00:07:21.800 --> 00:07:23.667
+more information that's sometimes
+
+00:07:23.667 --> 00:07:28.400
+easier to read and understand.
+
+NOTE Package: inform
+
+07:28.400 --> 00:07:33.640
+And then you've got the "info" versus "inform" formats.
+
+07:33.640 --> 00:07:34.567
+When you're in the manual,
+
+00:07:34.567 --> 00:07:37.140
+"inform" makes a huge difference.
+
+07:37.140 --> 00:07:39.367
+You can see here that you've got colorized items,
+
+00:07:39.367 --> 00:07:42.000
+and also in the middle you've got that
+
+07:42.000 --> 00:07:45.000
+'read' part that's green and bold.
+
+07:45.000 --> 00:07:49.333
+In "info" it's not a specific object,
+
+00:07:49.333 --> 00:07:52.200
+it's just a string. In 'inform' it's actually
+
+00:07:52.200 --> 00:07:53.800
+a link that you can click,
+
+00:07:53.800 --> 00:07:58.320
+and actually go to that 'read' manual page.
+
+NOTE Package: which-key
+
+07:58.320 --> 00:08:01.300
+Now, we've got "which-key".
+
+08:01.300 --> 00:08:03.400
+"which-key" is a savior for beginners too.
+
+08:03.400 --> 00:08:04.867
+Just wait half a second or something,
+
+00:08:04.867 --> 00:08:06.500
+and Emacs will show you all the keys
+
+00:08:06.500 --> 00:08:08.433
+that you can access from the prefix combination
+
+00:08:08.433 --> 00:08:09.920
+that you just typed.
+
+08:09.920 --> 00:08:13.200
+So, it's really helpful for discovering functions
+
+00:08:13.200 --> 00:08:19.160
+and learning new functions, getting used to them.
+
+NOTE It all started with this message…
+
+08:19.160 --> 00:08:21.500
+And so that whole process started…,
+
+00:08:21.500 --> 00:08:26.533
+it was May 23, 2017,
+
+00:08:26.533 --> 00:08:30.440
+with that thread when I found the bug.
+
+08:30.440 --> 00:08:32.800
+I just bumped into an English/code bug
+
+00:08:32.800 --> 00:08:36.920
+this morning. In package.el, when one package
+
+08:36.920 --> 00:08:39.033
+is not needed anymore, the message is:
+
+00:08:39.033 --> 00:08:41.300
+"Package menu: Operation finished.
+
+00:08:41.300 --> 00:08:44.880
+1 packages are no longer needed", etc.
+
+08:44.880 --> 00:08:49.633
+So, I was asking whether we had best practices
+
+00:08:49.633 --> 00:08:53.800
+for using messages, and we had a whole thread
+
+08:53.800 --> 00:08:57.867
+about that. And while I was discussing on that
+
+00:08:57.867 --> 00:09:01.240
+thread, I started that new thread, which is:
+
+09:01.240 --> 00:09:02.867
+"package.el strings".
+
+00:09:02.867 --> 00:09:09.900
+The whole thing actually ended on June 27, 2018.
+
+00:09:09.900 --> 00:09:15.400
+So, a year after, with that message from Noam
+
+00:09:15.400 --> 00:09:18.567
+telling me that "Yes I can close the bug,"
+
+00:09:18.567 --> 00:09:22.040
+and that was it.
+
+09:22.040 --> 00:09:24.000
+So, it took about a year to finish that.
+
+00:09:24.000 --> 00:09:28.133
+What I did learn basically is that
+
+00:09:28.133 --> 00:09:32.160
+helping with Emacs is not that difficult.
+
+09:32.160 --> 00:09:36.100
+It takes time when you're not fluent with the code,
+
+00:09:36.100 --> 00:09:37.100
+but that's okay because the reference
+
+09:37.100 --> 00:09:39.300
+is excellent, and there are lots of people
+
+00:09:39.300 --> 00:09:41.520
+who are here to help.
+
+NOTE Conclusion
+
+09:41.520 --> 00:09:45.700
+Basically, the solution to all our problems is
+
+00:09:45.700 --> 00:09:47.733
+"Keep It Simple and Straightforward".
+
+00:09:47.733 --> 00:09:51.033
+As you can see in that patch,
+
+00:09:51.033 --> 00:09:53.233
+even if it's a beginner's patch,
+
+00:09:53.233 --> 00:09:57.733
+what I did shows what can be done by Emacs Lisp
+
+00:09:57.733 --> 00:09:59.533
+beginners to help with "straightening" the strings
+
+00:09:59.533 --> 00:10:02.267
+to reduce the number of potential English bugs.
+
+00:10:02.267 --> 00:10:04.533
+And then to make Emacs strings easier
+
+00:10:04.533 --> 00:10:07.233
+to be handled by real localization processes one day.
+
+00:10:07.233 --> 00:10:09.067
+But it doesn't have to be about strings
+
+00:10:09.067 --> 00:10:12.767
+because strings can be an easy entry point to Emacs,
+
+00:10:12.767 --> 00:10:16.720
+but it can be any itch that you want to scratch.
+
+10:16.720 --> 00:10:18.267
+And my real conclusion is that
+
+00:10:18.267 --> 00:10:22.160
+Emacs is free software, and what that means is mostly
+
+10:22.160 --> 00:10:24.067
+that it allows you to do things that you would
+
+00:10:24.067 --> 00:10:27.920
+never have thought of being able to do before.
+
+10:27.920 --> 00:10:32.000
+That's really the biggest lesson to be learned here.
+
+10:32.000 --> 00:10:33.400
+So, I want to thank all the people
+
+00:10:33.400 --> 00:10:37.920
+who allowed this to be happening, allowed me to
+
+10:37.920 --> 00:10:41.267
+learn a bit and contribute a bit to that wonderful
+
+00:10:41.267 --> 00:10:42.800
+piece of software that Emacs is.
+
+00:10:42.800 --> 00:10:44.533
+And thank you everyone for listening,
+
+00:10:44.533 --> 00:10:46.700
+and hopefully I'll see you next year
+
+00:10:46.700 --> 00:10:51.520
+with a different translation related presentation.
+
+10:51.520 --> 11:13.640
+Thank you very much.
diff --git a/2022/captions/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.vtt b/2022/captions/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.vtt
new file mode 100644
index 00000000..622d0b40
--- /dev/null
+++ b/2022/captions/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.vtt
@@ -0,0 +1,1002 @@
+WEBVTT captioned by matthew
+
+NOTE Opening
+
+00:00:00.000 --> 00:00:04.639
+Good morning folks, I'm Matthew.
+
+00:00:04.640 --> 00:00:07.399
+Welcome to another year of EmacsConf.
+
+00:00:07.400 --> 00:00:10.319
+It's looking fantastic this year.
+
+00:00:10.320 --> 00:00:13.559
+Firstly, I have to apologize for my voice
+
+00:00:13.560 --> 00:00:15.879
+and occasional cough today.
+
+00:00:15.880 --> 00:00:18.039
+I am currently recovering from a cold,
+
+00:00:18.040 --> 00:00:21.159
+hopefully it's not Covid or flu,
+
+00:00:21.160 --> 00:00:24.719
+so please bear with me today.
+
+00:00:24.720 --> 00:00:27.919
+Actually, this talk was supposed to be brought to you
+
+00:00:27.920 --> 00:00:31.559
+by Manatee Lazycat, the author of lsp-bridge.
+
+00:00:31.560 --> 00:00:36.079
+But verbal English isn't Lazycat's strongest skill,
+
+00:00:36.080 --> 00:00:38.599
+and we are good friends as we maintain
+
+00:00:38.600 --> 00:00:40.999
+the Emacs Application Framework together,
+
+00:00:41.000 --> 00:00:45.999
+so here I am today presenting to you this package.
+
+00:00:46.000 --> 00:00:48.479
+Welcome to my talk on lsp-bridge:
+
+00:00:48.480 --> 00:00:50.320
+a smooth-as-butter asynchronous LSP client.
+
+NOTE What is LSP?
+
+00:00:50.321 --> 00:00:57.200
+What is LSP?
+
+00:00:57.201 --> 00:01:01.159
+The first question is, what is LSP?
+
+00:01:01.160 --> 00:01:03.199
+For anyone who doesn't know here,
+
+00:01:03.200 --> 00:01:06.799
+LSP stands for Language Server Protocol,
+
+00:01:06.800 --> 00:01:09.719
+it is a set of protocols defined by Microsoft
+
+00:01:09.720 --> 00:01:13.399
+that provides smart features like autocomplete,
+
+00:01:13.400 --> 00:01:17.599
+go to definition, documentation, etc.,
+
+00:01:17.600 --> 00:01:23.439
+that can be implemented across different editors and IDEs.
+
+00:01:23.440 --> 00:01:25.559
+It was initially created
+
+00:01:25.560 --> 00:01:28.399
+for their Visual Studio Code product,
+
+00:01:28.400 --> 00:01:33.919
+then publically shared with everyone.
+
+00:01:33.920 --> 00:01:35.999
+So there are language servers out there
+
+00:01:36.000 --> 00:01:38.119
+that implemented this procotol,
+
+00:01:38.120 --> 00:01:41.239
+and editors need to implement the same procotols
+
+00:01:41.240 --> 00:01:43.119
+to talk to the language servers
+
+00:01:43.120 --> 00:01:46.799
+in order to retrieve necessary information.
+
+00:01:46.800 --> 00:01:53.159
+Emacs has 2 LSP clients already, the lsp-mode and eglot,
+
+00:01:53.160 --> 00:01:57.319
+both implemented the protocols and both are very good.
+
+NOTE Why another LSP client?
+
+00:02:00.440 --> 00:02:03.199
+Now comes to the second question, of course,
+
+00:02:03.200 --> 00:02:09.519
+given lsp-mode and eglot, why another LSP client?
+
+00:02:09.520 --> 00:02:12.359
+I used to use lsp-mode all the time,
+
+00:02:12.360 --> 00:02:15.999
+I have to say I really appreciate Ivan Yonchovski
+
+00:02:16.000 --> 00:02:20.159
+and the team's efforts. Also, I'd like to congratuate eglot
+
+00:02:20.160 --> 00:02:27.439
+for making into Emacs 29! These are fantastic packages,
+
+00:02:27.440 --> 00:02:30.999
+they are very mature and robust.
+
+NOTE
+
+00:02:31.000 --> 00:02:31.000
+However, with all due respect, both of the implementation
+
+00:02:35.120 --> 00:02:36.719
+are fundamentally limited
+
+00:02:36.720 --> 00:02:39.639
+by the single-threaded nature of Emacs,
+
+00:02:39.640 --> 00:02:43.639
+it is neither the fault of lsp-mode nor eglot.
+
+NOTE
+
+00:02:46.000 --> 00:02:47.959
+Although in recent years there have been
+
+00:02:47.960 --> 00:02:51.799
+improvements to Emacs core such as native JSON support,
+
+00:02:51.800 --> 00:02:55.319
+there are still scenarios where Emacs clog
+
+00:02:55.320 --> 00:02:59.359
+for a brief second when processing large amounts of data,
+
+00:02:59.360 --> 00:03:03.399
+as Emacs is processing everything in the single thread.
+
+00:03:03.400 --> 00:03:08.439
+This problem is especially apparent in some LSP servers
+
+00:03:08.440 --> 00:03:11.839
+that feeds in tens of thousands of JSON data
+
+00:03:11.840 --> 00:03:15.199
+with every single key press.
+
+NOTE
+
+00:03:15.200 --> 00:03:17.559
+Additionally, the large amount of data
+
+00:03:17.560 --> 00:03:21.279
+sent by the LSP server, such as the completion candidates,
+
+00:03:21.280 --> 00:03:23.959
+the diagnostics and documentation,
+
+00:03:23.960 --> 00:03:27.359
+they are temporarily stored in the Emacs memory,
+
+00:03:27.360 --> 00:03:31.159
+which will trigger garbage collection very frequently,
+
+00:03:31.160 --> 00:03:34.159
+this also causes stuttering user experience.
+
+00:03:34.160 --> 00:03:37.279
+Increasing the gc-cons-threshold helps,
+
+00:03:37.280 --> 00:03:43.759
+but doesn't eliminate the problem.
+
+NOTE
+
+00:03:43.760 --> 00:03:45.559
+For something like the LSP,
+
+00:03:45.560 --> 00:03:48.319
+the language servers need time to compute,
+
+00:03:48.320 --> 00:03:52.359
+and Emacs needs capacity to process and filter
+
+00:03:52.360 --> 00:03:55.799
+all the data coming from the language servers.
+
+00:03:55.800 --> 00:03:59.399
+A large codebase project with a slow language server
+
+00:03:59.400 --> 00:04:02.439
+that sends tens of thousands of JSON
+
+00:04:02.440 --> 00:04:06.519
+will significantly increase the time needed to process it,
+
+00:04:06.520 --> 00:04:08.079
+when we don't have a multi-thread,
+
+00:04:08.080 --> 00:04:12.719
+the single thread originally allocated for perhaps,
+
+00:04:12.720 --> 00:04:17.279
+handling user input will be used to process all the data,
+
+00:04:17.280 --> 00:04:22.719
+and don't even talk about the garbage collection along the way.
+
+NOTE
+
+00:04:22.720 --> 00:04:26.239
+The unfortunate truth is that the size of the codebase
+
+00:04:26.240 --> 00:04:28.919
+and the efficiency of the language server
+
+00:04:28.920 --> 00:04:31.759
+is completely out of Emacs' control,
+
+00:04:31.760 --> 00:04:38.519
+it is also out of both the lsp-mode and eglot's control.
+
+NOTE
+
+00:04:38.520 --> 00:04:40.279
+If there's an LSP client
+
+00:04:40.280 --> 00:04:42.279
+that can completely eliminate stuttering
+
+00:04:42.280 --> 00:04:44.999
+and provide a seamless feedback,
+
+00:04:45.000 --> 00:04:50.279
+that would be great, isn't it?
+
+NOTE What is seamless input feedback?
+
+00:04:50.280 --> 00:04:53.839
+However, we're vaguely talking about speed right now,
+
+00:04:53.840 --> 00:04:56.399
+what is considered fast?
+
+00:04:56.400 --> 00:04:58.359
+What is considered seamless?
+
+00:04:58.360 --> 00:05:01.479
+What we really mean when we say
+
+00:05:01.480 --> 00:05:05.239
+the current LSP implementation is slow?
+
+00:05:05.240 --> 00:05:12.559
+Let's first look at the problem fundamentally.
+
+NOTE
+
+00:05:12.560 --> 00:05:17.679
+We interact with Emacs through a keyboard,
+
+00:05:17.680 --> 00:05:22.719
+so what we perceive as a fast and smooth feedback
+
+00:05:22.720 --> 00:05:25.999
+completely depends on how long it takes
+
+00:05:26.000 --> 00:05:29.359
+for a keyboard input to display on the Emacs buffer.
+
+00:05:29.360 --> 00:05:32.919
+From a pure graphical perspective,
+
+00:05:32.920 --> 00:05:36.519
+we need a minimum of 24 frames per second,
+
+00:05:36.520 --> 00:05:39.079
+the standard in the media industry,
+
+00:05:39.080 --> 00:05:42.359
+for us humans to perceive something as seamless.
+
+00:05:42.360 --> 00:05:46.999
+Say we need 25 frames per second, this means,
+
+00:05:47.000 --> 00:05:50.399
+if we divide 1000 milliseconds by 25,
+
+00:05:50.400 --> 00:05:54.759
+we only have approximately 40 millisecond window
+
+00:05:54.760 --> 00:05:57.919
+for the response time to spare.
+
+00:05:57.920 --> 00:06:01.679
+Even if we relax the constraint a bit more,
+
+00:06:01.680 --> 00:06:06.679
+on average a typist takes about 100 to 200 milliseconds
+
+00:06:06.680 --> 00:06:09.159
+between typing each character,
+
+00:06:09.160 --> 00:06:12.599
+so as long as we see a response within this timeframe,
+
+00:06:12.600 --> 00:06:19.559
+it is tolerable. However, using a slow language server
+
+00:06:19.560 --> 00:06:22.279
+on a large codebase easily exceeds
+
+00:06:22.280 --> 00:06:24.679
+the hundred millisecond mark,
+
+00:06:24.680 --> 00:06:27.479
+and sometimes takes more than 200 milliseconds,
+
+00:06:27.480 --> 00:06:32.039
+and inevitably will cause an inconsistent delay
+
+00:06:32.040 --> 00:06:33.199
+for the end user.
+
+NOTE
+
+00:06:33.200 --> 00:06:37.959
+At this point, someone might want to point out
+
+00:06:37.960 --> 00:06:41.079
+that nobody is gonna type at the maximum pace all the time.
+
+00:06:41.080 --> 00:06:45.039
+That's right, frankly speaking most of my time
+
+00:06:45.040 --> 00:06:47.639
+spent at programming is not writing code,
+
+00:06:47.640 --> 00:06:49.039
+but staring at the screen
+
+00:06:49.040 --> 00:06:51.279
+thinking about how to write the code.
+
+00:06:51.280 --> 00:06:55.599
+However, when we do actually type,
+
+00:06:55.600 --> 00:07:00.359
+maybe only a sentence, a variable name, a keyword,
+
+00:07:00.360 --> 00:07:03.039
+or just performing keybinding shortcuts,
+
+00:07:03.040 --> 00:07:08.479
+that's when we want to see our input feedback immediately.
+
+00:07:08.480 --> 00:07:10.479
+We've already spend so much time
+
+00:07:10.480 --> 00:07:12.159
+thinking about how to write,
+
+00:07:12.160 --> 00:07:16.479
+we don't want to waste any more time waiting for Emacs
+
+00:07:16.480 --> 00:07:19.559
+to process and show us what we've written
+
+00:07:19.560 --> 00:07:27.679
+half a second ago. Otherwise the frustration will build up.
+
+NOTE EAF showed a possibility
+
+00:07:28.400 --> 00:07:31.999
+In the past two years of EmacsConf, I've talked about
+
+00:07:32.000 --> 00:07:35.399
+the Emacs Application Framework, a project that extended
+
+00:07:35.400 --> 00:07:39.839
+Emacs Lisp to Python, Qt and JavaScript ecosystems.
+
+00:07:39.840 --> 00:07:43.759
+The EAF project specializes in improving
+
+00:07:43.760 --> 00:07:47.439
+the graphical and multimedia capabilities of Emacs
+
+00:07:47.440 --> 00:07:51.759
+through other languages, it was a great success.
+
+00:07:51.760 --> 00:07:55.759
+It demonstrated the endless possibilities of Emacs
+
+00:07:55.760 --> 00:08:00.159
+by embracing the strengths in other ecosystems.
+
+00:08:00.160 --> 00:08:04.239
+If anyone is interested for more information on EAF,
+
+00:08:04.240 --> 00:08:08.519
+please see the EAF repo and refer to my talks
+
+00:08:08.520 --> 00:08:12.959
+from EmacsConf2020 and 2021.
+
+00:08:12.960 --> 00:08:12.960
+
+
+00:08:12.960 --> 00:08:16.239
+The EAF project was created by Manatee Lazycat as well,
+
+00:08:16.240 --> 00:08:19.999
+so he thought if there is a way to design
+
+00:08:20.000 --> 00:08:22.759
+an LSP client similar to EAF
+
+00:08:22.760 --> 00:08:25.759
+that takes the advantage of Python's multi-threading,
+
+00:08:25.760 --> 00:08:27.839
+it will be able to solve our problem.
+
+00:08:27.840 --> 00:08:32.399
+Conveniently EAF had already done most of the ground work
+
+00:08:32.400 --> 00:08:34.359
+and demonstrated the possibility
+
+00:08:34.360 --> 00:08:42.159
+of cooperating Elisp and Python using the Emacs RPC effectively.
+
+NOTE LSP Bridge Objectives
+
+00:08:42.160 --> 00:08:45.039
+LSP Bridge has several goals in mind.
+
+00:08:45.040 --> 00:08:50.159
+Firstly, performance is the number one priority.
+
+00:08:50.160 --> 00:08:55.839
+Secondly, use Python multi-threading to bypass
+
+00:08:55.840 --> 00:08:59.239
+the aforementioned bottlenecks of a single-threaded Emacs.
+
+00:08:59.240 --> 00:09:04.519
+Thirdly, provide a simple solution that requires
+
+00:09:04.520 --> 00:09:07.519
+minimal setup for someone who just wants to have
+
+00:09:07.520 --> 00:09:10.079
+a fast autocomplete system in Emacs.
+
+00:09:10.080 --> 00:09:15.999
+This means, LSP Bridge does not intend
+
+00:09:16.000 --> 00:09:21.439
+and will not implement the entire LSP protocol,
+
+00:09:21.440 --> 00:09:23.639
+which is a vastly different approach
+
+00:09:23.640 --> 00:09:25.759
+than a solution like lsp-mode,
+
+00:09:25.760 --> 00:09:28.479
+we do not want to compete this way.
+
+00:09:28.480 --> 00:09:33.559
+We also believe some of the LSP Protocol features
+
+00:09:33.560 --> 00:09:37.759
+are unnecessary, or we already have better solutions
+
+00:09:37.760 --> 00:09:38.959
+in the Emacs ecosystem,
+
+00:09:38.960 --> 00:09:42.679
+such as tree-sitter for syntax highlighting.
+
+00:09:42.680 --> 00:09:44.959
+So we will not reinvent the wheel.
+
+00:09:44.960 --> 00:09:50.279
+Ultimately, we want to provide the fastest, butter-smooth
+
+00:09:50.280 --> 00:09:53.679
+and performant LSP client out of the box.
+
+NOTE Design.
+
+00:09:53.680 --> 00:09:54.560
+Design.
+
+00:09:54.561 --> 00:10:01.239
+Now let's look at the design architecture diagram.
+
+00:10:01.240 --> 00:10:04.639
+As you can see, it is split into
+
+00:10:04.640 --> 00:10:07.079
+the top half and bottom half.
+
+00:10:07.080 --> 00:10:10.559
+The top is the design for a single file model,
+
+00:10:10.560 --> 00:10:13.359
+and the bottom half is for project model.
+
+00:10:13.360 --> 00:10:18.159
+We make this distinction because we don't want a new user
+
+00:10:18.160 --> 00:10:22.599
+to be troubled on choosing a project root directory
+
+00:10:22.600 --> 00:10:25.199
+as the first impression to LSP
+
+00:10:25.200 --> 00:10:27.279
+before even start writing code.
+
+00:10:27.280 --> 00:10:27.280
+
+
+00:10:27.280 --> 00:10:30.479
+From a new user's perspective,
+
+00:10:30.480 --> 00:10:32.959
+they've just installed this package,
+
+00:10:32.960 --> 00:10:35.159
+and all they are expecting
+
+00:10:35.160 --> 00:10:37.679
+is using a smart autocomplete system,
+
+00:10:37.680 --> 00:10:41.519
+what does root directory even mean in this context?
+
+00:10:41.520 --> 00:10:44.119
+So we make the decision for them
+
+00:10:44.120 --> 00:10:48.199
+based on whether this file is part of a git repository.
+
+00:10:48.200 --> 00:10:56.719
+Often times we write code in its own standalone file,
+
+00:10:56.720 --> 00:10:59.919
+this is extremely common for scripting languages
+
+00:10:59.920 --> 00:11:03.319
+like bash or python. So in the single file model,
+
+00:11:03.320 --> 00:11:07.159
+LSP Bridge will start a dedicated LSP server
+
+00:11:07.160 --> 00:11:10.319
+for this particular file based on file type,
+
+00:11:10.320 --> 00:11:13.479
+and every file corresponds to a LSP server,
+
+00:11:13.480 --> 00:11:17.839
+so each server doesn't interfere with one another.
+
+00:11:17.840 --> 00:11:23.719
+The project model will have every file of the same type
+
+00:11:23.720 --> 00:11:25.919
+under the same project share one server.
+
+00:11:25.920 --> 00:11:30.439
+We believe this is a positive trade-off for user experience.
+
+00:11:30.440 --> 00:11:30.440
+
+
+00:11:30.440 --> 00:11:36.599
+LSP Bridge internally implemented two main threads,
+
+00:11:36.600 --> 00:11:40.399
+one is the Request Thread, the other is Response Thread.
+
+00:11:40.400 --> 00:11:45.279
+The Request Thread is used to handle all the requests
+
+00:11:45.280 --> 00:11:48.679
+coming from Emacs, it does not answer immediately,
+
+00:11:48.680 --> 00:11:52.839
+this is important because Emacs doesn't need to wait
+
+00:11:52.840 --> 00:11:54.679
+for any response under any reason,
+
+00:11:54.680 --> 00:11:58.159
+even if the server is buggy or died out,
+
+00:11:58.160 --> 00:12:01.159
+it shouldn't matter to the performance of Emacs.
+
+00:12:01.160 --> 00:12:04.039
+The Response Thread is used to handle
+
+00:12:04.040 --> 00:12:06.559
+the response coming from LSP servers.
+
+00:12:06.560 --> 00:12:11.239
+After retrieving a response, regardless of the JSON size,
+
+00:12:11.240 --> 00:12:14.439
+it sends to its own thread for computation,
+
+00:12:14.440 --> 00:12:17.079
+such as candidate filtering and renaming.
+
+00:12:17.080 --> 00:12:19.999
+Once the computation is finished,
+
+00:12:20.000 --> 00:12:23.639
+it will determine if this information is expired,
+
+00:12:23.640 --> 00:12:26.399
+if not, then push it to Emacs.
+
+00:12:26.400 --> 00:12:26.400
+
+
+00:12:26.400 --> 00:12:31.559
+From the Emacs side, when it receives the LSP information,
+
+00:12:31.560 --> 00:12:34.639
+it only needs to determine the course of action,
+
+00:12:34.640 --> 00:12:39.159
+either popup completion, jump to definition,
+
+00:12:39.160 --> 00:12:44.799
+renaming action, or show references and show documentions.
+
+00:12:44.800 --> 00:12:49.119
+You see, from a user, all LSP Bridge doing
+
+00:12:49.120 --> 00:12:52.279
+is these 5 things, the user doesn't need to care about
+
+00:12:52.280 --> 00:12:54.559
+anything else like the complicated
+
+00:12:54.560 --> 00:12:56.479
+Language Server Protocols.
+
+00:12:56.480 --> 00:12:56.480
+
+
+00:12:56.480 --> 00:13:02.439
+Python side caches heavy data
+
+00:13:02.440 --> 00:13:06.279
+such as candidate documentation and diagnostics.
+
+00:13:06.280 --> 00:13:11.079
+We process as much server data as possible in Python,
+
+00:13:11.080 --> 00:13:15.759
+and only pass to Emacs as little data as possible
+
+00:13:15.760 --> 00:13:18.159
+so it doesn't clog the Emacs thread
+
+00:13:18.160 --> 00:13:19.799
+and triggers garbage collection.
+
+00:13:19.800 --> 00:13:19.800
+
+
+00:13:19.800 --> 00:13:24.319
+This design is critical, because all Emacs needs to do
+
+00:13:24.320 --> 00:13:27.039
+is sending LSP requests to LSP Bridge,
+
+00:13:27.040 --> 00:13:29.439
+it doesn't wait for a response,
+
+00:13:29.440 --> 00:13:32.999
+it simply knows what to do *when* there is a response.
+
+00:13:33.000 --> 00:13:37.159
+So the user's input immediately displays on the buffer
+
+00:13:37.160 --> 00:13:39.559
+well within the 40 millisecond window,
+
+00:13:39.560 --> 00:13:45.199
+and in the mean time, the user can continue to type
+
+00:13:45.200 --> 00:13:48.199
+if he doesn't need the help from LSP right away,
+
+00:13:48.200 --> 00:13:51.279
+it fundamentally resolves the stuttering problem.
+
+NOTE ACM - Asynchronous Completion Menu
+
+00:13:51.280 --> 00:13:59.079
+Now I want to talk about acm-mode,
+
+00:13:59.080 --> 00:14:09.599
+which stands for asynchronous completion menu,
+
+00:14:09.600 --> 00:14:12.479
+it is a completion framework
+
+00:14:12.480 --> 00:14:15.039
+that currently bundled with LSP Bridge
+
+00:14:15.040 --> 00:14:17.279
+designed to accomodate for
+
+00:14:17.280 --> 00:14:20.399
+the asynchronous nature of LSP servers.
+
+00:14:20.400 --> 00:14:26.919
+It is a replacement for the built-in capf,
+
+00:14:26.920 --> 00:14:30.359
+short for completion-at-point-functions,
+
+00:14:30.360 --> 00:14:32.519
+used in almost everywhere
+
+00:14:32.520 --> 00:14:35.759
+including company-mode and corfu-mode.
+
+00:14:35.760 --> 00:14:40.839
+Yes, we unfortunately reinvented a very fundamental wheel.
+
+00:14:40.840 --> 00:14:44.279
+No, it wasn't an easy decision.
+
+00:14:44.280 --> 00:14:47.879
+However we still believe it's worth it.
+
+00:14:47.880 --> 00:14:53.359
+LSP Bridge initially used company-mode,
+
+00:14:53.360 --> 00:14:56.119
+then moved on to corfu-mode for a while,
+
+00:14:56.120 --> 00:14:58.999
+but eventually Lazycat determined
+
+00:14:59.000 --> 00:15:00.719
+that it is much more painful to write
+
+00:15:00.720 --> 00:15:05.679
+a lot of workaround code to force LSP Bridge
+
+00:15:05.680 --> 00:15:09.959
+to handle capf nicely than to just fork Corfu,
+
+00:15:09.960 --> 00:15:11.999
+remove all the capf code,
+
+00:15:12.000 --> 00:15:15.239
+and write a new completion framework from the remainings.
+
+00:15:15.240 --> 00:15:15.240
+
+
+00:15:15.240 --> 00:15:20.719
+Performance wise, capf requires Emacs to store
+
+00:15:20.720 --> 00:15:23.119
+the entire candidate list
+
+00:15:23.120 --> 00:15:27.159
+when looking up candidate annotations.
+
+00:15:27.160 --> 00:15:30.639
+It needs to search through the entire candidate list first,
+
+00:15:30.640 --> 00:15:32.599
+then use the candidate as a key
+
+00:15:32.600 --> 00:15:34.799
+to search for the actual information.
+
+00:15:34.800 --> 00:15:38.919
+This entire process will be repeated every time
+
+00:15:38.920 --> 00:15:40.679
+when drawing the completion menu.
+
+00:15:40.680 --> 00:15:45.199
+This is truly intensive computing task for Emacs to handle.
+
+00:15:45.200 --> 00:15:50.519
+On top of that, the existing capf frameworks assume
+
+00:15:50.520 --> 00:15:54.279
+the candidate list, which is retrieved from the LSP server,
+
+00:15:54.280 --> 00:15:56.839
+to be ready and finalized in place
+
+00:15:56.840 --> 00:15:58.719
+when the completion popup occurred.
+
+00:15:58.720 --> 00:16:02.119
+However given the design of LSP Bridge,
+
+00:16:02.120 --> 00:16:05.919
+Emacs will not sit there and wait for the server response,
+
+00:16:05.920 --> 00:16:10.439
+instead the Response Thread may feed Emacs data
+
+00:16:10.440 --> 00:16:14.919
+whenever it's ready. This makes capf almost impossible
+
+00:16:14.920 --> 00:16:21.919
+to form a finalized candidate list during popup.
+
+00:16:21.920 --> 00:16:21.920
+
+
+00:16:21.920 --> 00:16:26.079
+The complete reasons regarding why capf is incompatible
+
+00:16:26.080 --> 00:16:28.679
+with the asynchronous nature of LSP servers
+
+00:16:28.680 --> 00:16:32.479
+are very complicated and deserves its own talk.
+
+00:16:32.480 --> 00:16:37.079
+Lazycat wrote an entire blog post detailing his reasonings,
+
+00:16:37.080 --> 00:16:40.999
+while Corfu's author Daniel Mendler a.k.a minad
+
+00:16:41.000 --> 00:16:44.239
+also done his own investigations and experiments,
+
+00:16:44.240 --> 00:16:47.239
+and reached a common conclusion.
+
+00:16:47.240 --> 00:16:50.919
+For anyone interested, I've pasted the links
+
+00:16:50.920 --> 00:16:52.759
+to the corresponding posts here.
+
+00:16:52.760 --> 00:16:57.399
+Therefore, keep in mind that LSP Bridge
+
+00:16:57.400 --> 00:16:59.919
+can only use acm-mode to work nicely,
+
+00:16:59.920 --> 00:17:03.359
+so please disable other completion frameworks
+
+00:17:03.360 --> 00:17:07.159
+like company and corfu before trying LSP Bridge.
+
+NOTE LSP Bridge + ACM -> Multi-Backend Completion Framework
+
+00:17:07.160 --> 00:17:14.919
+By designing ACM with asynchronous server response in mind,
+
+00:17:14.920 --> 00:17:18.759
+this unlocks LSP Bridge project's potential
+
+00:17:18.760 --> 00:17:22.199
+to provide completions from almost any backends.
+
+00:17:22.200 --> 00:17:25.679
+ACM has blended all the backends together,
+
+00:17:25.680 --> 00:17:28.799
+and configured a priority to display
+
+00:17:28.800 --> 00:17:32.839
+important completion results like LSP before other backends.
+
+00:17:32.840 --> 00:17:38.559
+It can autocomplete LSP, TabNine, Elisp symbols, yasnippets,
+
+00:17:38.560 --> 00:17:41.039
+even English dictionaries and much more.
+
+00:17:41.040 --> 00:17:43.959
+As long as you have the backends installed,
+
+00:17:43.960 --> 00:17:46.319
+they all work out-of-the-box!
+
+NOTE Today and future. Join us!
+
+00:17:46.320 --> 00:17:55.239
+Although LSP Bridge is a relatively new package
+
+00:17:55.240 --> 00:18:00.039
+with just over 7 months old, it is already a success!
+
+00:18:00.040 --> 00:18:06.599
+As of December of 2022, we have 67 contributors
+
+00:18:06.600 --> 00:18:08.439
+making more than 1000 commits,
+
+00:18:08.440 --> 00:18:12.679
+and we reached more than 600 stars on Github!
+
+00:18:12.680 --> 00:18:16.359
+LSP Bridge is easily extensible,
+
+00:18:16.360 --> 00:18:18.879
+developing a new language backend is very simple too,
+
+00:18:18.880 --> 00:18:20.639
+feel free to join us!
+
+00:18:20.640 --> 00:18:25.599
+LSP Bridge is another successful example
+
+00:18:25.600 --> 00:18:29.919
+of extending Emacs Lisp with Python, and just like EAF,
+
+00:18:29.920 --> 00:18:33.639
+it demonstrated the potential Emacs can achieve
+
+00:18:33.640 --> 00:18:37.039
+when we jump out of the Lisp-only world
+
+00:18:37.040 --> 00:18:39.199
+and embrace other ecosystems.
+
+00:18:39.200 --> 00:18:43.479
+Recently Lazycat created a package called blink-search
+
+00:18:43.480 --> 00:18:45.679
+that leveraged similar ideas
+
+00:18:45.680 --> 00:18:48.919
+but an asynchronous search framework,
+
+00:18:48.920 --> 00:18:51.239
+as well as a package called deno-bridge
+
+00:18:51.240 --> 00:18:53.119
+that extended Emacs Lisp
+
+00:18:53.120 --> 00:18:56.439
+with Deno JavaScript TypeScript runtimes.
+
+00:18:56.440 --> 00:18:57.559
+Please check it out,
+
+00:18:57.560 --> 00:19:05.199
+if consider joining the development too!
+
+NOTE Thanks
+
+00:19:05.200 --> 00:19:08.599
+This is the entirety of my presentation, thanks for joining!
+
+00:19:08.600 --> 00:19:11.319
+Me and Lazycat will be available
+
+00:19:11.320 --> 00:19:20.240
+to answer questions on IRC and Etherpad.
diff --git a/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.vtt b/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.vtt
new file mode 100644
index 00000000..2c0a2ac5
--- /dev/null
+++ b/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.vtt
@@ -0,0 +1,1046 @@
+WEBVTT
+
+00:00.000 --> 00:04.000
+Thank you, Mohsen, very much for the great talk.
+
+00:04.000 --> 00:08.000
+People, if you have questions, please put them on the pad,
+
+00:08.000 --> 00:12.000
+or IRC, but preferably the pad, and then we'll also open this room
+
+00:12.000 --> 00:16.000
+in a minute or two so that if anyone who wants to join here and ask the questions
+
+00:16.000 --> 00:19.000
+directly to Mohsen, they could do that as well.
+
+00:19.000 --> 00:22.000
+Dear Mohsen, please take it away.
+
+00:22.000 --> 00:25.000
+Hello, greetings.
+
+00:25.000 --> 00:29.000
+Yeah, I don't see any questions yet,
+
+00:29.000 --> 00:35.000
+so let me add a few additional notes
+
+00:35.000 --> 00:39.000
+to what was in the presentation.
+
+00:39.000 --> 00:43.000
+In there, I make several points.
+
+00:43.000 --> 00:49.000
+Some of them are tactical, some are more strategic.
+
+00:49.000 --> 00:56.000
+Let me delve into the strategic message a bit.
+
+00:56.000 --> 01:02.000
+On the messaging capabilities of Emacs
+
+01:02.000 --> 01:08.000
+and the broader office environment capabilities of Emacs,
+
+01:08.000 --> 01:14.000
+we have a huge, incredibly powerful asset,
+
+01:14.000 --> 01:18.000
+but the amount of complexity
+
+01:18.000 --> 01:27.000
+and the surrounding configuration capabilities
+
+01:27.000 --> 01:32.000
+and hurdles and difficulties that are involved
+
+01:32.000 --> 01:41.000
+into making a really powerful environment for ourselves,
+
+01:41.000 --> 01:44.000
+we have a big obstacle,
+
+01:44.000 --> 01:49.000
+and that obstacle is that of integration.
+
+01:49.000 --> 01:58.000
+Over the past 40 years, the general model has been that of producing components
+
+01:58.000 --> 02:03.000
+where we do great stuff.
+
+02:03.000 --> 02:13.000
+We put various email MTAs and support them through Emacs.
+
+02:13.000 --> 02:21.000
+Additionally, we say that we want Emacs to be used on all platforms.
+
+02:21.000 --> 02:25.000
+If you're on Windows, there is Emacs support for it.
+
+02:25.000 --> 02:30.000
+If there is Mac OS, there is support for that.
+
+02:30.000 --> 02:35.000
+And of course, all of the GNU Linux stuff,
+
+02:35.000 --> 02:39.000
+capabilities and platforms.
+
+02:39.000 --> 02:46.000
+So all of this results into tremendous amounts of energy
+
+02:46.000 --> 02:54.000
+to go both on the developer side and on the user side to support everything.
+
+02:54.000 --> 02:59.000
+And that's what we have been doing over the past 40 years.
+
+02:59.000 --> 03:07.000
+What I am saying is that perhaps we should revisit this approach
+
+03:07.000 --> 03:16.000
+and consider moving towards creating a complete
+
+03:16.000 --> 03:23.000
+Libre Halal free software digital ecosystem for ourselves
+
+03:23.000 --> 03:28.000
+and consider Emacs as the usage environment
+
+03:28.000 --> 03:33.000
+of that totality of the digital ecosystem.
+
+03:33.000 --> 03:42.000
+This will solve many problems if we were to buy into such an approach.
+
+03:42.000 --> 03:47.000
+If we were to say that as the platform de facto
+
+03:47.000 --> 03:54.000
+and because of everything that is happening,
+
+03:54.000 --> 03:57.000
+Debian is a reasonable good choice.
+
+03:57.000 --> 04:06.000
+And then we would tie in all Emacs capabilities
+
+04:06.000 --> 04:13.000
+primarily and firstly to our own platform
+
+04:13.000 --> 04:17.000
+and start building on it.
+
+04:17.000 --> 04:28.000
+So let's take the situation with email in such a scenario.
+
+04:28.000 --> 04:34.000
+The main obstacles that we have right now is that
+
+04:34.000 --> 04:41.000
+GNU comes out with support for pretty much everything.
+
+04:41.000 --> 04:50.000
+But as the user, someone trying to buy into doing email on Emacs,
+
+04:50.000 --> 04:55.000
+which of these facilities, which of these features
+
+04:55.000 --> 04:58.000
+would be the right way to go?
+
+04:58.000 --> 05:07.000
+So what I am saying, having chosen our platform as Debian,
+
+05:07.000 --> 05:14.000
+what if we were to say that we would buy into something like Q-mail
+
+05:14.000 --> 05:24.000
+as the outgoing message model and just fully bring it in
+
+05:24.000 --> 05:30.000
+and consider it as the only and the default MTA
+
+05:30.000 --> 05:33.000
+for everything that we do?
+
+05:33.000 --> 05:39.000
+Suddenly a whole lot of complexity goes away.
+
+05:39.000 --> 05:45.000
+And similarly for bringing in email,
+
+05:45.000 --> 05:50.000
+what if we were to say that we have bought into offline IMAP
+
+05:50.000 --> 05:55.000
+and then the next really interesting piece is
+
+05:55.000 --> 05:59.000
+what should be our mailboxes?
+
+05:59.000 --> 06:08.000
+This notion that today de facto Gmail is the universal place
+
+06:08.000 --> 06:11.000
+where you get your mailboxes.
+
+06:11.000 --> 06:15.000
+And very easily we can, not very easily,
+
+06:15.000 --> 06:20.000
+but we certainly can support Gmail.
+
+06:20.000 --> 06:27.000
+But what if we were to get in the business of actually providing
+
+06:27.000 --> 06:32.000
+mailboxes for everyone and combine that with the platform
+
+06:32.000 --> 06:35.000
+and the main user agent?
+
+06:35.000 --> 06:43.000
+So that's really the strategic message that I want to,
+
+06:43.000 --> 06:48.000
+that I'm sending.
+
+06:48.000 --> 06:49.000
+Excellent, thank you.
+
+06:49.000 --> 06:52.000
+And I think in the meantime we have four questions
+
+06:52.000 --> 06:54.000
+on the panel already.
+
+06:54.000 --> 07:00.000
+Okay, I don't see them here.
+
+07:00.000 --> 07:03.000
+Oh, are you looking in the public chat here on the big blue button?
+
+07:03.000 --> 07:04.000
+Yes.
+
+07:04.000 --> 07:06.000
+Okay, let me put a link.
+
+07:06.000 --> 07:10.000
+So there's a separate pad where people are posting their questions.
+
+07:10.000 --> 07:13.000
+Okay, now I am seeing.
+
+07:13.000 --> 07:17.000
+Yeah, if it might be easier I could probably copy the questions over here.
+
+07:17.000 --> 07:20.000
+No, no, I am actually seeing them.
+
+07:20.000 --> 07:21.000
+Okay.
+
+07:21.000 --> 07:25.000
+Perfectly, perfectly okay.
+
+07:25.000 --> 07:31.000
+So the first question is something I have liked about Not Much
+
+07:31.000 --> 07:35.000
+is using Maildear makes searching fast
+
+07:35.000 --> 07:40.000
+and the knowledge that you have all your email period.
+
+07:40.000 --> 07:45.000
+Why GNU's over Not Much?
+
+07:45.000 --> 07:53.000
+As a side note, you have also Much Think for Not Much client
+
+07:53.000 --> 07:59.000
+and Jmap for more exotic normal clients.
+
+07:59.000 --> 08:04.000
+So I think there are two things going on here.
+
+08:04.000 --> 08:07.000
+Not Much is more than one thing.
+
+08:07.000 --> 08:13.000
+Not Much is a search, a mail search engine
+
+08:13.000 --> 08:20.000
+and also Not Much is a MUA.
+
+08:20.000 --> 08:30.000
+So in terms of choosing, certainly for search, for mail search capabilities,
+
+08:30.000 --> 08:33.000
+we should go with Not Much
+
+08:33.000 --> 08:40.000
+and there is GNU's search capabilities for Not Much in there.
+
+08:40.000 --> 08:48.000
+So what I am suggesting is that we stick to GNU's as an MUA,
+
+08:48.000 --> 08:52.000
+but the search capabilities that you are talking about
+
+08:52.000 --> 08:59.000
+or that the question mentions are certainly available.
+
+08:59.000 --> 09:05.000
+A second question is, so the idea is more about Emacs
+
+09:05.000 --> 09:10.000
+as a holistic computing experience with other packages and services
+
+09:10.000 --> 09:14.000
+rather than about email specifically
+
+09:14.000 --> 09:19.000
+as an alternative to something like Microsoft Office Suite.
+
+09:19.000 --> 09:23.000
+Yes, this is right on the point.
+
+09:23.000 --> 09:28.000
+What I am saying is that email by itself
+
+09:28.000 --> 09:33.000
+is not really all that meaningful or interesting
+
+09:33.000 --> 09:38.000
+and everywhere that you look in the proprietary model,
+
+09:38.000 --> 09:43.000
+you would see that the likes of Google and the likes of Microsoft
+
+09:43.000 --> 09:49.000
+do not view email as standalone capabilities.
+
+09:49.000 --> 09:52.000
+They see it as integrated with address book.
+
+09:52.000 --> 09:55.000
+They see it as integrated with calendar.
+
+09:55.000 --> 09:59.000
+They see it integrated with search.
+
+09:59.000 --> 10:06.000
+They see it as integrated with your to-do list and time management.
+
+10:06.000 --> 10:09.000
+So you are very right.
+
+10:09.000 --> 10:13.000
+The question is right on point.
+
+10:13.000 --> 10:18.000
+Email by itself is not significant
+
+10:18.000 --> 10:26.000
+and the reason why Emacs is the right place to do email
+
+10:26.000 --> 10:29.000
+is because Emacs is the kitchen sink.
+
+10:29.000 --> 10:35.000
+It does absolutely everything and that is what you want.
+
+10:35.000 --> 10:38.000
+The third question is,
+
+10:38.000 --> 10:43.000
+early on you express misgivings about the Western copyright regime
+
+10:43.000 --> 10:46.000
+but you are using a GPL license.
+
+10:46.000 --> 10:49.000
+Is that a conflict?
+
+10:49.000 --> 10:52.000
+Great work by the way.
+
+10:52.000 --> 10:55.000
+No, I don't think it is a conflict.
+
+10:55.000 --> 11:04.000
+My position is that the Western intellectual property right regime
+
+11:04.000 --> 11:08.000
+is a colossal ownership mistake.
+
+11:08.000 --> 11:15.000
+Having said that, and I do call for its abolishment,
+
+11:15.000 --> 11:21.000
+having said that, it is unrealistic to assume or recognize
+
+11:21.000 --> 11:26.000
+that just because I say it and just because I believe it,
+
+11:26.000 --> 11:34.000
+in fact it will be abolished or that a significant change would happen,
+
+11:34.000 --> 11:38.000
+particularly in the Western world.
+
+11:38.000 --> 11:44.000
+So in the Western context, what can we do?
+
+11:44.000 --> 11:46.000
+What should we do?
+
+11:46.000 --> 11:52.000
+What I am saying there is that particularly in the context of services,
+
+11:52.000 --> 12:00.000
+all licenses should be the strictest ones possible
+
+12:00.000 --> 12:07.000
+and the one that is codified is the Afero GPL license.
+
+12:07.000 --> 12:12.000
+So I have subjected all my work to the Afero GPL license.
+
+12:12.000 --> 12:27.000
+I know of GNU, how do you think about using it for packaging,
+
+12:27.000 --> 12:31.000
+configuring Emacs, your various packages,
+
+12:31.000 --> 12:37.000
+else you might look it up or NixOS.
+
+12:37.000 --> 12:46.000
+So the idea here is that when we go back to this full integration
+
+12:46.000 --> 12:49.000
+in the context of a digital ecosystem,
+
+12:49.000 --> 12:59.000
+a major challenge is that of bringing in all the necessary packages
+
+12:59.000 --> 13:01.000
+from different sources.
+
+13:01.000 --> 13:08.000
+So for example, in the context of male user agents,
+
+13:08.000 --> 13:13.000
+to put things together you need a set of apt packages
+
+13:13.000 --> 13:17.000
+coming from the DBN world.
+
+13:17.000 --> 13:25.000
+You need a set of pypi packages coming from the Python world
+
+13:25.000 --> 13:32.000
+and you need a set of list packages coming from Elisp archives.
+
+13:32.000 --> 13:38.000
+And likely you need a whole lot of others.
+
+13:38.000 --> 13:47.000
+You need possibly Node.js stuff and you also possibly need Ruby stuff.
+
+13:47.000 --> 13:54.000
+And this integration is going to be complex.
+
+13:54.000 --> 14:01.000
+The approach that I have taken is that of going best of breed
+
+14:01.000 --> 14:06.000
+in the context of each of the domains.
+
+14:06.000 --> 14:13.000
+So in Python, while there may be other packaging models,
+
+14:13.000 --> 14:16.000
+we go with pypi.
+
+14:16.000 --> 14:19.000
+On the platform, it's clear that it's apt.
+
+14:19.000 --> 14:25.000
+On the Linux, over the past five years, we have solved mostly
+
+14:25.000 --> 14:29.000
+that archiving machinery.
+
+14:29.000 --> 14:39.000
+If the question is, and I'm not familiar with the specifics
+
+14:39.000 --> 14:44.000
+of what was mentioned in terms of a unified packaging model,
+
+14:44.000 --> 14:54.000
+but if the question is that of a unified packaging integration model,
+
+14:54.000 --> 14:58.000
+I'd love to do it when it's mature and ready.
+
+14:58.000 --> 15:05.000
+At this point, I am going the route of best of breed selections
+
+15:05.000 --> 15:09.000
+within each domain.
+
+15:09.000 --> 15:15.000
+And if I chime in briefly, Mohsen, I think there was a typo in the question.
+
+15:15.000 --> 15:19.000
+They are asking about GNU Geeks or mentioning GNU Geeks
+
+15:19.000 --> 15:21.000
+and also potentially NixOS.
+
+15:21.000 --> 15:24.000
+And I think these two also very much go with your idea
+
+15:24.000 --> 15:28.000
+of tying everything together, these different package management systems.
+
+15:28.000 --> 15:33.000
+So GNU Geeks is a GNU Linux distribution like Debian is,
+
+15:33.000 --> 15:37.000
+but it's written in GNU Guile Lisp or Guile Scheme.
+
+15:37.000 --> 15:41.000
+And it's a very interesting concept where all of the packaging code
+
+15:41.000 --> 15:46.000
+and everything is done in GNU Guile Scheme and ties everything together
+
+15:46.000 --> 15:48.000
+and integrates great with Emacs.
+
+15:48.000 --> 15:51.000
+So that might be something worth checking out later on.
+
+15:51.000 --> 15:52.000
+Right.
+
+15:52.000 --> 16:01.000
+I had taken a very cursory look at that, and I'll keep my eyes open on it.
+
+16:01.000 --> 16:07.000
+I think in due course, maybe that's the way to go.
+
+16:07.000 --> 16:13.000
+There's one more question coming in.
+
+16:13.000 --> 16:21.000
+I let the person who is asking the question to complete it.
+
+16:21.000 --> 16:22.000
+Okay.
+
+16:22.000 --> 16:26.000
+Yeah, in the meantime, I'll also mention that I think we have about
+
+16:26.000 --> 16:32.000
+four more minutes of on-stream live Q&A time, at which point after that,
+
+16:32.000 --> 16:33.000
+the stream will move on.
+
+16:33.000 --> 16:38.000
+But you Mohsen and, of course, people watching are welcome to come here,
+
+16:38.000 --> 16:41.000
+join this Big Blue Button Room directly and ask the questions here
+
+16:41.000 --> 16:42.000
+or on the pad.
+
+16:42.000 --> 16:43.000
+Great.
+
+16:43.000 --> 16:44.000
+Great.
+
+16:44.000 --> 16:47.000
+So let me read the question.
+
+16:47.000 --> 16:54.000
+Is this being split up in a heavily configured server for email hosting
+
+16:54.000 --> 17:00.000
+and the thin client package for you locally client to integrate with your
+
+17:00.000 --> 17:02.000
+Emacs package?
+
+17:02.000 --> 17:11.000
+Maybe with a client thin Docker container for other packages,
+
+17:11.000 --> 17:15.000
+like not much locally?
+
+17:15.000 --> 17:23.000
+Actually, that is not really exactly what I am speaking of.
+
+17:23.000 --> 17:32.000
+The concept of a thin client is difficult to characterize.
+
+17:32.000 --> 17:41.000
+So if you have Emacs and everything else that you want to use as a usage
+
+17:41.000 --> 17:49.000
+environment along with your email system, if we want to call that a thin
+
+17:49.000 --> 17:59.000
+client, certainly that is what I call the usage environment.
+
+17:59.000 --> 18:10.000
+On the services side, I am not speaking of just one.
+
+18:10.000 --> 18:15.000
+I am speaking of support for multiple, of course, obviously,
+
+18:15.000 --> 18:22.000
+but having one that in my own case, for example, by name.net,
+
+18:22.000 --> 18:27.000
+is the primary support.
+
+18:27.000 --> 18:36.000
+And in terms of packaging that as a thin client instead of inside of a
+
+18:36.000 --> 18:45.000
+Docker, that is certainly possible, but it is not, I don't consider it as
+
+18:45.000 --> 18:47.000
+the only way to go.
+
+18:47.000 --> 18:56.000
+You can do your packaging any way you want and, well, you can do your
+
+18:56.000 --> 19:04.000
+packaging and then deliver it however you want.
+
+19:04.000 --> 19:11.000
+On these questions, if I was not on the point in understanding the
+
+19:11.000 --> 19:16.000
+questions and answering them correctly, if there are any follow-ups,
+
+19:16.000 --> 19:42.000
+I would be happy to take them.
+
+19:42.000 --> 19:51.000
+Yeah, if there are no other questions, I can perhaps bring up the
+
+19:51.000 --> 20:04.000
+presentation and maybe make a few additional points.
+
+20:04.000 --> 20:23.000
+So, I think one key slide in here is this one, where what I am saying
+
+20:23.000 --> 20:32.000
+is that we have been very good at producing components and that we
+
+20:32.000 --> 20:42.000
+really need to get into systems development or environments
+
+20:42.000 --> 20:46.000
+development as opposed to components development.
+
+20:46.000 --> 20:55.000
+And to raise that a bit more so that we can move towards having
+
+20:55.000 --> 21:01.000
+something that we can call a non-procreatory digital ecosystem,
+
+21:01.000 --> 21:10.000
+I think we need to work towards having frameworks for services.
+
+21:10.000 --> 21:17.000
+And while we have defined free software or what I call Libre
+
+21:17.000 --> 21:25.000
+Halal software, we don't have precise definitions for Libre services,
+
+21:25.000 --> 21:27.000
+free services.
+
+21:27.000 --> 21:32.000
+Free services is going to be a very bad name, because we want it to
+
+21:32.000 --> 21:34.000
+be commercial.
+
+21:34.000 --> 21:39.000
+We want people to pay for it as they use it.
+
+21:39.000 --> 21:45.000
+And so the natural name would be something like Libre services.
+
+21:45.000 --> 21:52.000
+And in that context, if you go to Libre services.org, you will see
+
+21:52.000 --> 22:00.000
+my definition of what that would mean, what non-proprietary
+
+22:00.000 --> 22:05.000
+codification of services would mean.
+
+22:05.000 --> 22:20.000
+Another slide perhaps to take a look at is this one, where I am
+
+22:20.000 --> 22:35.000
+making the case for not considering Emacs by itself as core of
+
+22:35.000 --> 22:43.000
+anything, but viewing and cultivating and introducing this
+
+22:43.000 --> 22:48.000
+concept of common agent and building on it.
+
+22:48.000 --> 22:58.000
+Let me go see if there are any other questions.
+
+22:58.000 --> 23:08.000
+Yeah, I didn't see any more.
+
+23:08.000 --> 23:12.000
+May I drop in and ask a question directly?
+
+23:12.000 --> 23:14.000
+Of course.
+
+23:14.000 --> 23:21.000
+Okay, so I have a question regarding combining GNU and NotMuch.
+
+23:21.000 --> 23:23.000
+Yes.
+
+23:23.000 --> 23:30.000
+So do you combine tagging facilities of NotMuch into GNU as well?
+
+23:30.000 --> 23:32.000
+Sorry, can you repeat that?
+
+23:32.000 --> 23:37.000
+Do you also integrate tagging facilities of NotMuch into GNU?
+
+23:37.000 --> 23:41.000
+Tagging? I have not done that.
+
+23:41.000 --> 23:46.000
+Okay, because I was looking into combining GNU and NotMuch at some point,
+
+23:46.000 --> 23:53.000
+but what stopped me from continuing is that NotMuch is mostly about tags,
+
+23:53.000 --> 24:00.000
+and then GNU has a search option for NotMuch, using NotMuch.
+
+24:00.000 --> 24:05.000
+But how do you add tags from GNU?
+
+24:05.000 --> 24:11.000
+Right, in terms of continuous use, it's only recently that I'm doing that,
+
+24:11.000 --> 24:16.000
+and I don't think it means that it is not doable.
+
+24:16.000 --> 24:22.000
+It's just that in my own case, I haven't done it.
+
+24:22.000 --> 24:24.000
+Yeah, it's certainly doable.
+
+24:24.000 --> 24:30.000
+You present this unified system that brings everything together.
+
+24:30.000 --> 24:33.000
+So I was wondering if it's already implemented.
+
+24:33.000 --> 24:44.000
+Yeah, I must say all that I do is I want to say that that is the direction that I want to go.
+
+24:44.000 --> 24:45.000
+Okay.
+
+24:45.000 --> 24:47.000
+We have a long way to go.
+
+24:47.000 --> 24:58.000
+It's mostly a question of, and that is not the general direction and formalization that has been happening.
+
+24:58.000 --> 25:06.000
+So more or less, a lot of what I mentioned in there is not fully baked.
+
+25:06.000 --> 25:17.000
+Okay, thanks.
+
+25:17.000 --> 25:20.000
+I think we also have a question here in chat, Mohsen.
+
+25:20.000 --> 25:22.000
+I wasn't sure if you already saw or answered it or not.
+
+25:22.000 --> 25:24.000
+Sorry.
+
+25:24.000 --> 25:28.000
+No, let me, is it on the chat?
+
+25:28.000 --> 25:30.000
+Yes, public chat here on big blue button.
+
+25:30.000 --> 25:31.000
+Question by Thuna.
+
+25:31.000 --> 25:34.000
+Oh, public chat on the big blue button.
+
+25:34.000 --> 25:38.000
+Yeah.
+
+25:38.000 --> 25:41.000
+Can you expand on definition of Libre Halal?
+
+25:41.000 --> 25:42.000
+I'm a bit lost.
+
+25:42.000 --> 25:44.000
+Yes.
+
+25:44.000 --> 25:46.000
+Yes, yes, yes, yes.
+
+25:46.000 --> 26:05.000
+So, you see, we have labels of free software that are well established, and we have definitions of open source that are well established.
+
+26:05.000 --> 26:20.000
+And both of these are in the Western context and from the perspective of Western folks.
+
+26:20.000 --> 26:29.000
+What I am saying is that neither free software nor open source are the right labels.
+
+26:29.000 --> 26:37.000
+What we are looking for is actually ethical software, not free software.
+
+26:37.000 --> 26:49.000
+Freedom is something that is wonderful and great, but it may not be the right thing to be free.
+
+26:49.000 --> 27:01.000
+What I am saying here is that a manner of existence of software is the key concept.
+
+27:01.000 --> 27:06.000
+Allow me to share the screen.
+
+27:06.000 --> 27:09.000
+Just one moment.
+
+27:09.000 --> 27:18.000
+And maybe point you to a place where I could answer it in depth.
+
+27:18.000 --> 27:27.000
+It is certainly not a topic that I could do justice to in just a moment.
+
+27:27.000 --> 27:51.000
+So, if you were to look for nature of polyexistentials and Googling that would take you there, there is a 250-page document there that says why I believe the Western intellectual property rights is wrong.
+
+27:51.000 --> 28:10.000
+And it goes through and says, well, if polyexistentials are not to be governed by the intellectual property rights regime, then what is the right manner of governing them?
+
+28:10.000 --> 28:21.000
+So, what is the right manner of existence of software? And what label should we use for that?
+
+28:21.000 --> 28:41.000
+And in here, there is a whole section that about 10 pages or so that describes what Halal means and why the Libre Halal label is the right label.
+
+28:41.000 --> 29:01.000
+So, let me perhaps point you to that section.
+
+29:01.000 --> 29:11.000
+Yeah, this is on the Cure section.
+
+29:11.000 --> 29:32.000
+I think if you were to go to chapter 12, that would be a good place.
+
+29:32.000 --> 29:37.000
+Do you happen to have the link to this page handy, Mohsan?
+
+29:37.000 --> 29:46.000
+Yeah, it is included in the presentation. Let me go there very quickly.
+
+29:46.000 --> 29:48.000
+Oops, sorry.
+
+29:48.000 --> 29:52.000
+Just one moment.
+
+29:52.000 --> 30:05.000
+Yeah, it's in the presentation with a QR code. So, let me look it up and bring it back up again.
+
+30:05.000 --> 30:13.000
+Thank you.
+
+30:13.000 --> 30:25.000
+So, the link for that document is on slide 13.
+
+30:25.000 --> 30:29.000
+Can you see it?
+
+30:29.000 --> 30:38.000
+I'm not seeing your slides, but okay, it is getting shared again. Yep. Thanks.
+
+30:38.000 --> 30:39.000
+Yeah, sorry. Go ahead.
+
+30:39.000 --> 30:42.000
+Yeah, that is the...
+
+30:42.000 --> 30:47.000
+Oh, very good. Somebody else also threw it up on there.
+
+30:47.000 --> 30:49.000
+But it's a little bit different.
+
+30:49.000 --> 31:01.000
+Yes, yes.
+
+31:01.000 --> 31:18.000
+Yeah, it's PLPC 120.0.33.
+
+31:18.000 --> 31:24.000
+I mean, any other questions? Yes, thank you.
+
+31:24.000 --> 31:27.000
+Thanks. Yeah, I don't see any other questions on the panel.
+
+31:27.000 --> 31:30.000
+Oh, there's one new question here from Thuna again.
+
+31:30.000 --> 31:35.000
+What is the scope of what you are imagining? Just software?
+
+31:35.000 --> 31:42.000
+No, certainly not just software. It is software and services.
+
+31:42.000 --> 31:49.000
+So, that is, I think, the next challenge and the next step for us.
+
+31:49.000 --> 32:03.000
+We have to think of ways of competing with Gmail and Outlook.com.
+
+32:03.000 --> 32:07.000
+So, services are certainly within the scope.
+
+32:07.000 --> 32:14.000
+In the abstract sense of what polyexistentials are.
+
+32:14.000 --> 32:18.000
+So, polyexistentials are things that exist in multiples.
+
+32:18.000 --> 32:24.000
+So, any form of knowledge is within the scope.
+
+32:24.000 --> 32:48.000
+And that goes to medications, goes to anything that is patentable and art and anything that is copyable.
+
+32:48.000 --> 33:03.000
+Yes, NFTs are a form of creating mono-existentials out of polyexistentials.
+
+33:03.000 --> 33:13.000
+So, by the time that you create an NFT, it is no longer the subject of what I am talking about.
+
+33:13.000 --> 33:23.000
+But the process of creating mono-existentials off of polyexistentials is what we should be discussing.
+
+33:23.000 --> 33:36.000
+There is a section in that book on that topic as well with the same subject of how one goes about creating that.
+
+33:36.000 --> 33:44.000
+You see, any sort of a name could be thought of as an NFT.
+
+33:44.000 --> 33:54.000
+So, if you think of our domain name system, although it is in the realm of software and services,
+
+33:54.000 --> 34:17.000
+what you have emacsconf.org that has become unique and it's a mono-existential.
+
+34:17.000 --> 34:30.000
+I think my key message here is this vocabulary of polyexistence and mono-existence and mixed existence,
+
+34:30.000 --> 34:38.000
+which is the novelty in the stuff that I have written.
+
+34:38.000 --> 34:43.000
+We all have understood these for a long time.
+
+34:43.000 --> 35:07.000
+It's a question of coming up with the right vocabulary to express them with precision that remains and then acting on them.
+
+35:07.000 --> 35:08.000
+Excellent.
+
+35:08.000 --> 35:15.000
+As a lot of people have said, I think both here and also in IRC, there is a lot of information and material to digest from this talk
+
+35:15.000 --> 35:21.000
+and to try to think really deeply about for the coming weeks and months.
+
+35:21.000 --> 35:24.000
+So, that's great.
+
+35:24.000 --> 35:28.000
+Thank you.
+
+35:28.000 --> 35:30.000
+We can keep this session going as long as you want.
+
+35:30.000 --> 35:33.000
+The stream has already moved on, but here it is open.
+
+35:33.000 --> 35:40.000
+If folks have any more questions, feel free to post them here or on the separate pad page.
+
+35:40.000 --> 35:46.000
+Yeah, or if not, then we can all drop off at some point.
+
+35:46.000 --> 35:48.000
+Sure.
+
+35:48.000 --> 35:52.000
+If there are any questions, I'll be happy to answer them.
+
+35:52.000 --> 36:07.000
+Otherwise, perhaps we could go and watch the rest.
+
+36:23.000 --> 36:31.000
+Yeah, I mean, I think perhaps it's a good thing to consider the session complete.
+
+36:31.000 --> 36:33.000
+Sure, sounds good to me.
+
+36:33.000 --> 36:36.000
+Thank you again very much Mohsen, really appreciate it.
+
+36:36.000 --> 36:38.000
+Thank you.
+
+36:38.000 --> 36:39.000
+Cheers, take care.
+
+36:39.000 --> 36:57.000
+Take care.
+
diff --git a/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main--chapters.vtt b/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main--chapters.vtt
new file mode 100644
index 00000000..5a0a3ee0
--- /dev/null
+++ b/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main--chapters.vtt
@@ -0,0 +1,80 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:01:41.079
+Introduction
+
+00:01:41.080 --> 00:03:33.599
+Mail and the digital ecosystem
+
+00:03:33.600 --> 00:05:32.399
+Platformization and Mail
+
+00:05:32.400 --> 00:06:19.799
+Contours of this presentation
+
+00:06:19.800 --> 00:06:42.839
+Anatomy of monolithic MUAs
+
+00:06:42.840 --> 00:07:22.959
+Existing Elisp mail libraries and modes
+
+00:07:22.960 --> 00:08:22.319
+Concept of a split-MUA
+
+00:08:22.320 --> 00:09:42.399
+Emacs and the culture of DIY split-MUAs
+
+00:09:42.400 --> 00:13:10.879
+A glimpse of the bigger picture
+
+00:13:10.880 --> 00:17:31.319
+The full ByStar story
+
+00:17:31.320 --> 00:19:20.119
+ByStar DE context, assets, and terminology
+
+00:19:20.120 --> 00:20:21.759
+MARMEE parts list
+
+00:20:21.760 --> 00:20:47.679
+Blee-Gnus parts list
+
+00:20:47.680 --> 00:22:08.839
+Deep integration of BISOS-MARMEE and Blee-Gnus
+
+00:22:08.840 --> 00:23:56.559
+qmail and bystar-qmail
+
+00:23:56.560 --> 00:25:10.759
+MARMEE: common-agent for split-MUA implementations
+
+00:25:10.760 --> 00:26:17.199
+Obtaining, installing, and configuring MARMEE
+
+00:26:17.200 --> 00:27:20.479
+Installing MARMEE
+
+00:27:20.480 --> 00:29:47.759
+Emacs inside of ByStar
+
+00:29:47.760 --> 00:31:36.959
+Emacs common-agent models and interfaces
+
+00:31:36.960 --> 00:32:35.279
+Evolution of Gnus with MARMEE
+
+00:32:35.280 --> 00:33:11.319
+X-Message-SMTP-Method: qmail
+
+00:33:11.320 --> 00:33:39.319
+X-Message-Send-Method
+
+00:33:39.320 --> 00:34:39.599
+Shared common-agents configuration and secrets management
+
+00:34:39.600 --> 00:35:34.079
+Evolution of message-mode into message-polymode
+
+00:35:34.080 --> 00:37:30.960
+Two vertical-slice mail use cases
diff --git a/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.vtt b/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.vtt
new file mode 100644
index 00000000..e39711df
--- /dev/null
+++ b/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.vtt
@@ -0,0 +1,1757 @@
+WEBVTT captioned by mohsen
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:09.719
+Greetings. Salaam. This is Mohsen Banan. محسن بنان.
+
+00:00:09.720 --> 00:00:12.559
+I am a software and internet engineer.
+
+00:00:12.560 --> 00:00:14.519
+I have been interested in email and
+
+00:00:14.520 --> 00:00:17.199
+Emacs for a very long time.
+
+00:00:17.200 --> 00:00:21.159
+My interest in email started with X.400
+
+00:00:21.160 --> 00:00:27.599
+and the Red and Blue CCITT books -- circa 1988.
+
+00:00:27.600 --> 00:00:31.999
+Early on, in the very early 1990s, I jumped ship
+
+00:00:32.000 --> 00:00:35.279
+and joined the Internet email movement.
+
+00:00:35.280 --> 00:00:38.399
+I am the primary author of two mobile email
+
+00:00:38.400 --> 00:00:45.839
+related Internet RFCs, RFC-2188 and RFC-2524.
+
+00:00:45.840 --> 00:00:49.919
+My interest in Emacs started in 1986 --
+
+00:00:49.920 --> 00:00:54.959
+It was Emacs version 17 then. By around 1988
+
+00:00:54.960 --> 00:00:58.479
+when Emacs version 18 was well in place,
+
+00:00:58.480 --> 00:01:01.799
+I started living inside of Emacs.
+
+00:01:01.800 --> 00:01:06.479
+My primary digital environment has been Emacs ever since.
+
+00:01:06.480 --> 00:01:11.319
+It has been a good life.
+
+00:01:11.320 --> 00:01:16.999
+It turns out that Emacs and email mix up really well.
+
+00:01:17.000 --> 00:01:21.519
+Here, in this presentation and in the context of
+
+00:01:21.520 --> 00:01:26.799
+Revisiting The Anatomy of Emacs Mail User Agents,
+
+00:01:26.800 --> 00:01:30.319
+With MARMEE (Multi-Account Resident
+
+00:01:30.320 --> 00:01:33.399
+Message Exchange Environment)
+
+00:01:33.400 --> 00:01:35.559
+I am offering my thoughts on this topic
+
+00:01:35.560 --> 00:01:41.079
+in this Emacs Conference 2022.
+
+NOTE Mail and the digital ecosystem
+
+00:01:41.080 --> 00:01:43.359
+Long ago, I asked myself:
+
+00:01:43.360 --> 00:01:49.119
+"What should my ultimate mail environment be?"
+
+00:01:49.120 --> 00:01:52.140
+Over the past 20+ years, I have been exploring
+
+00:01:52.141 --> 00:01:58.519
+the concept of the "Ultimate Mail User Agent (MUA)".
+
+00:01:58.520 --> 00:02:01.439
+We do care about privacy, autonomy,
+
+00:02:01.440 --> 00:02:05.039
+morality, ethics, society and philosophy,
+
+00:02:05.040 --> 00:02:10.679
+so from the get go, proprietary (Haraam) environments
+
+00:02:10.680 --> 00:02:14.199
+such as Microsoft Office's Outlook
+
+00:02:14.200 --> 00:02:20.159
+and Google Office's Gmail were non-starters for me.
+
+00:02:20.160 --> 00:02:23.159
+But these are significant realities
+
+00:02:23.160 --> 00:02:27.879
+and we need to deal with these realities.
+
+00:02:27.880 --> 00:02:30.199
+Notice how Microsoft and Google
+
+00:02:30.200 --> 00:02:36.079
+have both framed their MUAs in the context of "office".
+
+00:02:36.080 --> 00:02:38.719
+That type of framing is correct.
+
+00:02:38.720 --> 00:02:41.719
+an MUA must be fully integrated
+
+00:02:41.720 --> 00:02:46.559
+in the totality of one's digital ecosystem.
+
+00:02:46.560 --> 00:02:49.759
+So, the Ultimate Mail User Agent
+
+00:02:49.760 --> 00:02:53.399
+must be part of the Ultimate Usage Environment
+
+00:02:53.400 --> 00:02:57.599
+of the Ultimate Digital Ecosystem.
+
+00:02:57.600 --> 00:03:02.799
+In the non-proprietary (Halaal) universe, clearly
+
+00:03:02.800 --> 00:03:07.199
+the ultimate usage environment is Emacs.
+
+00:03:07.200 --> 00:03:10.879
+Emacs is today's most potent and convivial
+
+00:03:10.880 --> 00:03:15.159
+non-proprietary usage environment.
+
+00:03:15.160 --> 00:03:19.399
+So, clearly, the ultimate Mail User Agent
+
+00:03:19.400 --> 00:03:22.879
+must be an integral part of Emacs.
+
+NOTE Emacs and mail
+
+00:03:22.880 --> 00:03:24.157
+Having reached that conclusion,
+
+00:03:24.158 --> 00:03:28.124
+we then need to determine the specifics
+
+00:03:28.125 --> 00:03:33.599
+of the shape and the anatomy of Emacs' MUAs.
+
+00:03:33.600 --> 00:03:36.039
+We could have arrived at this conclusion
+
+00:03:36.040 --> 00:03:38.239
+from the reverse direction as well.
+
+00:03:38.240 --> 00:03:41.599
+Zawinski's Law states:
+
+00:03:41.600 --> 00:03:46.479
+Every program attempts to expand until it can read mail.
+
+00:03:46.480 --> 00:03:49.119
+Those programs which cannot so expand
+
+00:03:49.120 --> 00:03:52.679
+are replaced by ones which can.
+
+00:03:52.680 --> 00:03:56.719
+Jamie's point is very simple and obvious.
+
+00:03:56.720 --> 00:03:59.759
+The "App" that you "live in" all day
+
+00:03:59.760 --> 00:04:05.439
+should be your MUA and mail environment.
+
+00:04:05.440 --> 00:04:09.559
+I ask those who jumped ship, who abandoned Emacs
+
+00:04:09.560 --> 00:04:15.879
+in favor of VS Code: What about mail?
+
+00:04:15.880 --> 00:04:21.279
+Long ago, Emacs expanded to including MUAs.
+
+00:04:21.280 --> 00:04:27.039
+In fact there are many Emacs MUAs that you can choose from.
+
+00:04:27.040 --> 00:04:30.599
+If you are already hip with Emacs And Linux,
+
+00:04:30.600 --> 00:04:34.639
+you should definitely consider doing email in Emacs.
+
+00:04:34.640 --> 00:04:39.079
+But if you are not already hip with Emacs,
+
+00:04:39.080 --> 00:04:43.359
+I mean for new Emacs users, unfortunately,
+
+00:04:43.360 --> 00:04:48.599
+setting up and using email is not straight forward.
+
+00:04:48.600 --> 00:04:54.519
+We (I mean, Emacs developers) should work on that!
+
+00:04:54.520 --> 00:04:57.359
+Emacs offers a good number of MUAs with
+
+00:04:57.360 --> 00:05:01.959
+different characteristics to suit differing tastes.
+
+00:05:01.960 --> 00:05:06.119
+As of 2022, you can choose from the following MUAs:
+
+00:05:06.120 --> 00:05:15.079
+Gnus, VM, WanderLust, Mew, mu4e, notmuch.el, mh-e and Rmail.
+
+00:05:15.080 --> 00:05:17.719
+Over the years I have tried several of these
+
+00:05:17.720 --> 00:05:20.119
+and eventually landed on Gnus.
+
+00:05:20.120 --> 00:05:25.519
+The relevance column in this table simply and only
+
+00:05:25.520 --> 00:05:28.079
+reflects my taste.
+
+00:05:28.080 --> 00:05:32.399
+Throughout the rest of this presentation, I focus on Gnus.
+
+NOTE The audience for this presentation
+
+00:05:32.400 --> 00:05:36.199
+I have 3 types of audiences in mind for this presentation.
+
+00:05:36.200 --> 00:05:39.959
+First, if you are already using Emacs
+
+00:05:39.960 --> 00:05:42.439
+as more than an editor,
+
+00:05:42.440 --> 00:05:47.399
+it makes good sense for you to also use Emacs as your MUA.
+
+00:05:47.400 --> 00:05:50.759
+There may well be some relevant information here for you
+
+00:05:50.760 --> 00:05:52.319
+in that situation.
+
+00:05:52.320 --> 00:05:57.599
+Second, for those interested in philosophy of Emacs,
+
+00:05:57.600 --> 00:06:00.759
+I go on some bigger picture tangents
+
+00:06:00.760 --> 00:06:02.839
+that may be of value to you.
+
+00:06:02.840 --> 00:06:08.839
+Third, I address some Emacs developers with some feedback,
+
+00:06:08.840 --> 00:06:11.319
+some suggestions, and some requests.
+
+00:06:11.320 --> 00:06:14.599
+The general model here is that
+
+00:06:14.600 --> 00:06:17.079
+we would collectively work towards
+
+00:06:17.080 --> 00:06:19.799
+improving what is on the table.
+
+NOTE Monolithic mail user agents
+
+00:06:19.800 --> 00:06:22.719
+When a Mail User Agent is self-contained
+
+00:06:22.720 --> 00:06:26.519
+and includes implementation of mail protocols,
+
+00:06:26.520 --> 00:06:29.079
+we call it a Monolithic-MUA.
+
+00:06:29.080 --> 00:06:33.879
+Just as it is with the physical mail postal service,
+
+00:06:33.880 --> 00:06:36.919
+sending mail and receiving mail
+
+00:06:36.920 --> 00:06:40.639
+are fundamentally separate activities.
+
+00:06:40.640 --> 00:06:42.839
+And then there is mail processing.
+
+00:06:42.840 --> 00:06:45.959
+Based on these categorizations,
+
+00:06:45.960 --> 00:06:49.679
+Emacs has a set of mature libraries
+
+00:06:49.680 --> 00:06:53.359
+for composing mail, sending mail, and receiving mail.
+
+00:06:53.360 --> 00:06:58.119
+These are all independently well-documented
+
+00:06:58.120 --> 00:07:02.479
+and are part of the basic emacs Distribution.
+
+00:07:02.480 --> 00:07:06.239
+Emacs MUAs then use these common libraries
+
+00:07:06.240 --> 00:07:09.519
+to process mail (each somewhat differently).
+
+00:07:09.520 --> 00:07:15.399
+The primary benefit of the Monolithic-MUA approach
+
+00:07:15.400 --> 00:07:19.599
+is that Emacs MUAs then become self-contained
+
+00:07:19.600 --> 00:07:22.959
+and therefore multi-platform.
+
+NOTE Split mail user agents
+
+00:07:22.960 --> 00:07:25.559
+But, when it comes to the question of merits of
+
+00:07:25.560 --> 00:07:30.559
+implementation of mail protocols in Elisp inside of Emacs,
+
+00:07:30.560 --> 00:07:33.959
+there is also another approach:
+
+00:07:33.960 --> 00:07:36.159
+that of a Split-MUA.
+
+00:07:36.160 --> 00:07:40.559
+Concept of a split-MUA is that of
+
+00:07:40.560 --> 00:07:44.959
+splitting the MUA into two different parts:
+
+00:07:44.960 --> 00:07:47.159
+One being the usage environment,
+
+00:07:47.160 --> 00:07:50.319
+and the other being mail protocols processing.
+
+00:07:50.320 --> 00:07:54.719
+The interface between these can be either
+
+00:07:54.720 --> 00:07:57.839
+direct (the upper box)
+
+00:07:57.840 --> 00:08:00.279
+or through protocols (the lower box).
+
+00:08:00.280 --> 00:08:05.159
+With Gnus, we primarily use the direct interface.
+
+00:08:05.160 --> 00:08:09.639
+The split-MUA model has many advantages
+
+00:08:09.640 --> 00:08:12.599
+over the monolithic-MUA model.
+
+00:08:12.600 --> 00:08:17.279
+With Split-MUAs, your messages are local,
+
+00:08:17.280 --> 00:08:19.839
+you can search them privately
+
+00:08:19.840 --> 00:08:22.319
+and access to your email is faster.
+
+NOTE Gnus can be both
+
+00:08:22.320 --> 00:08:28.119
+Gnus can be used as both a Monolithic-MUA
+
+00:08:28.120 --> 00:08:30.599
+and also as a Split-MUA.
+
+00:08:30.600 --> 00:08:35.399
+Gnus and other Emacs MUAs are flexible enough
+
+00:08:35.400 --> 00:08:39.119
+to allow you to create your own split-MUA.
+
+00:08:39.120 --> 00:08:42.519
+For outgoing mail, Gnus can
+
+00:08:42.520 --> 00:08:45.119
+invoke a sendmail-like interface program.
+
+00:08:45.120 --> 00:08:50.007
+For incoming mail, Gnus can access Maildirs directly
+
+00:08:50.008 --> 00:08:53.724
+and let other programs imap-retrieve
+
+00:08:53.725 --> 00:08:56.439
+and update into maildirs.
+
+00:08:56.440 --> 00:08:59.719
+You can then search through your maildirs
+
+00:08:59.720 --> 00:09:01.374
+locally and privately
+
+00:09:01.375 --> 00:09:04.559
+with various mail-oriented search engines,
+
+00:09:04.560 --> 00:09:07.319
+and many have done so.
+
+00:09:07.320 --> 00:09:11.399
+For example, what we are seeing on this slide
+
+00:09:11.400 --> 00:09:15.879
+is from a 2014 Do It Yourself (DIY) recipe
+
+00:09:15.880 --> 00:09:20.319
+that one of our fellow Emacs conference participants,
+
+00:09:20.320 --> 00:09:24.879
+Adolfo, had published at the mentioned URL.
+
+00:09:24.880 --> 00:09:29.719
+The recipe in that slide is based on the following tools:
+
+00:09:29.720 --> 00:09:35.079
+mbsync, mu, mu4e, and msmtp.
+
+00:09:35.080 --> 00:09:38.279
+All our choices are different.
+
+00:09:38.280 --> 00:09:42.399
+There are many such recipes out there on the web.
+
+NOTE Proprietary universes
+
+00:09:42.400 --> 00:09:46.199
+So, here, I don't want to provide
+
+00:09:46.200 --> 00:09:50.439
+yet another Emacs Split-MUA recipe.
+
+00:09:50.440 --> 00:09:51.559
+I want to do more.
+
+00:09:51.560 --> 00:09:56.679
+Instead, I want to target the contours of the ultimate MUA
+
+00:09:56.680 --> 00:10:01.319
+in the non-proprietary universe of digital ecosystems.
+
+00:10:01.320 --> 00:10:05.439
+But, first, let's take a look at what is
+
+00:10:05.440 --> 00:10:07.479
+happening in the proprietary universe.
+
+00:10:07.480 --> 00:10:11.439
+The 5 big American proprietary tech companies
+
+00:10:11.440 --> 00:10:14.399
+(Google, Microsoft, Apple, Facebook and Amazon)
+
+00:10:14.400 --> 00:10:20.439
+have created 5 competing enclaves as mostly separate
+
+00:10:20.440 --> 00:10:22.999
+and isolated digital ecosystem.
+
+00:10:23.000 --> 00:10:27.839
+In this slide, I am focusing on the first 3
+
+00:10:27.840 --> 00:10:31.439
+and each of their office and email environments.
+
+00:10:31.440 --> 00:10:36.319
+Let's clearly recognize that the economic model
+
+00:10:36.320 --> 00:10:40.159
+of these proprietary digital ecosystems is:
+
+00:10:40.160 --> 00:10:42.159
+"Surveillance Capitalism".
+
+00:10:42.160 --> 00:10:45.799
+So, when any of us goes there to get
+
+00:10:45.800 --> 00:10:47.959
+a free-of-charge email account,
+
+00:10:47.960 --> 00:10:53.039
+he has chosen to voluntarily forgo much of his privacy.
+
+00:10:53.040 --> 00:10:55.799
+And many have done so.
+
+00:10:55.800 --> 00:10:59.919
+Sadly, the rest of the world is becoming
+
+00:10:59.920 --> 00:11:02.719
+Americanized through the American Internet.
+
+00:11:02.720 --> 00:11:08.439
+As of 2022, almost %90 of Facebook's
+
+00:11:08.440 --> 00:11:11.959
+daily active users come from outside of the US.
+
+00:11:11.960 --> 00:11:17.159
+Also, with respect to email, each of the enclaves
+
+00:11:17.160 --> 00:11:20.039
+have MUAs that are fully integrated
+
+00:11:20.040 --> 00:11:22.439
+in their digital ecosystems
+
+00:11:22.440 --> 00:11:24.599
+in the form of an office environment
+
+00:11:24.600 --> 00:11:29.839
+comprising of address book, calendar, time management
+
+00:11:29.840 --> 00:11:33.199
+and planning tools and multi-lingual authoring
+
+00:11:33.200 --> 00:11:36.239
+and various other integrated tools.
+
+NOTE Non-proprietary universes
+
+00:11:36.240 --> 00:11:40.839
+Now, let's focus on the right side of this picture.
+
+00:11:40.840 --> 00:11:43.519
+On the non-proprietary side,
+
+00:11:43.520 --> 00:11:46.239
+based on the Western FLOSS model,
+
+00:11:46.240 --> 00:11:49.479
+we have ended up with lots of components.
+
+00:11:49.480 --> 00:11:52.239
+We have Debian as a platform,
+
+00:11:52.240 --> 00:11:58.919
+we have Emacs as an editor-centered office environment
+
+00:11:58.920 --> 00:12:03.439
+and we have Gnus as an incredibly powerful MUA.
+
+00:12:03.440 --> 00:12:07.839
+But on the non-proprietary side we don't have anything
+
+00:12:07.840 --> 00:12:12.079
+that can reasonably be considered a digital ecosystem.
+
+00:12:12.080 --> 00:12:16.439
+I mean, the services aspect is missing.
+
+NOTE By*
+
+00:12:16.440 --> 00:12:20.799
+Over the past two decades I have created
+
+00:12:20.800 --> 00:12:24.399
+quite an elaborate digital ecosystem for myself.
+
+00:12:24.400 --> 00:12:26.759
+It is called: By*.
+
+00:12:26.760 --> 00:12:30.839
+The Libre-Halaal ByStar Digital Ecosystem
+
+00:12:30.840 --> 00:12:35.439
+is being built to provide autonomy-oriented services
+
+00:12:35.440 --> 00:12:37.359
+on internet scale.
+
+00:12:37.360 --> 00:12:42.919
+The * in ByStar stands for Unix's globbing symbol,
+
+00:12:42.920 --> 00:12:46.919
+signifying that our scope is everything.
+
+00:12:46.920 --> 00:12:52.039
+Notice in this bigger picture that in the red box,
+
+00:12:52.040 --> 00:12:58.439
+our focus remains to be Emacs, Gnus and the ultimate MUA.
+
+00:12:58.440 --> 00:13:03.439
+I am not here to sell you ByStar, but perhaps
+
+00:13:03.440 --> 00:13:06.239
+you should be in the market for something like that.
+
+00:13:06.240 --> 00:13:10.879
+We need non-proprietary digital ecosystems.
+
+00:13:10.880 --> 00:13:13.359
+Very briefly, I'll give you
+
+00:13:13.360 --> 00:13:16.319
+some pointers to the full ByStar story.
+
+00:13:16.320 --> 00:13:23.239
+The full ByStar story is a 250 plus pages book titled:
+
+00:13:23.240 --> 00:13:26.079
+Nature Of Polyexistentials,
+
+00:13:26.080 --> 00:13:28.399
+Basis For Abolishment Of
+
+00:13:28.400 --> 00:13:31.319
+The Western Intellectual Property Rights Regime,
+
+00:13:31.320 --> 00:13:33.479
+And Introduction Of
+
+00:13:33.480 --> 00:13:36.359
+The Libre-Halaal ByStar Digital Ecosystem.
+
+00:13:36.360 --> 00:13:42.039
+I have it self-published on my own ByName public web page.
+
+00:13:42.040 --> 00:13:46.639
+The ByStar story starts with understanding of the
+
+00:13:46.640 --> 00:13:48.959
+Nature Of Polyexistentials.
+
+00:13:48.960 --> 00:13:53.839
+Polyexistentials inherently exist in multiples.
+
+00:13:53.840 --> 00:13:56.959
+Software is a polyexistential.
+
+00:13:56.960 --> 00:14:01.919
+Polyexistentials are naturally non-scarce,
+
+00:14:01.920 --> 00:14:06.279
+and making polyexistential artificially scarce,
+
+00:14:06.280 --> 00:14:08.599
+which is what the Western
+
+00:14:08.600 --> 00:14:11.119
+intellectual property rights regime does,
+
+00:14:11.120 --> 00:14:13.599
+is counter to nature.
+
+00:14:13.600 --> 00:14:17.639
+Polyexistentials are unownable
+
+00:14:17.640 --> 00:14:20.039
+and should not be considered property.
+
+00:14:20.040 --> 00:14:25.079
+The Western IPR regime is in conflict with nature.
+
+00:14:25.080 --> 00:14:29.039
+But, the book is more than just philosophy.
+
+00:14:29.040 --> 00:14:32.359
+In that book I also cover
+
+00:14:32.360 --> 00:14:35.799
+the bigger picture of healthy digital ecosystems
+
+00:14:35.800 --> 00:14:39.359
+which also includes the topic of this presentation.
+
+00:14:39.360 --> 00:14:43.399
+I'd be interested in your thoughts and your feedback,
+
+00:14:43.400 --> 00:14:45.679
+if you choose to dig deeper.
+
+00:14:45.680 --> 00:14:50.999
+And if you want to dig deeper, here are some links.
+
+00:14:51.000 --> 00:14:55.079
+By* is about re-decentralization
+
+00:14:55.080 --> 00:14:57.159
+of Internet application services.
+
+00:14:57.160 --> 00:15:00.759
+Among other things, ByStar provides
+
+00:15:00.760 --> 00:15:05.159
+complete own-your-email services. I mean,
+
+00:15:05.160 --> 00:15:10.319
+private Hillary-Clinton-Style mail servers for everyone.
+
+00:15:10.320 --> 00:15:16.519
+There is an overview of ByStar at by-star.net.
+
+NOTE Libre-Halaal
+
+00:15:16.520 --> 00:15:21.199
+You may have noticed that I consistently use
+
+00:15:21.200 --> 00:15:25.479
+the "Libre-Halaal" label with ByStar.
+
+00:15:25.480 --> 00:15:28.919
+Halaal is a very sensitive word.
+
+00:15:28.920 --> 00:15:30.719
+I am a Moslem.
+
+00:15:30.720 --> 00:15:35.919
+But my use of Halaal is not in a religious context.
+
+00:15:35.920 --> 00:15:39.079
+It is in a philosphical context.
+
+00:15:39.080 --> 00:15:42.759
+And the scope of the "Libre-Halaal" label
+
+00:15:42.760 --> 00:15:46.439
+is manner-of-existence of Software and Services.
+
+00:15:46.440 --> 00:15:50.599
+It is not about Halaal-ness with respect to
+
+00:15:50.600 --> 00:15:54.959
+function and use of Software and Services.
+
+00:15:54.960 --> 00:15:58.239
+Unfortunately, the word Halaal
+
+00:15:58.240 --> 00:16:02.319
+and the concept of Halaal does not exist in English.
+
+00:16:02.320 --> 00:16:06.759
+So, first I introduce it into Globish.
+
+00:16:06.760 --> 00:16:12.799
+I have done so in PLPC-120039.
+
+00:16:12.800 --> 00:16:18.199
+Further, I explain as to why labels
+
+00:16:18.200 --> 00:16:22.639
+of Open Source and Free Software are both ill-directed.
+
+00:16:22.640 --> 00:16:25.839
+We then carefully define
+
+00:16:25.840 --> 00:16:29.999
+"Libre-Halaal Software" and "Libre-Halaal Services".
+
+00:16:30.000 --> 00:16:33.919
+Notice that last link.
+
+00:16:33.920 --> 00:16:36.199
+I bet, this is the first time
+
+00:16:36.200 --> 00:16:40.679
+that anyone includes a link to his "Open Business Plan"
+
+00:16:40.680 --> 00:16:43.159
+in an Emacs Conference.
+
+00:16:43.160 --> 00:16:46.559
+I hope others would do this as well.
+
+00:16:46.560 --> 00:16:49.679
+There is appetite out there
+
+00:16:49.680 --> 00:16:53.639
+for privacy- and autonomy-oriented digital ecosystems,
+
+00:16:53.640 --> 00:16:57.759
+and there is no conflict between honest business,
+
+00:16:57.760 --> 00:17:01.039
+honest profit, and Libre-Halaal Software
+
+00:17:01.040 --> 00:17:02.919
+and Libre-Halaal Services.
+
+00:17:02.920 --> 00:17:08.039
+The sub-title of our open business plan is:
+
+00:17:08.040 --> 00:17:12.879
+"An Inversion to the Proprietary Internet Services Model".
+
+00:17:12.880 --> 00:17:20.879
+And here are the same links as a native Reveal slide.
+
+00:17:20.880 --> 00:17:24.679
+If instead of a video, you are viewing
+
+00:17:24.680 --> 00:17:27.399
+this presentation as a Reveal web page,
+
+00:17:27.400 --> 00:17:31.319
+you can just click on the pointers and URLs.
+
+NOTE The BISOS integration framework
+
+00:17:31.320 --> 00:17:36.879
+So, what was the point of bringing ByStar
+
+00:17:36.880 --> 00:17:38.119
+into this presentation?
+
+00:17:38.120 --> 00:17:42.319
+In tangible terms, what have we gotten out of
+
+00:17:42.320 --> 00:17:45.639
+the tangent we took on the ByStar bigger picture?
+
+00:17:45.640 --> 00:17:50.839
+Of course we have the ByStar Digital Ecosystem itself.
+
+00:17:50.840 --> 00:17:54.879
+But that is not immediately relevant to this presentation.
+
+00:17:54.880 --> 00:17:59.959
+Here, through BISOS we now have
+
+00:17:59.960 --> 00:18:04.359
+an integration framework, which we definitely needed.
+
+00:18:04.360 --> 00:18:07.879
+We now have BISOS-MARMEE,
+
+00:18:07.880 --> 00:18:11.519
+Multi-Account Resident Mail Exchange Environment,
+
+00:18:11.520 --> 00:18:13.679
+which is a consistent set
+
+00:18:13.680 --> 00:18:17.639
+of MUA-related software components --- which we need.
+
+00:18:17.640 --> 00:18:23.159
+We also needed to augment Emacs in our own terms,
+
+00:18:23.160 --> 00:18:25.919
+so we have Blee for that,
+
+00:18:25.920 --> 00:18:29.959
+ByStar Libre-Halaal Emacs Environment,
+
+00:18:29.960 --> 00:18:32.919
+is ByStar ecosystemized Emacs.
+
+00:18:32.920 --> 00:18:37.679
+And finally Blee-Gnus, which is
+
+00:18:37.680 --> 00:18:40.639
+Gnus and MARMEE integrated with Blee.
+
+00:18:40.640 --> 00:18:46.479
+With these in place, we can now dive deeper into MARMEE.
+
+00:18:46.480 --> 00:18:53.119
+The idea of MARMEE, is that of packaging together
+
+00:18:53.120 --> 00:18:56.079
+the mail protocols parts of the Split-MUA.
+
+00:18:56.080 --> 00:19:00.799
+MARMEE (which is of course in the context of BISOS)
+
+00:19:00.800 --> 00:19:03.679
+is the green box in this slide.
+
+00:19:03.680 --> 00:19:08.519
+For outgoing mail, we use an altered qmail.
+
+00:19:08.520 --> 00:19:12.679
+We will be looking deeper into qmail a bit later.
+
+00:19:12.680 --> 00:19:17.559
+For incoming mail, we are using offlineimap
+
+00:19:17.560 --> 00:19:20.119
+which is oauth2 aware.
+
+NOTE BISOS-MARMEE
+
+00:19:20.120 --> 00:19:23.439
+Before going into more details,
+
+00:19:23.440 --> 00:19:26.519
+let's take a look at the parts lists for
+
+00:19:26.520 --> 00:19:29.359
+BISOS-MARMEE and Blee-Gnus.
+
+00:19:29.360 --> 00:19:33.719
+MARMEE is a collection of Python-based libraries
+
+00:19:33.720 --> 00:19:37.479
+and Debian packages that provide for rich sending
+
+00:19:37.480 --> 00:19:40.279
+and receiving of email outside of Emacs.
+
+00:19:40.280 --> 00:19:44.239
+Here is our BISOS-MARMEE parts list.
+
+00:19:44.240 --> 00:19:48.599
+MARMEE features include tracked mail Sending
+
+00:19:48.600 --> 00:19:51.919
+for confirmed mail communications
+
+00:19:51.920 --> 00:19:54.599
+and email distribution facilities
+
+00:19:54.600 --> 00:19:57.559
+(say, similar to Constant Contact).
+
+00:19:57.560 --> 00:20:02.079
+For Delivery Status Notification (DSN),
+
+00:20:02.080 --> 00:20:06.039
+we have adopted flufl.bounce.
+
+00:20:06.040 --> 00:20:10.879
+I'll be touching on everything that is qmail-related,
+
+00:20:10.880 --> 00:20:17.319
+namely qmail-remote.cs and mailfront, in a separate slide.
+
+00:20:17.320 --> 00:20:21.759
+notmuch is our choice of mail search engine.
+
+NOTE Blee-Gnus
+
+00:20:21.760 --> 00:20:27.319
+Similarly, here is our Blee-Gnus Parts List.
+
+00:20:27.320 --> 00:20:33.439
+Blee-Gnus is Gnus and MARMEE integrated with BISOS and Blee.
+
+00:20:33.440 --> 00:20:38.599
+Notice mentions of org-msg and polymode here.
+
+00:20:38.600 --> 00:20:42.879
+Later, I'll expand on these in the context of
+
+00:20:42.880 --> 00:20:47.679
+transitioning from Message-Mode to Message-Polymode.
+
+NOTE In combination
+
+00:20:47.680 --> 00:20:52.199
+With these parts in place,
+
+00:20:52.200 --> 00:20:55.279
+now let's see how they will all come together.
+
+00:20:55.280 --> 00:20:59.999
+Gnus is very flexible, and in combination with MARMEE,
+
+00:21:00.000 --> 00:21:03.639
+it can create an incredibly powerful MUA.
+
+00:21:03.640 --> 00:21:07.279
+On this slide, note the boxes
+
+00:21:07.280 --> 00:21:10.319
+that include the FPs label.
+
+00:21:10.320 --> 00:21:14.839
+FP stand for File Parameters.
+
+00:21:14.840 --> 00:21:18.519
+It is the basis of BISOS's configuration
+
+00:21:18.520 --> 00:21:20.039
+and secrets management.
+
+00:21:20.040 --> 00:21:24.319
+Notice that it has consistent agents
+
+00:21:24.320 --> 00:21:27.839
+inside of Emacs and on the OS.
+
+00:21:27.840 --> 00:21:29.919
+This is a big deal
+
+00:21:29.920 --> 00:21:34.719
+in that it can reduce user visible configuration complexity.
+
+NOTE X822-Bus
+
+00:21:34.720 --> 00:21:39.759
+Also, notice the X822-Bus here.
+
+00:21:39.760 --> 00:21:43.999
+The idea of X822-Bus is that of
+
+00:21:44.000 --> 00:21:49.839
+allowing for communication among user's preferences, Gnus
+
+00:21:49.840 --> 00:21:53.599
+and MARMEE-qmail through addition of X- fields
+
+00:21:53.600 --> 00:21:57.959
+in RFC-822 message headers.
+
+00:21:57.960 --> 00:22:03.599
+X822-Bus is used for selection of mail sending agents
+
+00:22:03.600 --> 00:22:08.839
+and specification of delivery status parameters.
+
+NOTE bystar-qmail
+
+00:22:08.840 --> 00:22:12.279
+Of key significance in this picture
+
+00:22:12.280 --> 00:22:15.479
+is our choice of qmail for outgoing mail.
+
+00:22:15.480 --> 00:22:22.519
+Compared to sendmail, postfix, exim,
+
+00:22:22.520 --> 00:22:25.399
+and other conventional MTAs;
+
+00:22:25.400 --> 00:22:31.719
+the qmail ecosystem is far more flexible and potent.
+
+00:22:31.720 --> 00:22:34.599
+We are not using qmail as is.
+
+00:22:34.600 --> 00:22:37.999
+Ours is called bystar-qmail.
+
+00:22:38.000 --> 00:22:41.799
+When we use it as a traditional MTA,
+
+00:22:41.800 --> 00:22:45.439
+we refer to it as PALS-qmail.
+
+00:22:45.440 --> 00:22:52.599
+And when we use it on the MUA side, we call it MARMEE-qmail.
+
+00:22:52.600 --> 00:22:56.599
+Just like Emacs, qmail has
+
+00:22:56.600 --> 00:22:59.959
+a solid core and a flexible periphery.
+
+00:22:59.960 --> 00:23:04.479
+All our alterations have been on the periphery.
+
+00:23:04.480 --> 00:23:07.890
+We have replaced qmail-remote
+
+00:23:07.891 --> 00:23:14.479
+with our own Python implementation called qmail-remote.cs.
+
+00:23:14.480 --> 00:23:20.919
+By being in Python, it can do a lot more a lot more easily.
+
+00:23:20.920 --> 00:23:26.540
+For example, qmail-remote.cs interacts with
+
+00:23:26.541 --> 00:23:33.079
+Google Oauth2 APIs and allows you to send through Gmail.
+
+00:23:33.080 --> 00:23:36.399
+This is shown with the red circle.
+
+00:23:36.400 --> 00:23:43.639
+We have also replaced qmail-smtpd with mailfront,
+
+00:23:43.640 --> 00:23:46.159
+shown with a blue circle.
+
+00:23:46.160 --> 00:23:51.359
+This allows us to use MARMEE Split-MUA
+
+00:23:51.360 --> 00:23:53.999
+through protocol interfaces.
+
+00:23:54.000 --> 00:23:56.559
+Let's take a look at that.
+
+NOTE Using MARMEE with other MUAs outside Emacs
+
+00:23:56.560 --> 00:24:02.719
+Previously we looked at the "Direct Interface" of MARMEE,
+
+00:24:02.720 --> 00:24:08.479
+specifically, qmail-inject and Maildir for Gnus.
+
+00:24:08.480 --> 00:24:11.479
+But what if we wanted to use
+
+00:24:11.480 --> 00:24:15.159
+MARMEE with other MUAs outside of Emacs?
+
+00:24:15.160 --> 00:24:18.799
+That can be done through the "Protocol Interface".
+
+00:24:18.800 --> 00:24:22.039
+MARMEE also includes "mailfront"
+
+00:24:22.040 --> 00:24:27.439
+which can function as an SMTP submit server for localhost.
+
+00:24:27.440 --> 00:24:30.599
+This way, we can configure
+
+00:24:30.600 --> 00:24:36.239
+the outgoing mail part of any MUA to point to the localhost
+
+00:24:36.240 --> 00:24:41.399
+and have MARMEE-qmail function as an outgoing proxy.
+
+NOTE Incoming mail
+
+00:24:41.400 --> 00:24:47.919
+For incoming mail, MARMEE-Split-MUA-Protocol-Interface
+
+00:24:47.920 --> 00:24:51.359
+includes "Courier", which can function
+
+00:24:51.360 --> 00:24:54.079
+as an IMAP server for localhost.
+
+00:24:54.080 --> 00:24:58.519
+This way, we can configure the incoming mail part
+
+00:24:58.520 --> 00:25:02.319
+of any MUA to point to the localhost
+
+00:25:02.320 --> 00:25:06.519
+and have MARMEE function as an incoming proxy
+
+00:25:06.520 --> 00:25:10.759
+by serving the local Maildir to the MUA.
+
+NOTE Licensing and project status
+
+00:25:10.760 --> 00:25:18.079
+All sources for all of ByStar, BISOS,
+
+00:25:18.080 --> 00:25:23.439
+Blee and MARMEE are subject to Affero GPL.
+
+00:25:23.440 --> 00:25:28.319
+The sources and documentation are all republished
+
+00:25:28.320 --> 00:25:30.559
+under various "Organizations"
+
+00:25:30.560 --> 00:25:35.439
+under github.com/mohsenBanan
+
+00:25:35.440 --> 00:25:40.679
+All of ByStar, BISOS, Blee and MARMEE
+
+00:25:40.680 --> 00:25:42.839
+reflect work in progress,
+
+00:25:42.840 --> 00:25:46.319
+and we are NOT recruiting users at this time.
+
+00:25:46.320 --> 00:25:49.279
+For more than two decades,
+
+00:25:49.280 --> 00:25:53.159
+I have been using these all in that bigger context.
+
+00:25:53.160 --> 00:25:56.239
+They are mostly real,
+
+00:25:56.240 --> 00:26:01.399
+but so far, just for myself and a few other engineers.
+
+00:26:01.400 --> 00:26:06.519
+Our model is similar to God's early days.
+
+00:26:06.520 --> 00:26:08.319
+You may ask:
+
+00:26:08.320 --> 00:26:12.119
+"How did God create all of this in just 7 days?"
+
+00:26:12.120 --> 00:26:17.199
+Well, easy, He did not have an installed base to deal with.
+
+NOTE Installing MARMEE
+
+00:26:17.200 --> 00:26:24.519
+You can obtain and install MARMEE in two ways. As is:
+
+00:26:24.520 --> 00:26:29.439
+as standalone-MARMEE, you can just
+
+00:26:29.440 --> 00:26:31.919
+pip install bisos.marmee.
+
+00:26:31.920 --> 00:26:35.879
+For the Gnus part you are completely on your own.
+
+00:26:35.880 --> 00:26:40.279
+Or on a Debian-11, you can just run
+
+00:26:40.280 --> 00:26:43.399
+the bisos bootstrap script.
+
+00:26:43.400 --> 00:26:48.359
+That way you will have all of BISOS, which includes MARMEE
+
+00:26:48.360 --> 00:26:52.159
+and you will have Blee, which includes Blee-Gnus.
+
+00:26:52.160 --> 00:26:54.719
+If you plan to do so,
+
+00:26:54.720 --> 00:26:58.839
+I suggest that you first try it in a disposable VM.
+
+00:26:58.840 --> 00:27:02.159
+BISOS and Blee are large.
+
+00:27:02.160 --> 00:27:06.359
+Many apt and pip packages will be installed!
+
+00:27:06.360 --> 00:27:11.839
+And here are the same links as a native Reveal slide.
+
+00:27:11.840 --> 00:27:17.519
+If you are viewing this presentation as Reveal.js web page,
+
+00:27:17.520 --> 00:27:20.479
+you can just click on the pointers and URLs.
+
+NOTE MARMEE as an Emacs "Common Agent"
+
+00:27:20.480 --> 00:27:25.359
+Let's consider MARMEE as an Emacs "Common Agent".
+
+00:27:25.360 --> 00:27:28.919
+By "Common-Agent" I mean a capability
+
+00:27:28.920 --> 00:27:30.959
+which Emacs builds on
+
+00:27:30.960 --> 00:27:33.759
+and which other Apps can also use.
+
+00:27:33.760 --> 00:27:38.479
+Emacs has a very rich applications development framework
+
+00:27:38.480 --> 00:27:41.119
+for absorbing common-agents.
+
+00:27:41.120 --> 00:27:45.474
+Consider how magit has absorbed git,
+
+00:27:45.475 --> 00:27:49.774
+or how flycheck has absorbed mypy
+
+00:27:49.775 --> 00:27:54.199
+or how EAF does its work outside of Emacs ---
+
+00:27:54.200 --> 00:27:57.919
+that too can be considered a common-agent.
+
+00:27:57.920 --> 00:28:02.039
+The common-agent model permits us
+
+00:28:02.040 --> 00:28:04.599
+to do more outside of Emacs.
+
+00:28:04.600 --> 00:28:08.639
+Common-agents maximize social benefits
+
+00:28:08.640 --> 00:28:10.559
+and are more convivial.
+
+00:28:10.560 --> 00:28:15.479
+For example, any MUA can profit from MARMEE.
+
+00:28:15.480 --> 00:28:18.439
+But we don't have good ways of
+
+00:28:18.440 --> 00:28:21.399
+packaging Emacs and its packages
+
+00:28:21.400 --> 00:28:23.639
+with their common-agents.
+
+00:28:23.640 --> 00:28:28.359
+Instead, we usually end up with DIY recipes.
+
+00:28:28.360 --> 00:28:32.479
+This is why I am contextualizing
+
+00:28:32.480 --> 00:28:35.439
+Emacs inside of Blee and BISOS.
+
+00:28:35.440 --> 00:28:37.999
+That is what they are for.
+
+00:28:38.000 --> 00:28:40.424
+And that is why I consider them
+
+00:28:40.425 --> 00:28:43.199
+immediately relevant to this presentation.
+
+00:28:43.200 --> 00:28:47.719
+With an incredibly powerful Display Engine,
+
+00:28:47.720 --> 00:28:51.279
+and an incredibly powerful Elisp Engine,
+
+00:28:51.280 --> 00:28:55.039
+and an incredibly powerful Input Methods Engine,
+
+00:28:55.040 --> 00:28:59.559
+and an incredibly powerful Common-Agents paradigm,
+
+00:28:59.560 --> 00:29:02.707
+Emacs has the potential of being
+
+00:29:02.708 --> 00:29:06.407
+any non-proprietary digital ecosystem's
+
+00:29:06.408 --> 00:29:08.879
+preferred usage environment.
+
+00:29:08.880 --> 00:29:14.090
+I am in favor of putting more around Emacs
+
+00:29:14.091 --> 00:29:17.440
+and strengthening integration of Emacs
+
+00:29:17.441 --> 00:29:19.719
+with Debian, explicitly,
+
+00:29:19.720 --> 00:29:22.839
+perhaps even at the cost of
+
+00:29:22.840 --> 00:29:26.599
+de-emphasizing its multi-platform attribute.
+
+00:29:26.600 --> 00:29:30.319
+A smaller Emacs is a better Emacs.
+
+00:29:30.320 --> 00:29:33.719
+Notice that in this slide,
+
+00:29:33.720 --> 00:29:37.279
+I have used many arrows in many colors.
+
+00:29:37.280 --> 00:29:45.599
+Much of Emacs's power comes from its ability
+
+00:29:45.600 --> 00:29:47.759
+to absorb and to integrate.
+
+00:29:47.760 --> 00:29:51.919
+Tomohiro is right on the mark when he says,
+
+00:29:51.920 --> 00:29:55.359
+"The reason why Emacs platform is good
+
+00:29:55.360 --> 00:29:58.119
+is that it cooperates with OS,
+
+00:29:58.120 --> 00:30:00.919
+not because it is good by itself."
+
+00:30:00.920 --> 00:30:03.999
+I am suggesting that we should
+
+00:30:04.000 --> 00:30:06.519
+raise the bar from the OS
+
+00:30:06.520 --> 00:30:09.839
+to the entirety of our digital ecosystem.
+
+00:30:09.840 --> 00:30:13.039
+There are many models
+
+00:30:13.040 --> 00:30:15.839
+for Emacs to cooperate with the OS
+
+00:30:15.840 --> 00:30:19.319
+and with applications and with services.
+
+00:30:19.320 --> 00:30:25.439
+The colors of arrows in the previous slide correspond to
+
+00:30:25.440 --> 00:30:28.879
+the model of interface of the common-agent:
+
+00:30:28.880 --> 00:30:33.999
+for example, sub-process invocation, pipe-based
+
+00:30:34.000 --> 00:30:39.359
+asynchronous interface, or file-based interactions.
+
+NOTE Consistent configuration
+
+00:30:39.360 --> 00:30:44.759
+One important aspect of common-agent paradigm is that
+
+00:30:44.760 --> 00:30:50.399
+both the common-agent and its Emacs App
+
+00:30:50.400 --> 00:30:53.039
+need to be configured consistently.
+
+00:30:53.040 --> 00:30:57.959
+In MARMEE and Blee-Gnus,
+
+00:30:57.960 --> 00:31:01.919
+we use File-Params to accomplish this.
+
+00:31:01.920 --> 00:31:06.959
+In BISOS, there is a Python interface to File-Params,
+
+00:31:06.960 --> 00:31:10.239
+there is a Bash interface to File-Params,
+
+00:31:10.240 --> 00:31:15.719
+and in Blee, there is an Elisp interface to File-Params.
+
+00:31:15.720 --> 00:31:18.919
+So, configurations are extended.
+
+00:31:18.920 --> 00:31:23.279
+Furthermore, File-Params can be encrypted,
+
+00:31:23.280 --> 00:31:26.959
+and credentials can be protected and shared.
+
+00:31:26.960 --> 00:31:33.919
+This is a significant improvement over .authinfo
+
+00:31:33.920 --> 00:31:36.959
+and its more recent incarnations.
+
+NOTE Feedback and requests
+
+00:31:36.960 --> 00:31:41.199
+EmacsConf could be a great place
+
+00:31:41.200 --> 00:31:44.374
+for users to provide feedback to developers
+
+00:31:44.375 --> 00:31:47.879
+and for developers to suggest to developers.
+
+00:31:47.880 --> 00:31:52.759
+In that spirit, my primary audience in this part
+
+00:31:52.760 --> 00:31:54.839
+are fellow Emacs developers.
+
+00:31:54.840 --> 00:32:00.039
+BISOS-MARMEE and Blee-Gnus are starting points.
+
+00:32:00.040 --> 00:32:02.439
+We can collectively work
+
+00:32:02.440 --> 00:32:04.679
+towards improving what is in place.
+
+00:32:04.680 --> 00:32:07.919
+Some such improvements involve
+
+00:32:07.920 --> 00:32:11.919
+collaboration among various Emacs developers.
+
+00:32:11.920 --> 00:32:16.599
+Here, I am making some explicit requests
+
+00:32:16.600 --> 00:32:19.559
+from some of the relevant emacs developers.
+
+00:32:19.560 --> 00:32:24.159
+At most, these are requests and invitations.
+
+00:32:24.160 --> 00:32:28.519
+For each of these requests, I am providing links
+
+00:32:28.520 --> 00:32:30.119
+for additional details.
+
+00:32:30.120 --> 00:32:33.039
+In due course, I'll follow up
+
+00:32:33.040 --> 00:32:35.279
+in the Emacs developers mailing list.
+
+NOTE X-Message-SMTP-Method: qmail
+
+00:32:35.280 --> 00:32:41.879
+Gnus uses X-Message-SMTP-Method
+
+00:32:41.880 --> 00:32:45.119
+for selection of Mail-Sending-Agent.
+
+00:32:45.120 --> 00:32:50.519
+Even though all the qmail injection code is still in Gnus,
+
+00:32:50.520 --> 00:32:58.279
+support for "X-Message-SMTP-Method: qmail" is missing.
+
+00:32:58.280 --> 00:33:02.759
+It takes 2 lines of code to revive it.
+
+00:33:02.760 --> 00:33:07.399
+With regards to (1), qmail was previously supported in Gnus.
+
+00:33:07.400 --> 00:33:11.319
+Lars, can you please reactivate it? Thanks.
+
+NOTE X-Message-Send-Method
+
+00:33:11.320 --> 00:33:16.439
+(2) is a terminology suggestion.
+
+00:33:16.440 --> 00:33:21.559
+The term X-Message-SMTP-Method violates conceptual layering.
+
+00:33:21.560 --> 00:33:27.079
+Please consider changing it to X-Message-Send-Method.
+
+00:33:27.080 --> 00:33:33.719
+In a Split-MUA setup, Gnus need not know about SMTP at all.
+
+00:33:33.720 --> 00:33:36.599
+We just need to pass information
+
+00:33:36.600 --> 00:33:39.319
+to a Mail-Sending-Agent selector.
+
+NOTE Sharing config info and secrets with common agents
+
+00:33:39.320 --> 00:33:44.439
+(3) is simply a design suggestion for
+
+00:33:44.440 --> 00:33:46.759
+which I prepared the context.
+
+00:33:46.760 --> 00:33:51.839
+.authinfo and Emacs auth-source library
+
+00:33:51.840 --> 00:33:54.199
+are too Emacs-centric.
+
+00:33:54.200 --> 00:33:57.839
+We need to share config info and secrets
+
+00:33:57.840 --> 00:34:00.799
+between common-agents and Emacs.
+
+00:34:00.800 --> 00:34:03.639
+The File Parameters approach
+
+00:34:03.640 --> 00:34:05.799
+can be a general-purpose solution.
+
+00:34:05.800 --> 00:34:10.839
+Is it reasonable to extend auth-source library to
+
+00:34:10.840 --> 00:34:12.719
+support File Params?
+
+00:34:12.720 --> 00:34:16.519
+I'll cover (4) in the next slide.
+
+00:34:16.520 --> 00:34:21.159
+(5) is a philosophical common suggestion
+
+00:34:21.160 --> 00:34:26.439
+to all Emacs developers. We need to better cultivate
+
+00:34:26.440 --> 00:34:30.879
+the model of Common-Agents integration with Emacs.
+
+00:34:30.880 --> 00:34:39.599
+And here are the same links as a native Reveal slide.
+
+NOTE message-polymode
+
+00:34:39.600 --> 00:34:42.799
+A mail message comprises of
+
+00:34:42.800 --> 00:34:45.599
+Envelope, Header and BodyParts.
+
+00:34:45.600 --> 00:34:49.439
+Each of these have their own syntax (their own mode).
+
+00:34:49.440 --> 00:34:53.639
+Conceivably Each BodyPart has its own mode.
+
+00:34:53.640 --> 00:34:59.439
+So, we need to evolve Message-Mode into Message-Polymode.
+
+00:34:59.440 --> 00:35:03.719
+More or less by default, org-mode has become
+
+00:35:03.720 --> 00:35:08.999
+the beginnings of "Emacs Native Markup Language -- ENML".
+
+00:35:09.000 --> 00:35:14.399
+With org-msg you can write your emails in org-mode ---
+
+00:35:14.400 --> 00:35:16.559
+destined as html.
+
+00:35:16.560 --> 00:35:19.559
+org-msg needs to become
+
+00:35:19.560 --> 00:35:22.239
+an integral part of Message-Polymode.
+
+00:35:22.240 --> 00:35:25.119
+It would be heavenly
+
+00:35:25.120 --> 00:35:29.959
+if Lars, Jérémy and Vitalie could collaborate
+
+00:35:29.960 --> 00:35:34.079
+and give us the needed Message-Polymode. Thank you.
+
+NOTE Vertical slice use cases
+
+00:35:34.080 --> 00:35:38.119
+One way to verify that we have not gone astray
+
+00:35:38.120 --> 00:35:42.759
+in our horizontal bigger pictures is to verify them
+
+00:35:42.760 --> 00:35:46.919
+through the concept of "Vertical Slice Use Cases".
+
+00:35:46.920 --> 00:35:50.799
+Let one use case be reading and writing
+
+00:35:50.800 --> 00:35:54.639
+of mail on multiple gmail accounts with Gnus.
+
+00:35:54.640 --> 00:35:59.319
+Google now requires use of oauth2 tokens
+
+00:35:59.320 --> 00:36:02.439
+which MARMEE can do outside of emacs.
+
+00:36:02.440 --> 00:36:05.679
+There is a recent email thread
+
+00:36:05.680 --> 00:36:09.119
+on that in the emacs-devel mailing list.
+
+00:36:09.120 --> 00:36:14.279
+Let another use case be that of tracking delivery
+
+00:36:14.280 --> 00:36:18.679
+and non-delivery reports for custom envelope addresses
+
+00:36:18.680 --> 00:36:26.039
+of byname.net (part of ByStar) autonomous mail services.
+
+00:36:26.040 --> 00:36:30.319
+I would have loved to walk you through these
+
+00:36:30.320 --> 00:36:32.959
+vertical slice use cases
+
+00:36:32.960 --> 00:36:36.439
+as screen captures of my Blee environment.
+
+00:36:36.440 --> 00:36:40.639
+For that, I need at least another 20 minutes.
+
+00:36:40.640 --> 00:36:43.079
+But my time is up.
+
+00:36:43.080 --> 00:36:46.719
+So, let's consider this as the first
+
+00:36:46.720 --> 00:36:48.919
+in a series of presentations
+
+00:36:48.920 --> 00:36:51.799
+where next in this series could be
+
+00:36:51.800 --> 00:36:55.479
+the mentioned two vertical slice use cases.
+
+00:36:55.480 --> 00:36:59.279
+Perhaps there could be another presentation
+
+00:36:59.280 --> 00:37:02.879
+on this topic in EmacsConf 2023.
+
+00:37:02.880 --> 00:37:06.759
+This document was produced entirely with
+
+00:37:06.760 --> 00:37:10.799
+Libre-Halaal Software, and is published using
+
+00:37:10.800 --> 00:37:13.079
+Libre-Halaal Internet Services.
+
+00:37:13.080 --> 00:37:17.959
+I want to thank all the EmacsConf Organizers
+
+00:37:17.960 --> 00:37:19.519
+for their great work,
+
+00:37:19.520 --> 00:37:30.960
+and Sacha, Leo, and Amin in particular.
diff --git a/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers--chapters.vtt b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers--chapters.vtt
new file mode 100644
index 00000000..14147527
--- /dev/null
+++ b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers--chapters.vtt
@@ -0,0 +1,44 @@
+WEBVTT
+
+
+00:00:18.720 --> 00:02:07.680
+Short recap of what the talk was about?
+
+00:02:09.280 --> 00:04:03.914
+What's the incentive to pay?
+
+00:04:04.014 --> 00:04:23.205
+What do you think of projects like OpenQ?
+
+00:04:23.305 --> 00:07:39.789
+Are you aware of SourceCred?
+
+00:07:39.889 --> 00:08:58.080
+How is this different from money?
+
+00:08:58.080 --> 00:10:33.899
+How would you approach a viable experiment for ABE?
+
+00:10:33.999 --> 00:13:28.080
+How do you constrain the cognitive and time burdens of deciding the values of attributed contributions?
+
+00:13:29.360 --> 00:16:29.720
+How are the attribution amounts calculated?
+
+00:16:29.820 --> 00:17:27.360
+Synchronicity with Bastien's talk last year
+
+00:17:28.960 --> 00:21:15.920
+What are your assumptions about human nature?
+
+00:21:17.680 --> 00:21:44.902
+What is the URL of the project?
+
+00:21:45.002 --> 00:22:29.420
+Check out the prototype, "Old Abe"
+
+00:22:29.520 --> 00:23:50.320
+Closing Remarks
+
+00:23:50.320 --> 00:25:09.280
+A flicker of light and following your curiosity
diff --git a/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.vtt b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.vtt
new file mode 100644
index 00000000..80a659b8
--- /dev/null
+++ b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.vtt
@@ -0,0 +1,806 @@
+WEBVTT
+
+00:00.000 --> 00:08.160
+Okay, so we seem to be back. Sorry for the little shuffling chairs around. We are now live with
+
+00:08.160 --> 00:16.400
+Sid. Hi, Sid. Let me contextualize a little bit for the people because we are on Gen right now
+
+00:16.400 --> 00:00:18.620
+and the talk was happening on Dev.
+
+NOTE Short recap of what the talk was about?
+
+00:00:18.720 --> 00:00:22.800
+Sid, can I ask you explaining what your talk was about in about
+
+00:22.800 --> 00:28.560
+one to two minutes? Yes, sure. The talk was called Maintaining the Maintainer's Attribution
+
+00:28.560 --> 00:35.200
+as a Model for Open Source Projects, and the idea is that instead of having an economic system based
+
+00:35.200 --> 00:40.160
+on supply and demand, which is capitalism, we have an economic system based on attribution
+
+00:40.160 --> 00:47.120
+and agreement, the power of our words, taking on incentives in the world, and that this can work
+
+00:47.120 --> 00:52.240
+for open source projects as a proving ground, and I think it can scale beyond that, and I hope it
+
+00:52.240 --> 00:59.920
+will scale beyond that in general. Okay, well I think you did, I'm not sure if you rehearsed
+
+00:59.920 --> 01:05.040
+this before, but that was such a perfect elevator speech for your talk. I am beyond amazed.
+
+01:06.720 --> 01:10.960
+Thank you, thank you. It's the adrenaline from being late and all the time zone shifting.
+
+01:12.080 --> 01:19.920
+You're not supposed to mention this, you know. You know, the things we keep telling people,
+
+01:19.920 --> 01:24.560
+you know, is that EmacsConf, yes, you see us rustling and being really grumpy when we don't
+
+01:24.560 --> 01:30.640
+get prereq, but really the live event is one part of EmacsConf, but really the better part of it is
+
+01:30.640 --> 01:37.600
+just having all the talks out of the head of people online, easily viewable, easily accessible
+
+01:37.600 --> 01:42.000
+with subtitles and stuff like this. So don't worry, it's fine if you're all right for submitting a
+
+01:42.000 --> 01:46.720
+prereq, it's fine if you don't show up to the Q&A, eventually we will find you, we will ask you the
+
+01:46.720 --> 01:51.840
+questions and all the data will be out there, so don't worry about it. Yeah, the magic of editing
+
+01:51.840 --> 01:57.360
+and stuff like that, you know. Yes, but we don't have it now, so we'll have to stick, you know,
+
+01:57.360 --> 02:02.800
+time is going to dilute, we'll have to stick with strict adherence to chronology right now. So
+
+02:02.800 --> 02:07.680
+starting with Sid, do you want to take the first question on the pad? Okay, let's look at them.
+
+NOTE What's the incentive to pay?
+
+02:09.280 --> 02:14.960
+So the first question is, this seems to assume that there will be money contributions commensured
+
+02:14.960 --> 02:20.400
+with the value of the project versus everyone freeloading because there's no incentive to pay.
+
+02:21.840 --> 02:26.400
+Right, so actually there is an incentive to pay, so I think what the question is referring to
+
+02:26.400 --> 02:32.720
+is that everyone is going to pay to other projects, or no one is going to pay to projects because
+
+02:32.720 --> 02:38.080
+they're free anyway and you can use them and you don't have to pay, but one of the new things
+
+02:38.080 --> 02:43.920
+with attribution-based economics is the idea that in open source projects we agree, we all
+
+02:43.920 --> 02:50.400
+collectively agree on a fair market price for a project, and this isn't a price in the sense that
+
+02:50.400 --> 02:55.200
+you are prohibited from using the product until you pay the price, but rather it's for an accounting
+
+02:55.200 --> 02:59.920
+purpose, which is that if you pay more than that price, then that means you are now an investor,
+
+03:00.480 --> 03:06.080
+and so you can sort of, that means you are now attributable in future revenues that come to the
+
+03:06.080 --> 03:11.520
+project. So if you think there's a project that's going to do some nice things, you can essentially
+
+03:11.520 --> 03:16.160
+buy shares in it, except these are not ownership shares, they're shares and attribution because
+
+03:16.160 --> 03:22.240
+you contribute value by contributing money and that's attributable, so there is an incentive
+
+03:22.240 --> 03:30.720
+to pay, and I think, but also beyond this, the financial model is incredibly complex,
+
+03:30.720 --> 03:36.160
+it is much simpler than what we have today in a capitalist world, but still finance is a very
+
+03:36.160 --> 03:43.040
+complex thing, and I think we're in the very very early stages of figuring out the financial model,
+
+03:43.040 --> 03:48.480
+and I think there's a number, there's tons of open questions, needs a lot of help from people
+
+03:49.520 --> 03:56.480
+to figure these out, so there's promising angles here, but I think we have a lot to work out as
+
+03:56.480 --> 04:03.360
+well. Should I go to the second question? Yeah, feel free to do so, you are the master, you're
+
+04:03.360 --> 00:04:03.914
+in Q&A.
+
+NOTE What do you think of projects like OpenQ?
+
+00:04:04.014 --> 00:04:11.040
+Okay, so the second question is, are you aware of projects like OpenQ, would that fit the
+
+04:11.040 --> 04:18.960
+model in your opinion? I'm actually not familiar with OpenQ, so maybe I should just move on to the
+
+04:18.960 --> 00:04:23.205
+next question and come back to that if we have time. Sure.
+
+NOTE Are you aware of SourceCred?
+
+00:04:23.305 --> 00:04:25.840
+The next one says, I see incredible
+
+04:25.840 --> 04:30.800
+amounts of overlap with the source cred system, where attribution of antecedents, graph of
+
+04:30.800 --> 04:36.640
+contributions, fair in hindsight, backpropagation. Oh, backpropagation, interesting. I'm sensing a
+
+04:36.640 --> 04:40.560
+pattern though, so you are being exposed to stuff that you do not know, which is amazing, that
+
+04:40.560 --> 04:45.760
+brings an opportunity to do research later on, but feel free to delay those questions until,
+
+04:45.760 --> 04:49.920
+perhaps, I would invite the people who ask those questions in the pad maybe to describe in a little
+
+04:49.920 --> 04:55.520
+blurb that Sid can read, what is the meaning of those particular platforms, and in the meantime,
+
+04:55.520 --> 05:00.000
+Sid, you can move on to the next questions. Sure, but I will say one thing on the subject of both
+
+05:00.000 --> 05:07.200
+of these things, which is that I think it's significantly underappreciated the extent to which
+
+05:07.200 --> 05:13.040
+value is created in the world that is both independently created of other value that happens
+
+05:13.040 --> 05:20.720
+to be very similar, as well as dependently related and that may be unknown, and this is something
+
+05:20.720 --> 05:26.720
+that I call subliminal transmission, which is like if you think about a turbulent flow,
+
+05:26.720 --> 05:30.800
+you know, and that's what our world is, you know, we like to have all these linear narratives and
+
+05:30.800 --> 05:37.840
+simple stories where I think if you take all of Wikipedia, right, even a single person's life
+
+05:37.840 --> 05:42.240
+has more information and richness than all of Wikipedia, so when you think about it in those
+
+05:42.240 --> 05:47.920
+terms, you realize just how small our stories are in expressing what really happens and what has
+
+05:47.920 --> 05:53.040
+really happened in the world, so from that perspective, I think there's this thing called
+
+05:53.040 --> 05:58.720
+subliminal transmission, which is like a turbulent flow where you have little vortices that appear
+
+05:58.720 --> 06:02.480
+here and then they disappear, they're gone, but then you see them again here and they're like
+
+06:02.480 --> 06:05.600
+bigger, but they're the same, and then you see them in a different place and they're not the
+
+06:05.600 --> 06:11.440
+same, they're different, yet somehow the same, and I think our world is like that, and if we have
+
+06:11.440 --> 06:16.960
+an economic system that's capable of not saying that, oh, it should be this other way, which it
+
+06:16.960 --> 06:22.480
+isn't, but in fact we see this is how it is, let's make sure that we recognize this and empower the
+
+06:22.480 --> 06:29.440
+right voices, given that this is how the world is, and from that perspective, I think projects like
+
+06:29.440 --> 06:34.320
+OpenQ and SourceCred and any number of others might exist which are creating value in the world,
+
+06:34.320 --> 06:39.360
+and I think that we all deserve to be empowered, you know, if we're creating similar kinds of
+
+06:39.360 --> 06:44.320
+value, then these are voices that have something useful to say for us moving forward, and they
+
+06:44.320 --> 06:50.640
+deserve to be empowered, so yeah, it doesn't have to be causally related, you know, you can have
+
+06:50.640 --> 06:56.080
+empowerment of all of these different projects because they work together, so yeah, very long
+
+06:56.080 --> 07:00.720
+-winded answer to a short question, or non-question, meta-question.
+
+07:00.720 --> 07:04.480
+You're fine, you can be as long-winded as you want, because honestly you have been so
+
+07:04.480 --> 07:10.080
+eloquent in your answer, and the little ingestors that accompany these little vertices
+
+07:11.440 --> 07:15.520
+do carry on with as much velocity as you want. We will be going until about
+
+07:15.520 --> 07:20.880
+52-53 of the current hours, which means we have about 20 more minutes. Also, we have a lot of
+
+07:20.880 --> 07:25.600
+questions in the pad, so I would prefer if Sid started answering the questions over the pad first,
+
+07:25.600 --> 07:30.400
+but we are going to be opening the pad in about six to seven minutes if you want to join and ask
+
+07:30.400 --> 07:35.520
+questions live to Sid, but in the meantime, Sid, sorry, I'm getting tired, it's late, in the meantime,
+
+07:35.520 --> 00:07:39.789
+Sid, feel free to answer more questions. Sure, okay, thank you.
+
+NOTE How is this different from money?
+
+00:07:39.889 --> 00:07:41.280
+The next question is,
+
+07:41.280 --> 07:46.480
+how is this different from money? Not in some abstract ownership versus attribution way.
+
+07:46.480 --> 07:52.000
+Open-source funding is an incentive problem, which this does not change as far as I can see.
+
+07:54.000 --> 08:00.960
+So, on the one hand, it does add new incentives, as we talked about. I'm not sure about the question
+
+08:00.960 --> 08:06.800
+of how this is different from money. This isn't proposing to replace money in any way.
+
+08:06.800 --> 08:13.920
+Rather, it employs money as, you know, the mechanism by which we recognize value. I think
+
+08:13.920 --> 08:23.440
+money is perhaps something that can be revisited and, you know, reflected upon in the future,
+
+08:23.440 --> 08:28.960
+but I don't think we need to do that at this stage. At this stage, I'm content to rest on the
+
+08:28.960 --> 08:33.520
+black box abstractions of certain things that we've already developed, like money,
+
+08:33.520 --> 08:37.600
+as a means of exchange and as a means of recognizing value, and I think we can use that,
+
+08:37.600 --> 08:43.440
+so I'm not trying to replace money. Open-source funding is an incentive program. This doesn't
+
+08:43.440 --> 08:47.680
+change incentives, so I think we already covered how it does add incentives in the sense that you
+
+08:47.680 --> 08:53.520
+can invest in open-source projects, which is a new incentive, and, you know, we also talked about
+
+08:53.520 --> 08:58.080
+how there are some unopened questions. I'm not sure if this is one of them.
+
+NOTE How would you approach a viable experiment for ABE?
+
+08:58.080 --> 09:07.680
+How would you approach a viable experiment? So, the prototype that we have, that we talked about
+
+09:07.680 --> 09:13.760
+in the talk, so there's a prototype, for those who didn't watch the talk. We have an open-source
+
+09:14.560 --> 09:19.520
+project, you know, it's a GitHub action, and, you know, I love to support other platforms. I'm not
+
+09:19.520 --> 09:24.960
+married to GitHub in any way. I don't have any special affection for GitHub. I don't have any
+
+09:24.960 --> 09:31.520
+special affection for GitHub. But it's a GitHub action at the moment, and what it will do is,
+
+09:31.520 --> 09:37.120
+when you follow all of the processes in the Constitution, which says, you know,
+
+09:37.120 --> 09:43.360
+open-source repository, create an issue that solicits related work reports from members of
+
+09:43.360 --> 09:49.600
+the public, and then create this folder structure which has a report of the contributors and this
+
+09:49.600 --> 09:55.440
+and that, once you do all of that, like initial logistical work, this GitHub action will process
+
+09:55.440 --> 10:00.720
+fresh payments that come in, which you report as single line item files, text files. Everything is
+
+10:00.720 --> 10:07.360
+text input and output, and then, you know, you can basically get all the accounting done for you by
+
+10:07.360 --> 10:14.960
+this system. So, that's what the nature of the experiment is, and I think we're starting with
+
+10:14.960 --> 10:19.840
+just one or two repos, because there's tremendous number of unresolved questions, and it's all going
+
+10:19.840 --> 10:27.360
+to be resolved through dialogue, agreement. We all decide how this thing works, and I think,
+
+10:27.360 --> 00:10:33.899
+you know, there's, yeah, so we'll see about how the experiment goes.
+
+NOTE How do you constrain the cognitive and time burdens of deciding the values of attributed contributions?
+
+00:10:33.999 --> 00:10:36.400
+Next question, given that
+
+10:36.400 --> 10:45.040
+oversight is a social process, how do you constrain the cognitive and time burdens of deciding the
+
+10:45.040 --> 10:54.080
+values of attributed contributions? Okay, this is a great question. So, first of all, you know,
+
+10:54.080 --> 11:00.080
+let's talk about long-term vision, right? Long-term vision, I don't imagine that any of us, that is,
+
+11:00.080 --> 11:04.160
+the actual contributors to the projects, are going to have to worry about this at all.
+
+11:04.160 --> 11:08.240
+We're not going to have to engage in this process of what is called dialectical inheritance
+
+11:08.240 --> 11:13.440
+attribution, which is, you know, it's a lot of work. There's all these standards and precedents,
+
+11:13.440 --> 11:18.800
+and how do you compare ideas versus works versus the materials that went into the project? It's a
+
+11:18.800 --> 11:24.400
+very hard problem, and I think it's something we'll be improving upon for possibly even decades.
+
+11:25.200 --> 11:30.000
+But at that stage, I believe there will be experts, much like today's investment bankers
+
+11:30.000 --> 11:36.400
+and lawyers, investment IP lawyers. These are the people who are going to specialize in it,
+
+11:36.400 --> 11:40.880
+going to be professionals, and that's the kind of work that they're going to do, and we can leave it
+
+11:40.880 --> 11:48.000
+to them. But at this stage, yes, we have to do it. We have to set these principles and standards in
+
+11:48.000 --> 11:55.840
+place. And how do we constrain that? We start with simple heuristics. So, initially, we want to have,
+
+11:55.840 --> 11:59.680
+you know, if you can imagine, this is, I don't know, this is probably a bad metaphor, but if you have,
+
+11:59.680 --> 12:07.040
+like, a big hole and you're trying to patch it, you know, if you put, like, little tiny things on
+
+12:07.040 --> 12:12.240
+it and try to focus on little tiny things, okay, what I'm trying to say is order of magnitude,
+
+12:12.240 --> 12:19.280
+right? Let's solve the problem at the first order of magnitude and then get the little harmonics
+
+12:19.280 --> 12:27.520
+and, like, solve those over time. So, basically, we want to have usable, workable heuristics that
+
+12:27.520 --> 12:33.760
+are low maintenance that solve the majority of the problem for our immediate purposes and then
+
+12:33.760 --> 12:40.960
+iterate on those over time and develop proper models, which I think we will start to do in the
+
+12:40.960 --> 12:47.040
+next phase. The initial phase is heuristics that are easy and low maintenance and useful.
+
+12:47.040 --> 12:53.600
+Right, Sid, I just want to barge in a little bit. I just want to let people know that we have opened
+
+12:53.600 --> 13:00.000
+up the Q&A BBB window right now, so the same spiel as usual. If you want to join Sid and ask questions
+
+13:00.000 --> 13:04.160
+directly, we still have some questions in the pad. Don't worry, Sid will get to them first.
+
+13:04.160 --> 13:09.040
+But if you want to join and have a discussion with Sid, we have until about, we've got about
+
+13:09.040 --> 13:14.240
+20, 18 minutes left of discussion there. So, please do not hesitate. This is a very interesting talk.
+
+13:14.240 --> 13:19.840
+We have a very interesting speaker as well. So, use this opportunity, please. In the meantime,
+
+13:19.840 --> 13:24.720
+Sid, you can answer more questions. Sure. Should we take one from the field?
+
+13:25.360 --> 13:28.080
+I guess while people are thinking about it, I'll take one more question, maybe.
+
+NOTE How are the attribution amounts calculated?
+
+13:29.360 --> 13:37.440
+Okay. So, the next question is, how are the attribution amounts calculated?
+
+13:37.440 --> 13:42.960
+Okay, how are the attribution amounts calculated? This is going to be done through standards.
+
+13:42.960 --> 13:49.040
+So, there is a, there's a repo, you know, if you go to the github.org account, dream-org,
+
+13:49.040 --> 13:57.760
+d-r-y-m-dash-org-slash-foundation. This contains the founding documents of how we will manage this
+
+13:57.760 --> 14:04.080
+process. And it can, it is, it will contain more standards. It has a few at the moment, very high
+
+14:04.080 --> 14:10.240
+level ones, but we will keep adding more standards there that are general enough to be universally
+
+14:10.240 --> 14:16.880
+applicable, and that can be specialized to the individual projects. And the attribution is going
+
+14:16.880 --> 14:22.400
+to be decided by these standards, by the members of the public, members of the community.
+
+14:22.400 --> 14:28.240
+Yeah. And they calculate, they must add up to 100%. So, it's, you know, and that's okay, actually,
+
+14:28.240 --> 14:36.080
+I should say. One of the mechanisms by which attribution will be done initially is this heuristic
+
+14:36.080 --> 14:45.040
+procedure called the Analyze, Appraise, Anonymize Attribute Loop. What that means is we first
+
+14:45.040 --> 14:49.600
+analyze the project, decompose it into its components, and we can do any number of such
+
+14:49.600 --> 14:53.280
+analyses, any number of people can do these analyses, and there can be a decision procedure
+
+14:53.280 --> 14:58.320
+for combining them. But that, I digress. We'll keep it simple first. We analyze the project into its
+
+14:58.320 --> 15:05.520
+components, then we agree on the proportion of value contributed by each of those components,
+
+15:05.520 --> 15:10.480
+then we analyze the activities done by the contributors, and then we analyze the
+
+15:10.480 --> 15:15.120
+activities done by the contributors and anonymize them. And we say, this was done, this was done,
+
+15:15.120 --> 15:20.240
+this was done, this was done. This is how much proportion of value these activities contribute
+
+15:20.240 --> 15:24.720
+to each of these components. And then once you have this chart, this graph of all of these
+
+15:24.720 --> 15:32.880
+connections and proportions of value, then you anonymize and you aggregate the sum of proportions
+
+15:32.880 --> 15:38.480
+of value by contributor. And contributor is not necessarily a person, a contributor is a
+
+15:38.480 --> 15:45.040
+project, it can be an antecedent, it doesn't have to be a direct contributor to the project,
+
+15:45.040 --> 15:50.160
+it doesn't have to be someone who wrote code, it can be a person who created a bug report,
+
+15:50.160 --> 15:57.200
+or a person who had a good idea for the design. And anyway, so once you do this, you aggregate
+
+15:57.200 --> 16:02.800
+by contributor, you have a set of proportions that total up to one, or a set of percentages
+
+16:02.800 --> 16:09.920
+that total up to 100, that dictate how the revenues that come into the project are to
+
+16:09.920 --> 16:21.760
+be divided amongst all of these antecedents and contributors. Let's see, what's the next question?
+
+16:22.800 --> 16:26.240
+Okay, the next question is being written down as we speak.
+
+16:26.240 --> 00:16:29.720
+It's fine, we can wait a little bit.
+
+NOTE Synchronicity with Bastien's talk last year
+
+00:16:29.820 --> 00:16:33.200
+In the meantime, I'll just mention,
+
+16:35.360 --> 16:41.360
+so actually, when we keep track of presentation for Emacs, we do have slugs for them. And this
+
+16:41.360 --> 16:47.440
+year, the slug for your talk, Sid, was made. And it was not an anodyne choice, because last year,
+
+16:47.440 --> 16:53.360
+we also had another talk by a maintainer, or well, the org maintainer, or one of the org maintainers,
+
+16:53.360 --> 16:59.520
+Bastien Guerri. And it feels like Bastien's talk was mostly geared towards sustaining
+
+16:59.520 --> 17:05.360
+maintenance, and your is more about maintaining the software effort in general. And it feels like
+
+17:05.360 --> 17:13.280
+the two talks are related, but yours seems to be more, I wouldn't say visionary, I think they are
+
+17:13.280 --> 17:17.120
+very complimentary in nature. I'm not sure, have you been able to watch Bastien's talk from last
+
+17:17.120 --> 17:22.080
+year? I have not, but that sounds very interesting. I'll definitely check it out after this.
+
+17:22.080 --> 17:27.360
+Right. And I will now stop my blabbering, and you can answer the last question.
+
+NOTE What are your assumptions about human nature?
+
+17:28.960 --> 17:32.640
+The last question is, what are your assumptions about human nature,
+
+17:33.280 --> 17:42.000
+vis-a-vis self-interest versus altruism? The funny thing is, I don't actually feel like
+
+17:42.000 --> 17:50.000
+we need to opine on that, from the perspective of an economic system. I mean, yes, we have to
+
+17:50.000 --> 17:55.360
+recognize that, you know, some people will say, oh, human nature is fundamentally selfish, or,
+
+17:55.360 --> 18:00.320
+you know, we have to be good, and we have to help each other. And I think both of these perspectives
+
+18:00.320 --> 18:07.360
+are not necessarily, you know, I don't know if they're necessarily the right way to think about
+
+18:07.360 --> 18:13.040
+it, because you have the idea about, well, capitalism assumes people are fundamentally
+
+18:13.040 --> 18:17.840
+selfish, or they have to act that way in order to be rational in the system. That's one side of it.
+
+18:17.840 --> 18:22.800
+The other side of it is this notion of altruism, right, that somehow you have to help others,
+
+18:22.800 --> 18:28.320
+and that, you know, there's like a charitable component, and you have all these people who
+
+18:28.960 --> 18:33.520
+make billions and billions of dollars, and then, you know, start giving that away. Which,
+
+18:33.520 --> 18:36.880
+you know, if you're going to make billions and billions of dollars, and you give it away,
+
+18:36.880 --> 18:41.600
+and like help the world, that's better than not giving it away and not helping the world.
+
+18:41.600 --> 18:46.560
+On the other hand, the fact that you got those billions and billions of dollars in a capitalist
+
+18:46.560 --> 18:54.160
+economic system, which fundamentally skews the value recognition in ways that, you know, is very,
+
+18:54.160 --> 18:59.840
+very subversive and very, very minimizing of the source, the true sources of value,
+
+18:59.840 --> 19:06.160
+means that you've led yourself to go down this path and essentially unwittingly and inevitably
+
+19:06.160 --> 19:09.920
+ended up causing a lot of problems, too. Like, it's not necessarily the case that if you're
+
+19:09.920 --> 19:14.560
+wealthy in a capitalist economy, that you've created a lot of value, because yes, you have,
+
+19:14.560 --> 19:19.040
+but at the same time, the net value is not guaranteed to be above zero, really,
+
+19:20.320 --> 19:27.040
+because capitalism can't express all forms of value. So I don't think thinking about self-interest
+
+19:27.040 --> 19:35.680
+versus altruism is the right way to think about things from the perspective of economic systems.
+
+19:35.680 --> 19:42.480
+In an economic system where the incentives are so set up that the maximum value to all
+
+19:42.480 --> 19:47.840
+is recognized the most, then it's inevitable that people want to do that. And it doesn't mean that
+
+19:47.840 --> 19:51.280
+you're a naturalistic person or a selfish person. You're just going to do it because there are
+
+19:51.280 --> 20:00.240
+incentives that are set up that way that everybody agreed on. And I think in such a system, your own
+
+20:00.240 --> 20:07.040
+sort of spiritual inclinations towards this are secondary. Not secondary. I don't want to say
+
+20:07.040 --> 20:14.800
+secondary. I want to say that they are up to you. And your actions in the world will be rewarded to
+
+20:14.800 --> 20:20.320
+the extent that you help others. The more you give, the more you will be empowered. So from
+
+20:20.320 --> 20:25.280
+that perspective, you could say that the system rewards altruism. But at the same time, if you're
+
+20:25.280 --> 20:32.320
+just giving and you're not in a position where... I mean, the system ensures that if you give,
+
+20:32.320 --> 20:36.560
+you're also taken care of, so that you don't have to choose between altruism and selfishness.
+
+20:36.560 --> 20:44.160
+Altruism is empowering yourself. So that's kind of the beauty of this system, really. That's the
+
+20:44.160 --> 20:50.240
+beauty of an attribution-based system is that you become more empowered by giving more. But we don't
+
+20:50.240 --> 20:54.880
+have to get into the spirituality stuff of it, really. It's beside the point as far as the
+
+20:54.880 --> 21:02.400
+mechanisms of the economic system go. All right. I think that was the last question, unless I'm
+
+21:02.400 --> 21:09.920
+mistaken. That's the last one I see. Yes. Well, you did a fine job answering, however, many
+
+21:09.920 --> 21:15.920
+questions before. Again, very lengthy, as you said, but very eloquent, as I will say to you.
+
+NOTE What is the URL of the project?
+
+21:17.680 --> 21:22.080
+There is one question that appeared on ISE, which was the URL of the project. You mentioned
+
+21:22.080 --> 21:27.520
+dream.org. Would you be able to maybe type it out in the chat so that people can
+
+21:27.520 --> 21:32.640
+check it, and I'll place it on ISE for the person that was asking? Or on BBB, it's fine, too.
+
+21:34.000 --> 21:41.520
+It's actually dream-org. Oh, that's why I did dream.org, which was the problem.
+
+21:43.840 --> 00:21:44.902
+It's the GitHub repo.
+
+NOTE Check out the prototype, "Old Abe"
+
+00:21:45.002 --> 00:21:47.280
+And actually, sorry, you should also check out
+
+21:48.480 --> 21:55.840
+dream-org.old-abe. That is the billing prototype, which is the GitHub action,
+
+21:55.840 --> 22:01.520
+which you can add to your repo. And it's got all the startup instructions for how you can
+
+22:01.520 --> 22:08.720
+set up attribution-based economics. So I'll let you type it out. github.com slash dream
+
+22:10.480 --> 22:18.080
+dash org slash old-abe.
+
+22:18.080 --> 22:25.280
+It's good for you for remembering it. I will place this in BBB right now. Sorry,
+
+22:25.280 --> 00:22:29.420
+not in BBB, in the pad so that people can click on it.
+
+NOTE Closing Remarks
+
+00:22:29.520 --> 00:22:32.640
+Sid, is there anything else you'd like to
+
+22:32.640 --> 22:41.200
+say? We are about at the end of the Q&A right now. I guess attribution-based economics is open for
+
+22:41.200 --> 22:50.560
+business, as it were. So if you can go to some of the repos at the dream-org GitHub org account,
+
+22:51.280 --> 22:56.240
+many of those repos are starting attribution-based economics. And simx.el in particular is one for
+
+22:56.240 --> 23:00.560
+the Emacs community. So I encourage you guys. And of course, old-abe, that's another one that
+
+23:00.560 --> 23:04.560
+started. And that's the only one that's actually ready to accept payments and distribute payments,
+
+23:04.560 --> 23:09.120
+because we have done the attributions already, given that it was written in the last few days.
+
+23:09.120 --> 23:16.480
+But the other ones, we might start payments out, I think, on January 1. So between now and January
+
+23:16.480 --> 23:24.480
+1, we'll start doing the attribution process and deciding the antecedents, who's owed what,
+
+23:24.480 --> 23:28.080
+what proportion of value came from whom, and all that stuff between now and then. And then we're
+
+23:28.080 --> 23:36.880
+going to start paying out from the repositories January 1 is the plan. If you can contribute to
+
+23:36.880 --> 23:41.280
+these projects, then that would help prove the model out, and that would create incentives for
+
+23:41.280 --> 23:45.920
+people to join. So I encourage you to do so. Thank you. Well, thank you. You've definitely
+
+23:45.920 --> 23:50.320
+made a very nice case for it, and people can make their own minds now by checking the link.
+
+NOTE A flicker of light and following your curiosity
+
+23:50.320 --> 23:55.280
+We really encourage you to follow up on a lot of the talks. It's one thing. One thing that we always
+
+23:55.280 --> 24:02.080
+say with Sasha to the people, be they speakers, be they user group members, is that Emacs can't,
+
+24:02.080 --> 24:08.000
+and user groups, any kind of community activity for Emacs is about curiosity. And it's one thing
+
+24:08.000 --> 24:14.960
+to ignite the flame of curiosity in some peoples. It's actually much better to actually follow the
+
+24:14.960 --> 24:19.120
+fuse and see where it leads you. Because, you know, it's a little fuse, a little tiny flame,
+
+24:19.120 --> 24:24.000
+a flicker of a flame, a flicker of light going in a direction that might explode so much curiosity
+
+24:24.000 --> 24:32.960
+later down the line. I was talking earlier with Blaine about, you know, oh, last year he was
+
+24:32.960 --> 24:39.280
+presenting, it had only been six, it had only been, I can't speak English, it's 10.45 a.m. in
+
+24:39.280 --> 24:46.000
+my time zone. I'm starting to tire. But he had only started using Emacs six months prior to
+
+24:46.000 --> 24:51.040
+presenting, and he was already so proficient in it. And it feels like, it's kind of like in Lost,
+
+24:51.040 --> 24:55.280
+you know, when you have the rope and you pull on the rope and it brings you so far away. Well,
+
+24:55.280 --> 25:01.200
+do follow this curiosity, be it for what Sid has presented to you today, but for any of the topics
+
+25:01.200 --> 25:04.960
+that we've presented to you today. So thank you so much, Sid, for all your time, all your
+
+25:04.960 --> 25:09.280
+presentation, and your answers. Thank you so much, Leo. Appreciate it. Thanks for having me.
diff --git a/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main--chapters.vtt b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main--chapters.vtt
new file mode 100644
index 00000000..195fdb36
--- /dev/null
+++ b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main--chapters.vtt
@@ -0,0 +1,56 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:18.839
+Problems
+
+00:00:18.840 --> 00:00:30.839
+Solution?
+
+00:00:30.840 --> 00:00:55.839
+A common underlying problem
+
+00:00:55.840 --> 00:02:05.759
+Capitalism
+
+00:02:05.760 --> 00:03:49.839
+Copyright
+
+00:03:49.840 --> 00:05:01.759
+An attribution-based economic system is efficient
+
+00:05:01.760 --> 00:07:45.199
+Gyroscopes
+
+00:07:45.200 --> 00:09:05.919
+Prototypes
+
+00:09:05.920 --> 00:10:05.919
+Founding documents
+
+00:10:05.920 --> 00:10:24.319
+Declaration of non-ownership
+
+00:10:24.320 --> 00:11:23.239
+The financial model
+
+00:11:23.240 --> 00:12:49.119
+The attribution model
+
+00:12:49.120 --> 00:13:59.919
+The accounting system
+
+00:13:59.920 --> 00:15:17.599
+drym.org Github account
+
+00:15:17.600 --> 00:17:11.559
+Expanding the boundary
+
+00:17:11.560 --> 00:18:39.159
+Adopting this idea
+
+00:18:39.160 --> 00:19:04.079
+Closing thoughts
+
+00:19:04.080 --> 00:19:56.240
+Taking care of one another
diff --git a/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.vtt b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.vtt
new file mode 100644
index 00000000..3a907943
--- /dev/null
+++ b/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.vtt
@@ -0,0 +1,1192 @@
+WEBVTT captioned by sid
+
+NOTE Problems
+
+00:00:00.000 --> 00:00:06.319
+When we think about the problems of the world
+
+00:00:06.320 --> 00:00:12.119
+we see global warming, war, appropriation, poverty,
+
+00:00:12.120 --> 00:00:13.879
+and among numerous other problems,
+
+00:00:13.880 --> 00:00:16.199
+also the inability to make a living
+
+00:00:16.200 --> 00:00:18.839
+as an open source developer.
+
+NOTE Solution?
+
+00:00:18.840 --> 00:00:21.999
+Now this last problem may seem a lot less consequential
+
+00:00:22.000 --> 00:00:23.479
+compared to the other ones,
+
+00:00:23.480 --> 00:00:26.759
+but what if I told you that the solution to this problem
+
+00:00:26.760 --> 00:00:30.839
+and the solutions to the others are one and the same?
+
+NOTE A common underlying problem
+
+00:00:30.840 --> 00:00:33.479
+And it's because there's a common underlying problem
+
+00:00:33.480 --> 00:00:36.119
+at the heart of all of these problems.
+
+00:00:36.120 --> 00:00:39.279
+I'm going to tell you what that problem is in one sentence.
+
+00:00:39.280 --> 00:00:42.519
+You ready for it? It is ...
+
+00:00:42.520 --> 00:00:48.559
+the deviation of market value from _true_ value.
+
+00:00:48.560 --> 00:00:50.439
+Let's think about this in the context of
+
+00:00:50.440 --> 00:00:55.839
+existing economic systems such as capitalism and communism.
+
+NOTE Capitalism
+
+00:00:55.840 --> 00:00:58.679
+And of these, I want to focus on capitalism
+
+00:00:58.680 --> 00:01:01.999
+because it is the only nontrivial economic system, really.
+
+00:01:02.000 --> 00:01:04.799
+Communism is more sort of a political means
+
+00:01:04.800 --> 00:01:06.999
+to achieve economic ends.
+
+00:01:07.000 --> 00:01:09.079
+And the other economic systems exist
+
+00:01:09.080 --> 00:01:11.679
+sort of on a spectrum between these two.
+
+00:01:11.680 --> 00:01:14.319
+So let's focus on capitalism.
+
+00:01:14.320 --> 00:01:19.919
+Capitalism has as its basis of value supply and demand.
+
+00:01:19.920 --> 00:01:21.959
+And consequently, there is a great emphasis
+
+00:01:21.960 --> 00:01:25.199
+on this idea of ownership.
+
+00:01:25.200 --> 00:01:28.719
+Now ownership is an idea that made some kind of sense
+
+00:01:28.720 --> 00:01:31.559
+when you have goods and services
+
+00:01:31.560 --> 00:01:33.119
+that are constrained in some way,
+
+00:01:33.120 --> 00:01:36.119
+that are essentially finite in supply.
+
+00:01:36.120 --> 00:01:37.839
+But when you have things like
+
+00:01:37.840 --> 00:01:41.079
+works of software, art, and music,
+
+00:01:41.080 --> 00:01:43.879
+which are essentially infinite in supply,
+
+00:01:43.880 --> 00:01:46.359
+the idea of ownership and supply and demand
+
+00:01:46.360 --> 00:01:48.319
+don't make sense anymore.
+
+00:01:48.320 --> 00:01:51.679
+And yet we employ the institution of property
+
+00:01:51.680 --> 00:01:56.079
+to constrain supply and introduce the idea of supply
+
+00:01:56.080 --> 00:01:58.399
+just so that we can induce a market value
+
+00:01:58.400 --> 00:02:00.319
+in terms of supply and demand
+
+00:02:00.320 --> 00:02:05.759
+in a capitalist economic system. And it's wrongheaded.
+
+NOTE Copyright
+
+00:02:05.760 --> 00:02:10.319
+How many of us have written copyright declarations
+
+00:02:10.320 --> 00:02:12.919
+like these on our work.
+
+00:02:12.920 --> 00:02:14.719
+It's a lot of work!
+
+00:02:14.720 --> 00:02:18.159
+Especially when we have version control.
+
+00:02:18.160 --> 00:02:19.879
+Now in this example,
+
+00:02:19.880 --> 00:02:23.119
+almost every line is written by a different person,
+
+00:02:23.120 --> 00:02:25.519
+so who owns the code in this case?
+
+00:02:25.520 --> 00:02:27.839
+Who owns the copyright here?
+
+00:02:27.840 --> 00:02:30.039
+Is it some of them, is it all of them,
+
+00:02:30.040 --> 00:02:32.879
+do they share it in some way?
+
+00:02:32.880 --> 00:02:34.879
+It doesn't really make sense,
+
+00:02:34.880 --> 00:02:37.759
+especially when the reason we're employing
+
+00:02:37.760 --> 00:02:40.079
+copyright and ownership in this case
+
+00:02:40.080 --> 00:02:44.079
+is to approximate the idea of attribution,
+
+00:02:44.080 --> 00:02:46.559
+which is what we really care about here.
+
+00:02:46.560 --> 00:02:50.999
+And that brings us to the nature of the solution,
+
+00:02:51.000 --> 00:02:53.159
+which is to move away from an economic system
+
+00:02:53.160 --> 00:02:55.879
+based on ownership and supply and demand,
+
+00:02:55.880 --> 00:02:59.399
+to an economic system based on attribution, instead.
+
+00:02:59.400 --> 00:03:02.479
+That is, moving away from who _owns_ what
+
+00:03:02.480 --> 00:03:07.319
+to who _did_ what and how important was it.
+
+00:03:07.320 --> 00:03:09.719
+And we can do this by the process of
+
+00:03:09.720 --> 00:03:12.959
+Dialectical Inheritance Attribution,
+
+00:03:12.960 --> 00:03:16.639
+which just means that we do it in a collective way
+
+00:03:16.640 --> 00:03:20.639
+using common collectively agreed upon standards
+
+00:03:20.640 --> 00:03:24.239
+that are applied transparently to all.
+
+00:03:24.240 --> 00:03:25.599
+And when we have an economic system
+
+00:03:25.600 --> 00:03:26.919
+that is based on attribution
+
+00:03:26.920 --> 00:03:28.799
+as the source of value in this way,
+
+00:03:28.800 --> 00:03:34.719
+we call it attribution based economics.
+
+00:03:34.720 --> 00:03:39.279
+Now, once we have that, it gives us fairness,
+
+00:03:39.280 --> 00:03:43.639
+effective empowerment of expertise,
+
+00:03:43.640 --> 00:03:46.359
+freedom through incentives rather than through coercion.
+
+00:03:46.360 --> 00:03:49.839
+And privacy as well.
+
+NOTE An attribution-based economic system is efficient
+
+00:03:49.840 --> 00:03:52.359
+But I could tell you all of those things
+
+00:03:52.360 --> 00:03:57.079
+and some may still say, "Why should I care about this?"
+
+00:03:57.080 --> 00:03:58.279
+There are those who would say
+
+00:03:58.280 --> 00:04:00.679
+that fairness is not a good goal,
+
+00:04:00.680 --> 00:04:02.999
+and that might makes right,
+
+00:04:03.000 --> 00:04:04.599
+and that as Darwin showed us,
+
+00:04:04.600 --> 00:04:08.999
+the nature of nature is violence.
+
+00:04:09.000 --> 00:04:12.439
+Now I know that many of us reject this ideology,
+
+00:04:12.440 --> 00:04:16.359
+and we feel in our bones that it is wrong.
+
+00:04:16.360 --> 00:04:19.279
+But luckily we don't have to resort to high philosophy
+
+00:04:19.280 --> 00:04:21.759
+and gut feeling in order to convince ourselves
+
+00:04:21.760 --> 00:04:24.719
+that an attribution-based system is truly better.
+
+00:04:24.720 --> 00:04:26.679
+Because in addition to all of
+
+00:04:26.680 --> 00:04:28.159
+those other properties we talked about,
+
+00:04:28.160 --> 00:04:33.399
+an attribution-based economic system is also efficient.
+
+00:04:33.400 --> 00:04:36.959
+And I say this from the perspective of having
+
+00:04:36.960 --> 00:04:39.799
+an admiration for the efficiency of capitalism.
+
+00:04:39.800 --> 00:04:43.399
+So understand that that is my perspective
+
+00:04:43.400 --> 00:04:45.079
+when I say that this system --
+
+00:04:45.080 --> 00:04:47.479
+an attribution-based economic system --
+
+00:04:47.480 --> 00:04:51.159
+is significantly more efficient than capitalism.
+
+00:04:51.160 --> 00:04:55.839
+And it achieves that by virtue of eliminating the waste
+
+00:04:55.840 --> 00:04:58.479
+that is inherent in adversarial competition,
+
+00:04:58.480 --> 00:05:01.759
+while still preserving market forces!
+
+NOTE Gyroscopes
+
+00:05:01.760 --> 00:05:05.159
+In addition to this property
+
+00:05:05.160 --> 00:05:07.159
+there is also this other property
+
+00:05:07.160 --> 00:05:10.599
+that I think is truly profound,
+
+00:05:10.600 --> 00:05:15.879
+and I want to motivate it by this example of a gyroscope.
+
+00:05:15.880 --> 00:05:19.399
+Now many of us have had the opportunity to play with
+
+00:05:19.400 --> 00:05:21.239
+a gyroscope at some point in our lives.
+
+00:05:21.240 --> 00:05:23.479
+If you haven't, I encourage you to go out and get one
+
+00:05:23.480 --> 00:05:25.799
+and try it out. It also makes a good gift
+
+00:05:25.800 --> 00:05:26.999
+if you're thinking about giving it
+
+00:05:27.000 --> 00:05:28.479
+to somebody else this year.
+
+00:05:28.480 --> 00:05:32.559
+But if you've played with a gyroscope
+
+00:05:32.560 --> 00:05:35.239
+then you've had the experience, perhaps,
+
+00:05:35.240 --> 00:05:37.919
+of putting it on your hand and moving it around.
+
+00:05:37.920 --> 00:05:42.799
+And no matter what you do, it will always maintain its axis.
+
+00:05:42.800 --> 00:05:45.519
+Even if you try to push it
+
+00:05:45.520 --> 00:05:48.239
+and try to make it deviate from that axis,
+
+00:05:48.240 --> 00:05:50.399
+it will fight you. It will resist you,
+
+00:05:50.400 --> 00:05:53.039
+and keep to that axis no matter what.
+
+00:05:53.040 --> 00:05:56.639
+And if you've had this experience,
+
+00:05:56.640 --> 00:05:58.039
+then believe it or not,
+
+00:05:58.040 --> 00:06:02.079
+you have some insight into the nature of economic systems.
+
+00:06:02.080 --> 00:06:07.039
+Because if we try to get an economic system to do something
+
+00:06:07.040 --> 00:06:09.279
+other than what it wants to do,
+
+00:06:09.280 --> 00:06:11.079
+other than what is its nature,
+
+00:06:11.080 --> 00:06:14.839
+then it will resist us and it will fight that change.
+
+00:06:14.840 --> 00:06:17.759
+Now, I don't know about you,
+
+00:06:17.760 --> 00:06:22.719
+but I'd prefer to avoid fighting these gyroscopic forces.
+
+00:06:22.720 --> 00:06:25.039
+I'd rather have these forces work with me
+
+00:06:25.040 --> 00:06:29.479
+rather than against me. Now in a capitalist system,
+
+00:06:29.480 --> 00:06:32.599
+there is another problem, which is that
+
+00:06:32.600 --> 00:06:35.959
+not only do you have these gyroscopic forces at work,
+
+00:06:35.960 --> 00:06:39.159
+but these forces aren't even all working together.
+
+00:06:39.160 --> 00:06:42.119
+They're working against each other, in many cases.
+
+00:06:42.120 --> 00:06:46.439
+They represent misaligned interests.
+
+00:06:46.440 --> 00:06:50.079
+And indeed, these misaligned interests
+
+00:06:50.080 --> 00:06:53.639
+are the very means by which these forces operate at all.
+
+00:06:53.640 --> 00:06:57.559
+So in a way, war is not just
+
+00:06:57.560 --> 00:06:59.679
+an inevitable consequence in this system
+
+00:06:59.680 --> 00:07:05.279
+but is rather the very nature of such a system.
+
+00:07:05.280 --> 00:07:08.359
+In an attribution-based system, on the other hand,
+
+00:07:08.360 --> 00:07:11.399
+by virtue of the source of value
+
+00:07:11.400 --> 00:07:13.079
+being collective attribution,
+
+00:07:13.080 --> 00:07:17.239
+we are able to achieve alignment
+
+00:07:17.240 --> 00:07:19.679
+of all of these interests at every scale,
+
+00:07:19.680 --> 00:07:22.719
+so that at every scale of society,
+
+00:07:22.720 --> 00:07:24.759
+from the smallest to the largest scales,
+
+00:07:24.760 --> 00:07:26.479
+the interests will be aligned,
+
+00:07:26.480 --> 00:07:28.559
+will be consonant and harmonious.
+
+00:07:28.560 --> 00:07:33.799
+I think this is a very important, profound quality
+
+00:07:33.800 --> 00:07:38.119
+that I think is the fundamental problem of economics -
+
+00:07:38.120 --> 00:07:40.479
+the fundamental goal of economics to solve.
+
+00:07:40.480 --> 00:07:43.839
+And I believe that an attribution-based economic system
+
+00:07:43.840 --> 00:07:45.199
+addresses it and solves it.
+
+NOTE Prototypes
+
+00:07:45.200 --> 00:07:50.279
+So without further ado, I want to bring it home
+
+00:07:50.280 --> 00:07:52.479
+to the prototype that we have in mind
+
+00:07:52.480 --> 00:07:53.839
+for the Emacs community.
+
+00:07:53.840 --> 00:07:56.279
+Now we want to start in the Emacs community
+
+00:07:56.280 --> 00:07:58.239
+because Emacs has a long tradition
+
+00:07:58.240 --> 00:08:02.159
+of exploring better ways of doing things
+
+00:08:02.160 --> 00:08:05.279
+and pursuing better alternatives to the status quo.
+
+00:08:05.280 --> 00:08:09.399
+Now, to give you an overview of the prototype
+
+00:08:09.400 --> 00:08:12.639
+that we've implemented for open source projects.
+
+00:08:12.640 --> 00:08:15.439
+The prototype is composed of two broad phases,
+
+00:08:15.440 --> 00:08:18.959
+that is, the appraisal phase and the accounting phase.
+
+00:08:18.960 --> 00:08:21.959
+Any project is composed of ideas, capital and labor.
+
+00:08:21.960 --> 00:08:26.279
+The appraisal phase is involved in assessing the work done
+
+00:08:26.280 --> 00:08:29.119
+in terms of how much value was created
+
+00:08:29.120 --> 00:08:31.959
+and who created the value and how important that value is.
+
+00:08:31.960 --> 00:08:35.199
+The output of this stage is an attributions file.
+
+00:08:35.200 --> 00:08:42.039
+And the second phase, of accounting, is about, you know,
+
+00:08:42.040 --> 00:08:43.679
+how do you handle payments that come in
+
+00:08:43.680 --> 00:08:45.119
+and how do you pay people out.
+
+00:08:45.120 --> 00:08:48.879
+Now the first part has more of a social component to it
+
+00:08:48.880 --> 00:08:50.239
+and the second part has more of
+
+00:08:50.240 --> 00:08:53.839
+a technological component to it that can be automated.
+
+00:08:53.840 --> 00:08:56.239
+So in order to implement this prototype,
+
+00:08:56.240 --> 00:08:57.839
+we have two things.
+
+00:08:57.840 --> 00:09:01.679
+We have founding documents that describe the social aspects,
+
+00:09:01.680 --> 00:09:04.039
+and an accounting system that automates
+
+00:09:04.040 --> 00:09:05.919
+some of the technological aspects.
+
+NOTE Founding documents
+
+00:09:05.920 --> 00:09:10.799
+The founding documents, in the noble tradition
+
+00:09:10.800 --> 00:09:14.559
+of the Gayaneshagowa and the US constitution,
+
+00:09:14.560 --> 00:09:17.799
+include a constitution which describes
+
+00:09:17.800 --> 00:09:20.679
+the guiding principles of ABE,
+
+00:09:20.680 --> 00:09:25.399
+and the two main prongs are forward-looking empowerment
+
+00:09:25.400 --> 00:09:26.639
+and backward-looking fairness.
+
+00:09:26.640 --> 00:09:28.839
+This means that we want to empower
+
+00:09:28.840 --> 00:09:31.599
+those individuals and groups
+
+00:09:31.600 --> 00:09:33.599
+that are most likely to create value in the future,
+
+00:09:33.600 --> 00:09:36.959
+while also recognizing and fairly compensating
+
+00:09:36.960 --> 00:09:38.839
+those who've created value in the past,
+
+00:09:38.840 --> 00:09:41.919
+to set a good example and incentivize others
+
+00:09:41.920 --> 00:09:45.559
+to take chances in creating value.
+
+00:09:45.560 --> 00:09:50.079
+And it describes high level principles of
+
+00:09:50.080 --> 00:09:52.119
+dialectical inheritance attribution
+
+00:09:52.120 --> 00:09:53.879
+as proceeding by means of
+
+00:09:53.880 --> 00:09:55.999
+common, collectively agreed-upon standards
+
+00:09:56.000 --> 00:09:56.919
+that are applied to all.
+
+00:09:56.920 --> 00:09:59.759
+And the key thing here is these improvements feed back
+
+00:09:59.760 --> 00:10:01.919
+to the whole and apply to everyone.
+
+00:10:01.920 --> 00:10:03.639
+And this is an important quality
+
+00:10:03.640 --> 00:10:05.919
+to ensuring fairness and accuracy.
+
+NOTE Declaration of non-ownership
+
+00:10:05.920 --> 00:10:09.839
+There's also a declaration of non-ownership.
+
+00:10:09.840 --> 00:10:13.959
+We saw already that ownership is an overused institution.
+
+00:10:13.960 --> 00:10:20.079
+This just codifies that and allows us to shed
+
+00:10:20.080 --> 00:10:22.439
+the baggage of this idea of ownership
+
+00:10:22.440 --> 00:10:24.319
+where it doesn't make any sense.
+
+NOTE The financial model
+
+00:10:24.320 --> 00:10:28.159
+A third document is the financial model
+
+00:10:28.160 --> 00:10:31.319
+which describes how payments are to be treated,
+
+00:10:31.320 --> 00:10:34.159
+and a key idea here is that when you pay money
+
+00:10:34.160 --> 00:10:37.359
+to an open source project, you know,
+
+00:10:37.360 --> 00:10:40.239
+today you don't really have an incentive to do so,
+
+00:10:40.240 --> 00:10:42.439
+and it essentially is kind of like a donation.
+
+00:10:42.440 --> 00:10:45.999
+But in this model, in an attribution-based model,
+
+00:10:46.000 --> 00:10:48.119
+when you pay money to a project,
+
+00:10:48.120 --> 00:10:49.999
+you're creating value in a way.
+
+00:10:50.000 --> 00:10:51.599
+You're contributing value to the project
+
+00:10:51.600 --> 00:10:53.279
+and that itself is attributable.
+
+00:10:53.280 --> 00:10:56.239
+And the manner in which we'll treat this
+
+00:10:56.240 --> 00:10:58.839
+is in terms of the fair market price that, again,
+
+00:10:58.840 --> 00:11:00.199
+we agree upon collectively.
+
+00:11:00.200 --> 00:11:04.959
+And any payment that exceeds the fair market price
+
+00:11:04.960 --> 00:11:06.399
+is going to be treated as investment.
+
+00:11:06.400 --> 00:11:10.199
+And the goal here for this financial model
+
+00:11:10.200 --> 00:11:11.879
+is for the system to be self-sustaining,
+
+00:11:11.880 --> 00:11:15.439
+so I think there are many open problems here
+
+00:11:15.440 --> 00:11:18.439
+and any finance experts or any other experts
+
+00:11:18.440 --> 00:11:21.479
+who are interested in contributing here,
+
+00:11:21.480 --> 00:11:23.239
+your help is needed, certainly.
+
+NOTE The attribution model
+
+00:11:23.240 --> 00:11:26.759
+There's also an attribution model document,
+
+00:11:26.760 --> 00:11:28.999
+which describes some of the theoretical ideas
+
+00:11:29.000 --> 00:11:33.479
+that would guide dialectical inheritance attribution,
+
+00:11:33.480 --> 00:11:36.919
+and there are many interesting ideas here.
+
+00:11:36.920 --> 00:11:40.359
+One that I'd like to mention is "backpropagation,"
+
+00:11:40.360 --> 00:11:42.559
+which is the idea that
+
+00:11:42.560 --> 00:11:45.199
+as we're improving the standards over time
+
+00:11:45.200 --> 00:11:48.279
+and they're likely to get more accurate and fair over time,
+
+00:11:48.280 --> 00:11:51.559
+we'd like these more accurate and fair standards
+
+00:11:51.560 --> 00:11:56.519
+to "backpropagate" and calibrate the value assignments
+
+00:11:56.520 --> 00:11:57.799
+that were done in the past.
+
+00:11:57.800 --> 00:12:01.079
+And this means that some people might have been
+
+00:12:01.080 --> 00:12:02.839
+underpaid in the past
+
+00:12:02.840 --> 00:12:05.199
+and we would pay them what they were underpaid,
+
+00:12:05.200 --> 00:12:06.479
+or the balance,
+
+00:12:06.480 --> 00:12:08.839
+and some people may have been overpaid.
+
+00:12:08.840 --> 00:12:11.839
+Now in that case we're not going to go and say,
+
+00:12:11.840 --> 00:12:14.439
+"hey we overpaid you, give us the money back."
+
+00:12:14.440 --> 00:12:18.199
+Instead the system as a whole is going to bear
+
+00:12:18.200 --> 00:12:19.519
+the cost of being wrong,
+
+00:12:19.520 --> 00:12:22.159
+and so it's kind of an insurance policy.
+
+00:12:22.160 --> 00:12:25.599
+But I think another more interesting quality here is that
+
+00:12:25.600 --> 00:12:29.959
+the system in practice wouldn't really
+
+00:12:29.960 --> 00:12:32.999
+absorb any negative impact here
+
+00:12:33.000 --> 00:12:34.319
+because there is an incentive
+
+00:12:34.320 --> 00:12:37.599
+for these people who've been overpaid
+
+00:12:37.600 --> 00:12:38.799
+to reinvest that money.
+
+00:12:38.800 --> 00:12:42.839
+So I think they would want to invest the money
+
+00:12:42.840 --> 00:12:45.519
+in other places that the system has valued
+
+00:12:45.520 --> 00:12:49.119
+as being valuable and showing potential.
+
+NOTE The accounting system
+
+00:12:49.120 --> 00:12:54.239
+The second component of the implementation
+
+00:12:54.240 --> 00:12:58.599
+is the accounting system. All accounting is public.
+
+00:12:58.600 --> 00:13:00.879
+All payments into the repo are public
+
+00:13:00.880 --> 00:13:03.399
+and all payments out of the project are also public.
+
+00:13:03.400 --> 00:13:05.479
+We can do some things for privacy,
+
+00:13:05.480 --> 00:13:08.519
+and again, the basis of this system is dialogue.
+
+00:13:08.520 --> 00:13:10.759
+It's not a fundamentally technologically system.
+
+00:13:10.760 --> 00:13:12.799
+It's a fundamentally dialogue-based system,
+
+00:13:12.800 --> 00:13:14.759
+and that, to be honest with you, is everything.
+
+00:13:14.760 --> 00:13:16.999
+It's all systems that we have in place.
+
+00:13:17.000 --> 00:13:21.119
+But by embracing that, it means that
+
+00:13:21.120 --> 00:13:25.039
+we can do whatever we want to do by discussion,
+
+00:13:25.040 --> 00:13:26.039
+and if there's something
+
+00:13:26.040 --> 00:13:27.959
+that we cannot achieve in a technological way,
+
+00:13:27.960 --> 00:13:30.079
+we'll achieve it in a non-technological way.
+
+00:13:30.080 --> 00:13:35.999
+But anyway, the point is, all accounting is public,
+
+00:13:36.000 --> 00:13:40.399
+and text files in the repository
+
+00:13:40.400 --> 00:13:43.919
+form the inputs and outputs of the accounting system
+
+00:13:43.920 --> 00:13:48.879
+which is implemented as a GitHub action.
+
+00:13:48.880 --> 00:13:51.239
+So typically a source repository will have
+
+00:13:51.240 --> 00:13:54.119
+an ABE folder containing these three inputs:
+
+00:13:54.120 --> 00:13:55.599
+attributions, payments,
+
+00:13:55.600 --> 00:13:59.919
+and payouts. And we'll see how that works.
+
+NOTE drym.org Github account
+
+00:13:59.920 --> 00:14:04.839
+This is the drym.org Github organization account.
+
+00:14:04.840 --> 00:14:09.599
+This is an example of a repository that uses
+
+00:14:09.600 --> 00:14:12.439
+the GitHub action accounting system.
+
+00:14:12.440 --> 00:14:16.239
+So there will be a payments folder, a payouts folder,
+
+00:14:16.240 --> 00:14:18.639
+as well as an attributions file.
+
+00:14:18.640 --> 00:14:23.959
+The payments: essentially each file
+
+00:14:23.960 --> 00:14:26.759
+just represents a payment that's made to the repository.
+
+00:14:26.760 --> 00:14:29.079
+Payouts is the same except it's payments
+
+00:14:29.080 --> 00:14:32.359
+made by the admins of the repository to contributors.
+
+00:14:32.360 --> 00:14:37.159
+And the attributions file breaks down
+
+00:14:37.160 --> 00:14:40.679
+the attribution of the value in the repository
+
+00:14:40.680 --> 00:14:47.559
+by contributor. And then the billing system runs
+
+00:14:47.560 --> 00:14:50.359
+on every relevant commit,
+
+00:14:50.360 --> 00:14:53.679
+which is typically changes to the ABE folder,
+
+00:14:53.680 --> 00:14:57.239
+generates a set of transactions
+
+00:14:57.240 --> 00:15:00.519
+that are owed to various people from various payments,
+
+00:15:00.520 --> 00:15:05.079
+and then creates an issue with the outstanding balances
+
+00:15:05.080 --> 00:15:07.279
+that need to be paid out to contributors,
+
+00:15:07.280 --> 00:15:09.519
+and tells you what those balances are.
+
+00:15:09.520 --> 00:15:11.799
+So for repository or project maintainers,
+
+00:15:11.800 --> 00:15:14.879
+it automates all these accounting details
+
+00:15:14.880 --> 00:15:17.599
+and you just have to worry about fulfilling the payments.
+
+NOTE Expanding the boundary
+
+00:15:17.600 --> 00:15:23.519
+An interesting property of the prototype
+
+00:15:23.520 --> 00:15:28.399
+is that boundary incentives expand the boundary,
+
+00:15:28.400 --> 00:15:33.959
+and that is that the incentives in the system
+
+00:15:33.960 --> 00:15:38.439
+are so constructed that those on the periphery
+
+00:15:38.440 --> 00:15:40.439
+of the attribution-based economic system
+
+00:15:40.440 --> 00:15:42.079
+have an incentive to join in.
+
+00:15:42.080 --> 00:15:45.519
+And we'll see how that works.
+
+00:15:45.520 --> 00:15:51.359
+Well, as I mentioned, we're starting this prototype
+
+00:15:51.360 --> 00:15:52.919
+in the Emacs community with the
+
+00:15:52.920 --> 00:15:59.599
+Symex repo. Symex is a structural editing package,
+
+00:15:59.600 --> 00:16:05.319
+and this prototype will recognize direct contributors
+
+00:16:05.320 --> 00:16:08.159
+as well as antecedents and related projects
+
+00:16:08.160 --> 00:16:09.799
+through the process of collective attribution.
+
+00:16:09.800 --> 00:16:14.839
+We all decide how financial contributions to the Symex repo
+
+00:16:14.840 --> 00:16:18.759
+are going to be distributed to the direct contributors
+
+00:16:18.760 --> 00:16:21.039
+as well as to antecedents and related projects.
+
+00:16:21.040 --> 00:16:23.679
+So the power is yours!
+
+00:16:23.680 --> 00:16:27.159
+And that's what I meant when I said
+
+00:16:27.160 --> 00:16:29.519
+that the boundary incentives expand the boundary,
+
+00:16:29.520 --> 00:16:32.359
+because projects that we agree are owed money
+
+00:16:32.360 --> 00:16:37.959
+from the Symex repo now would have an incentive to join,
+
+00:16:37.960 --> 00:16:39.959
+because once they join they would get that money.
+
+00:16:39.960 --> 00:16:43.199
+And we'll also be implementing this in the
+
+00:16:43.200 --> 00:16:47.199
+Racket community. Racket is a Scheme dialect,
+
+00:16:47.200 --> 00:16:50.959
+and Emacs has great support for Racket in Racket Mode
+
+00:16:50.960 --> 00:16:52.159
+so I encourage you to try it.
+
+00:16:52.160 --> 00:16:55.999
+And we'll be prototyping it in the Qi repository.
+
+00:16:56.000 --> 00:16:59.599
+Qi is a language written in Racket which is, you know,
+
+00:16:59.600 --> 00:17:02.719
+it's for functional programming and things like that.
+
+00:17:02.720 --> 00:17:06.239
+And once again, we'll recognize direct contributors
+
+00:17:06.240 --> 00:17:09.239
+as well as antecedents and we all decide
+
+00:17:09.240 --> 00:17:11.559
+and agree on how those are done.
+
+NOTE Adopting this idea
+
+00:17:11.560 --> 00:17:14.119
+So how do you adopt this?
+
+00:17:14.120 --> 00:17:18.559
+You can add the github action to a repo
+
+00:17:18.560 --> 00:17:20.239
+that you are a maintainer of.
+
+00:17:20.240 --> 00:17:23.319
+You can financially support an ABE project.
+
+00:17:23.320 --> 00:17:25.199
+This is important to do
+
+00:17:25.200 --> 00:17:26.919
+because the system won't get started
+
+00:17:26.920 --> 00:17:28.119
+without money as an input.
+
+00:17:28.120 --> 00:17:31.119
+And it also has network effects, as we saw -
+
+00:17:31.120 --> 00:17:33.479
+the more money you contribute,
+
+00:17:33.480 --> 00:17:35.239
+the more incentive there is
+
+00:17:35.240 --> 00:17:36.799
+for other people to join the system.
+
+00:17:36.800 --> 00:17:39.879
+And contributions are also attributable,
+
+00:17:39.880 --> 00:17:41.079
+as we said earlier.
+
+00:17:41.080 --> 00:17:43.719
+Some of them can be treated as investments.
+
+00:17:43.720 --> 00:17:47.999
+Any help you can provide with funding
+
+00:17:48.000 --> 00:17:50.519
+would be attributable and very helpful, of course.
+
+00:17:50.520 --> 00:17:54.079
+And yeah, if you can help us achieve
+
+00:17:54.080 --> 00:17:55.839
+the goal of self-sufficiency
+
+00:17:55.840 --> 00:17:59.039
+without relying on capitalist entry points,
+
+00:17:59.040 --> 00:18:01.759
+that would be very helpful as well.
+
+00:18:01.760 --> 00:18:06.319
+I'd like to acknowledge the help of many individuals
+
+00:18:06.320 --> 00:18:09.399
+for this presentation
+
+00:18:09.400 --> 00:18:12.759
+as well as many of the supporting things
+
+00:18:12.760 --> 00:18:14.919
+that have gone on behind the scenes for years.
+
+00:18:14.920 --> 00:18:19.679
+And in particular for now I want to mention
+
+00:18:19.680 --> 00:18:25.559
+Jair and Ariana who wrote the accounting system
+
+00:18:25.560 --> 00:18:28.319
+that we saw earlier, and Salim who encouraged me
+
+00:18:28.320 --> 00:18:32.799
+to take this social approach to the prototype.
+
+00:18:32.800 --> 00:18:36.559
+And so many more people who have believed and invested
+
+00:18:36.560 --> 00:18:39.159
+in the cause of "attribution, not ownership!"
+
+NOTE Closing thoughts
+
+00:18:39.160 --> 00:18:42.759
+I want to leave you with this closing thought.
+
+00:18:42.760 --> 00:18:46.159
+The electromagnetic attraction between two objects
+
+00:18:46.160 --> 00:18:49.919
+is 10^42 stronger (!) than the gravitational attraction
+
+00:18:49.920 --> 00:18:51.079
+between these same objects.
+
+00:18:51.080 --> 00:18:53.879
+And yet, a stone falls to the Earth
+
+00:18:53.880 --> 00:18:56.679
+under the influence of gravity, not magnetism.
+
+00:18:56.680 --> 00:19:00.879
+The reason is that the e/m forces are polarized,
+
+00:19:00.880 --> 00:19:04.079
+much like our world, and cancel each other out.
+
+NOTE Taking care of one another
+
+00:19:04.080 --> 00:19:07.719
+Now in this world, we are told
+
+00:19:07.720 --> 00:19:09.559
+that we should look out for ourselves
+
+00:19:09.560 --> 00:19:11.879
+because no one is going to look out for us.
+
+00:19:11.880 --> 00:19:14.039
+That we should take care of our own
+
+00:19:14.040 --> 00:19:17.359
+because we can't rely on others to care.
+
+00:19:17.360 --> 00:19:22.479
+An attribution-based economy is nothing like that.
+
+00:19:22.480 --> 00:19:23.959
+We care about each other,
+
+00:19:23.960 --> 00:19:25.439
+we take care of each other,
+
+00:19:25.440 --> 00:19:29.879
+because taking care of one another is valuable,
+
+00:19:29.880 --> 00:19:32.559
+and an attribution-based economic system
+
+00:19:32.560 --> 00:19:39.079
+is capable of recognizing that value, in financial terms.
+
+00:19:39.080 --> 00:19:43.879
+And as a result, we are safe in the embrace of the world.
+
+00:19:43.880 --> 00:19:56.240
+So, um, yeah. Let's go!
diff --git a/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.vtt b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.vtt
new file mode 100644
index 00000000..2918301d
--- /dev/null
+++ b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.vtt
@@ -0,0 +1,563 @@
+WEBVTT
+
+00:00.000 --> 00:14.120
+All right. Hi, again, everyone. So, we are back. And I am with Vavin. Hi, Vavin. How
+
+00:14.120 --> 00:15.120
+are you doing?
+
+00:15.120 --> 00:18.120
+I'm good. How about you?
+
+00:18.120 --> 00:24.040
+I'm doing well. You will note that I now have an extra layer because I was absolutely frozen
+
+00:24.040 --> 00:28.960
+in the first half of this year's EmacsConf. But now, hopefully, I should start getting
+
+00:28.960 --> 00:33.080
+a little warmer. Usually, I'm more stressed, you know, when we only have one track and
+
+00:33.080 --> 00:36.640
+we only have about two minutes between every talk. I need to run all the time. And even
+
+00:36.640 --> 00:40.840
+though we are in the dead of winter in Europe, usually, I'm pretty warm. But today, I am
+
+00:40.840 --> 00:45.920
+so relaxed that I have the mental availability to be cold. Anyway, this is not about me.
+
+00:45.920 --> 00:47.920
+This is about you, Vavin.
+
+00:47.920 --> 00:54.740
+So, for the new joiners, newcomers to the chat, we do have a pad where you can ask questions.
+
+00:54.740 --> 00:59.400
+And we are primarily looking at this pad for the questions. What we'll do afterwards is
+
+00:59.400 --> 01:06.720
+that we'll open up this current room in which we are. And we will allow you to ask questions
+
+01:06.720 --> 01:12.360
+directly to Vavin. And it's a subject, you know, user group that is very close to Sasha
+
+01:12.360 --> 01:17.720
+and my heart because we've done a lot of work towards it. And we might have some knowledge
+
+01:17.720 --> 01:23.440
+to contribute afterwards. But for now, I prefer if we heard about Vavin. So, Vavin, take it
+
+01:23.440 --> 01:24.440
+away.
+
+01:24.440 --> 01:25.440
+Yep.
+
+01:25.440 --> 01:36.640
+I see one question. What about using on multiple computers? I think that's not related or I'm
+
+01:36.640 --> 01:38.440
+not sure what it is about.
+
+01:38.440 --> 01:40.440
+I'm not sure either.
+
+01:40.440 --> 01:46.840
+Yeah, I'll just do the next one. What about collaborative editing with this multiple computers
+
+01:46.840 --> 01:50.920
+with Macs like CRDT or with R2D2?
+
+01:50.920 --> 01:57.920
+I think there's something weird going on. I'll give you just a second.
+
+01:57.920 --> 02:04.120
+I'll just pick up the relevant one in that case.
+
+02:04.120 --> 02:05.680
+Sure, thank you.
+
+02:05.680 --> 02:07.840
+Thoughts on physical meetups.
+
+02:07.840 --> 02:19.560
+Yeah, so this year, I think a few months back, I had thought of doing it. But the way right
+
+02:19.560 --> 02:28.040
+now it is, at least in my region, the community is comparatively small. So usually right now
+
+02:28.040 --> 02:33.480
+the model is working is basically the remote one. And we get people from some people from
+
+02:33.480 --> 02:39.080
+I think China, some people from Australia. So we get to have a couple of people and good
+
+02:39.080 --> 02:46.680
+discussions usually. Whereas for physical meetups, what I've been thinking is maybe
+
+02:46.680 --> 02:52.960
+one off meetup can be physical. Let's say you come together similar to people have been
+
+02:52.960 --> 03:00.680
+watching Emacs on this year. So something like you come together, do the online meetup
+
+03:00.680 --> 03:05.520
+first and then networking and discussions can happen offline. So that was one of my
+
+03:05.520 --> 03:12.880
+idea. Maybe I'll try it with Emacs APAC sooner or later and we'll see how it goes. So that's
+
+03:12.880 --> 03:18.880
+the current plan about physical meetups. And in terms of if you ask me thoughts, they are
+
+03:18.880 --> 03:25.340
+good too. So you get to talk with people face to face, you got to make more connections.
+
+03:25.340 --> 03:30.840
+So yeah, I might experiment some mixed way of doing it right once in a while you meet
+
+03:30.840 --> 03:36.720
+or otherwise you do it online so that people who are not able to join in or travel to that
+
+03:36.720 --> 03:40.160
+particular area or region, they can just join online.
+
+03:40.160 --> 03:48.240
+Yeah, it's a very interesting topic of physical meetups because we, so I participate in one
+
+03:48.240 --> 03:56.880
+of the workshop Emacs Paris and we used to have in-person meetups in Paris and usually
+
+03:56.880 --> 04:02.040
+there were about five to 10 people showing up, which was a good number. But when COVID
+
+04:02.040 --> 04:07.820
+happened and we moved to virtual meetings, we started having a lot more people. Now we
+
+04:07.820 --> 04:12.680
+are averaging about 15 to 20 people at every session and it's amazing. But the problem
+
+04:12.680 --> 04:20.000
+is, I'm knocking on wood really hard, but now that COVID is a little easier to manage
+
+04:20.000 --> 04:25.720
+and that's a lot of people are returning to in-person meetings, it's a little more complicated
+
+04:25.720 --> 04:32.040
+really to say, do we go back to physical meetings even though we have more people on a virtual
+
+04:32.040 --> 04:36.640
+meeting? It causes us to ask many questions about why do we want those meetings to be
+
+04:36.640 --> 04:44.320
+held? And we need to think about this in 2023 with the organizers of Emacs Paris and I think
+
+04:44.320 --> 04:53.840
+Emacs SF also was in the process of thinking about how to go back to physical venues. And
+
+04:53.840 --> 05:01.680
+I think right now the consensus amongst a lot of workshop user group organizers is that
+
+05:01.680 --> 05:06.920
+they would like to have both. So if it was a monthly meeting before, why not have a physical
+
+05:06.920 --> 05:14.960
+meeting every month and a virtual meeting every month as well on a two-week cycle. So
+
+05:14.960 --> 05:25.240
+that's a lot more work, obviously. It's not choosing, it's choosing. I'm not sure how
+
+05:25.240 --> 05:30.400
+big the pool of people you have in Emacs APAC actually is but it feels like it's a much
+
+05:30.400 --> 05:39.720
+larger area than say Emacs Paris for France. So you try it even though. Yeah, exactly.
+
+05:39.720 --> 05:48.320
+So in India, there is the region with this Maharashtra Pune, it is like one end and across
+
+05:48.320 --> 05:54.880
+maybe you can say 500-600 kilometers radius, you have many other cities where more people
+
+05:54.880 --> 06:02.960
+are there. So having all of them at one place is basically event like conference or something.
+
+06:02.960 --> 06:08.400
+Monthly meetup, probably not. So there is one more meetup group I managed, not related
+
+06:08.400 --> 06:14.280
+to Emacs, but we had same question, what to do now? We have many people joining us throughout
+
+06:14.280 --> 06:20.920
+the state and should we have a meetup in one city only? So yeah, I think we'll have to
+
+06:20.920 --> 06:25.400
+experiment and see. Yeah, but it's fun to experiment, it's fun
+
+06:25.400 --> 06:30.160
+to have. We know that we have interested people all around the world, like that it showed
+
+06:30.160 --> 06:34.840
+you the type of workshop that we can have and how to run your own, but we already have
+
+06:34.840 --> 06:39.120
+many workshops around the world. It wasn't the case if you go back three years ago. I
+
+06:39.120 --> 06:44.720
+think if I'm completely speedboarding now, but I think we had about five user groups
+
+06:44.720 --> 06:52.520
+worldwide three years ago, and now we must have something like 12, 13, 14 even, which
+
+06:52.520 --> 06:56.680
+is a massive increase when you think about it. Now that Babin has provided you with the
+
+06:56.680 --> 07:01.440
+tools to do just the same and start your own workshop, and also you have the buddy system
+
+07:01.440 --> 07:07.880
+of Andrea that you saw earlier today, you have more options than ever to be able to
+
+07:07.880 --> 07:13.240
+meet people talking about Emacs. Now, there's obviously EmacsConf as well, which is helping
+
+07:13.240 --> 07:18.800
+and we have a lot of lovely tools to share with you, but I think it's better or it's
+
+07:18.800 --> 07:24.120
+a good compliment to have a monthly checkup with people who might feel a little closer
+
+07:24.120 --> 07:28.920
+to you, either, and closer can have multiple definitions, you know, it can be closer in
+
+07:28.920 --> 07:34.840
+terms of proficiency with Emacs, or it can be closer geographically, which makes it easier
+
+07:34.840 --> 07:39.960
+or culturally, which will make it easier to converse with people. We do have a question
+
+07:39.960 --> 07:44.440
+about hybrid meetings. Do you want to take this one, Babin? It's so related to what we
+
+07:44.440 --> 07:45.440
+were talking about.
+
+07:45.440 --> 07:53.800
+Yep, yep, yep, yeah. So I tried it, not with Emacs one, but with the other one I organized.
+
+07:53.800 --> 07:59.800
+And even I had some thoughts. The only problem is what happens, the people who are joining
+
+07:59.800 --> 08:07.960
+virtually, they usually end up feeling left out. Because people who are in the room, they
+
+08:07.960 --> 08:13.640
+might be discussing something face to face, they might have some discussions. The only
+
+08:13.640 --> 08:21.200
+way I think would work is everyone joins the online link from their own machines. You do
+
+08:21.200 --> 08:27.680
+your regular meetup discussions. And after that, you have some discussions. Because otherwise,
+
+08:27.680 --> 08:33.560
+one side or other side will end up feeling left out. Rather than doing it, I'll just
+
+08:33.560 --> 08:39.160
+keep it one or other, either completely virtual or completely in person.
+
+08:39.160 --> 08:47.240
+Yeah, I think it is really complicated to do a hybrid stream well. I told you the figures
+
+08:47.240 --> 08:52.960
+of the people we had, which was roughly between five to 15 people at most in physical venues.
+
+08:52.960 --> 08:55.800
+Right now, by the way, we should probably say hi to the people in Switzerland who are
+
+08:55.800 --> 09:03.880
+currently watching Emacs in a very nice, warm room. I'm thinking warm because I'm cold.
+
+09:03.880 --> 09:07.320
+It's not only warm in terms of the weather inside the room, but also warm in terms of
+
+09:07.320 --> 09:13.320
+the people around it. Hi, everyone. Hybrid meetings pretty much take the attention
+
+09:13.320 --> 09:18.880
+of two people entirely. One to manage the physical venue, and one to manage the virtual
+
+09:18.880 --> 09:24.480
+interactions. And generally, those two people would be core organizers of the events. And
+
+09:24.480 --> 09:30.520
+that takes a lot of energy. And I think people are a little scared to do such events because
+
+09:30.520 --> 09:34.360
+you also need to manage webcams, you need to manage presentation, how to take questions,
+
+09:34.360 --> 09:41.000
+how to relay audio. And frankly, as someone who organizes or helps organize EmacsConf
+
+09:41.000 --> 09:45.080
+every year, I can tell you that it can be plenty of wrong going on with audio setup,
+
+09:45.080 --> 09:49.880
+video setup, and making sure that everyone is being listened to. But ultimately, we are
+
+09:49.880 --> 09:55.560
+sharing these tools. So maybe we could share the tools for EmacsConf for people to actually
+
+09:55.560 --> 10:00.280
+start running their own workshop. That would be interesting. But please don't send me an
+
+10:00.280 --> 10:03.680
+email asking for this. I need to rest.
+
+10:03.680 --> 10:13.760
+So there is one, I think, thought. Yeah, one thought in the IRC. It is about the time it
+
+10:13.760 --> 10:22.280
+takes for me to organize the meetup. So what I have done is creating the announcement,
+
+10:22.280 --> 10:29.360
+posting it at least on the website, I have automated it. So at times, even I forget that
+
+10:29.360 --> 10:36.120
+when is the meetup and all. But my automation takes care of creating the online website
+
+10:36.120 --> 10:42.760
+entries, announcements and all. So that saves me a lot of time and a lot of cognitive load
+
+10:42.760 --> 10:53.440
+I should say. I don't have to remember I have to announce it. And what happens is, I do
+
+10:53.440 --> 11:00.480
+plan to automate more things like announcements on IRC, announcements on Mastodon and stuff.
+
+11:00.480 --> 11:07.420
+So that will save a lot more time. But usually, that basically means I don't have to do much
+
+11:07.420 --> 11:12.920
+stuff before the meetup. It's like 15 to 20 minutes. And during the meetup, obviously
+
+11:12.920 --> 11:19.040
+I attend along with everyone else. And post meetup, it might take more time. But I haven't
+
+11:19.040 --> 11:26.080
+worked on processing or collecting the video and publishing those. So maybe add more, let's
+
+11:26.080 --> 11:29.280
+say, 30 minutes or so. So yep.
+
+11:29.280 --> 11:36.000
+Yeah, there is definitely something to be said about how do we use the workshops to
+
+11:36.000 --> 11:41.040
+make content that lasts after the workshop. It's a discussion we've been having with some
+
+11:41.040 --> 11:47.520
+of the workshop organizers. I remember mostly Emacs SF again, and also Emacs Paris. We were
+
+11:47.520 --> 11:52.760
+talking about, yes, we record the sessions, but we share the sessions only with members
+
+11:52.760 --> 11:59.440
+of the event. What if we have a really great presentation? It would be such a shame to
+
+11:59.440 --> 12:05.440
+leave it live merely on the BBB record server where only users can see it. No, it's actually
+
+12:05.440 --> 12:09.840
+much better if we could find a way to share it on YouTube, for instance, or any other
+
+12:09.840 --> 12:15.120
+distribution platform where people would be able to share this. With EmacsConf, we share
+
+12:15.120 --> 12:19.960
+all the talks that happen in prior years. What if we could have user groups and workshops
+
+12:19.960 --> 12:23.840
+do the same? That would be amazing. But I think people are feeling a little iffy and
+
+12:23.840 --> 12:28.880
+rightfully so. This is a lot of energy to first make presentations like this for the
+
+12:28.880 --> 12:36.080
+speakers, but then to package them, to caption them for accessibility. We are able to broadcast
+
+12:36.080 --> 12:42.000
+talk this year with captions with no little thanks to Bavin, who is actually helping us
+
+12:42.000 --> 12:47.840
+a lot behind the scenes working on the subtitles. Thank you again so much, Bavin, for all this.
+
+12:47.840 --> 12:52.020
+You will be the first to tell, this is a lot of work, actually. I'm not sure how much time
+
+12:52.020 --> 12:58.400
+you've spent in the last two months working on subtitles, but it's been a long time.
+
+12:58.400 --> 13:03.720
+It does take time. That's why I'm still not sure how much time it will take for me to
+
+13:03.720 --> 13:09.400
+get those talks or recordings out, right? But as a first step, like I mentioned in the
+
+13:09.400 --> 13:17.160
+talk as well, just get it out first and then work towards refining it.
+
+13:17.160 --> 13:24.440
+Yeah, that's the usual saying that good is better than perfect or here and there is better
+
+13:24.440 --> 13:30.760
+than later and never. I think that's a very good plan here. Bavin, we have about five
+
+13:30.760 --> 13:35.200
+more minutes until we need to head into the next store. We have opened the chat room,
+
+13:35.200 --> 13:39.320
+so if people wanted to join and ask questions with Bavin, mostly if you're interested in
+
+13:39.320 --> 13:43.480
+running your own workshop, this would be a golden opportunity to converse with Bavin
+
+13:43.480 --> 13:48.160
+and see how you could get started on this. Or maybe if you want to find people interested
+
+13:48.160 --> 13:53.560
+in starting a workshop, maybe not in BBB today, but it'd be interesting for you to connect
+
+13:53.560 --> 14:00.440
+on the pad or whatever else really to be able to say, oh yeah, I want to start an Emacs
+
+14:00.440 --> 14:04.560
+Michigan meeting or whatever. I'm not sure why I defaulted to Michigan, don't ask me.
+
+14:04.560 --> 14:08.480
+But you would be able to find maybe other people willing to do so and that'd be great.
+
+14:08.480 --> 14:12.080
+Why don't you stop moving my hands like this? This is the one gesture I'm doing today and
+
+14:12.080 --> 14:17.760
+I need to pluralize it a little bit. Do we have any more questions on the pad? I think
+
+14:17.760 --> 14:18.760
+no.
+
+14:18.760 --> 14:25.800
+Not on pad. I think there are two questions in IRC. I'll just quickly answer them. One
+
+14:25.800 --> 14:33.320
+is about automation. So I have my repository, the website repository on GitLab and they
+
+14:33.320 --> 14:40.160
+provide something called pipelines. So you can just schedule things and I have a cronjob
+
+14:40.160 --> 14:47.880
+you can say sort of on their platform itself, which goes and gets triggered on certain days
+
+14:47.880 --> 14:57.920
+and my script basically takes care of publishing a new blog entry basically. And there was
+
+14:57.920 --> 15:08.280
+one question, what is iLuxy? So it is a new Linux user group from Chennai, India. So yeah,
+
+15:08.280 --> 15:15.080
+I think I've been using their mailing list and there have been a couple of people from
+
+15:15.080 --> 15:23.160
+that part of the country who joined the meetup as well.
+
+15:23.160 --> 15:28.240
+And we're definitely trying to make Emacs user group a thing. Like Lug, Linux user group
+
+15:28.240 --> 15:33.520
+has been a thing for decades at this point. And if only we could manage to make, I mean,
+
+15:33.520 --> 15:41.760
+the thing it doesn't sound as well, a huge, probably the worst argument in its favor really,
+
+15:41.760 --> 15:47.000
+but Emacs user group feels like it should be something that is widely adopted as much
+
+15:47.000 --> 15:51.240
+as Linux user groups. Because when you think about it, whether it be Linux or whether it
+
+15:51.240 --> 15:57.080
+be Emacs, those groups are where a lot of people get to experiment with those tools
+
+15:57.080 --> 16:02.600
+and learn, especially a lot of beginners who make it to those meetings. They get propelled
+
+16:02.600 --> 16:07.200
+in the future in terms of how much they learn and it's so much better. You probably heard
+
+16:07.200 --> 16:13.000
+more about this in the Android talk we had earlier today. Right, I'm blabbering on about,
+
+16:13.000 --> 16:18.960
+but it's a topic very dear to my heart and I'm so glad that you managed to feel sorry
+
+16:18.960 --> 16:26.080
+a topic and a presentation. Sorry, I'm mixing up everything there.
+
+16:26.080 --> 16:33.140
+We will soon be moving on to the next stream. So I see that we have a couple of people still
+
+16:33.140 --> 16:38.120
+on BBB, but no one with a microphone. So again, when we open the BBB chat room, if you want
+
+16:38.120 --> 16:42.800
+to join and ask questions, it's all the better. It's good if you want to join and listen,
+
+16:42.800 --> 16:47.520
+but we need people to actually be asking questions because that's when we have the speaker in
+
+16:47.520 --> 16:52.400
+one room and you can gather all the questions. I'm going to give you a little secret. If
+
+16:52.400 --> 16:56.360
+sometimes it doesn't sound like I'm making any sense, it's because on one here, I am
+
+16:56.360 --> 17:00.520
+listening to Bavin. That's the left here. On the right here, I'm listening to production
+
+17:00.520 --> 17:07.640
+and sometimes stuff is burning in the background and I have to take a deep breath and focus
+
+17:07.640 --> 17:12.120
+on, for instance, everyone is talking in my ear. It's really complicated. So what I'll
+
+17:12.120 --> 17:16.880
+be doing is that in about 1 minute and 20 seconds, we'll be moving into the next talk.
+
+17:16.880 --> 17:21.480
+Bavin, thank you so much for taking the time to answer all the questions. You'll probably
+
+17:21.480 --> 17:24.960
+be sleeping fairly soon, right?
+
+17:24.960 --> 17:31.880
+Yeah, please help us in the backstage. But yes, thank you so much for all your help.
+
+17:31.880 --> 17:36.000
+Thank you for your presentation. As for the others, we are about to move to the next talk
+
+17:36.000 --> 17:40.840
+in about 1 minute. So it's going to be a bit of an awkward pause again. Sorry for this,
+
+17:40.840 --> 17:46.800
+but at the top of the next minute, we'll be starting the next talk. See you in a bit,
+
+17:46.800 --> 17:49.400
+I suppose. Thank you again, Bavin.
+
+17:49.400 --> 17:53.760
+Thank you. Thank you for organizing the event. It has been fun.
+
+17:53.760 --> 17:54.880
+Thank you for participating in it.
+
diff --git a/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main--chapters.vtt b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main--chapters.vtt
new file mode 100644
index 00000000..b2f37314
--- /dev/null
+++ b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main--chapters.vtt
@@ -0,0 +1,82 @@
+WEBVTT
+
+00:00.000 --> 00:01:10.120
+Introduction
+
+01:10.120 --> 00:02:08.320
+Example from Emacs APAC
+
+02:08.320 --> 00:02:27.400
+"Why should I attend meetups?"
+
+02:27.400 --> 00:02:56.800
+"I am a beginner"
+
+02:56.800 --> 00:03:16.160
+"I am an experienced user"
+
+03:16.160 --> 00:04:10.000
+Finding meetups
+
+04:10.000 --> 00:04:36.840
+How to join
+
+04:36.840 --> 00:05:33.200
+Emacs Calendar
+
+05:33.200 --> 00:06:45.560
+Making the most of a meetup
+
+06:45.560 --> 00:07:19.680
+"What if I want to start my own meetup group?"
+
+07:19.680 --> 00:07:37.880
+"How much effort do I need to put?"
+
+07:37.880 --> 00:07:58.480
+"What if I'm new to Emacs?"
+
+07:58.480 --> 00:08:52.600
+"How do I do it now?"
+
+08:52.600 --> 00:09:49.440
+Why I prefer discussions
+
+09:49.440 --> 00:10:18.240
+What about talks?
+
+10:18.240 --> 00:10:58.480
+Frequency of the meetup
+
+10:58.480 --> 00:11:39.960
+"Should I schedule and just wait?"
+
+11:39.960 --> 00:11:58.920
+Adding your event to the Emacs Calendar
+
+11:58.920 --> 00:13:00.280
+What to do during the meetup
+
+13:00.280 --> 00:14:44.240
+After the meetup
+
+14:44.240 --> 00:14:59.800
+Checklist
+
+14:59.800 --> 00:15:57.240
+Co-organizers
+
+15:57.240 --> 00:17:14.200
+Website
+
+17:14.200 --> 00:17:42.280
+Video conferencing
+
+17:42.280 --> 00:18:01.720
+Communication
+
+18:01.720 --> 00:18:50.080
+Other resources
+
+18:50.080 --> 00:19:35.280
+Connecting with other organizers
diff --git a/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.vtt b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.vtt
new file mode 100644
index 00000000..8830e71e
--- /dev/null
+++ b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.vtt
@@ -0,0 +1,1321 @@
+WEBVTT captioned by bhavin192
+
+00:00.000 --> 00:09.880
+Hello everyone, welcome to my talk.
+
+00:09.880 --> 00:11.160
+I hope you all have been
+
+00:11.160 --> 00:14.680
+enjoying EmacsConf so far, like I am.
+
+00:14.680 --> 00:15.960
+But you might be wondering,
+
+00:15.960 --> 00:18.480
+"How do I meet fellow Emacs users
+
+00:18.480 --> 00:21.560
+after the conference?"
+
+00:21.560 --> 00:23.760
+What if I tell you there is a way?
+
+00:23.760 --> 00:26.680
+The answer is local meetups.
+
+00:26.680 --> 00:29.840
+These are user groups who arrange events
+
+00:29.840 --> 00:34.800
+at some frequency, they meet at some frequency.
+
+00:34.800 --> 00:36.840
+That's what we are going to talk about today:
+
+00:36.840 --> 00:39.480
+attending and organizing Emacs meetups.
+
+00:39.480 --> 00:41.600
+In other words, enjoying your Emacs journey
+
+00:41.600 --> 00:43.880
+with more folks!
+
+00:43.880 --> 00:45.880
+I am Bhavin, I am from India,
+
+00:45.880 --> 00:47.280
+and I have been organizing
+
+00:47.280 --> 00:49.200
+Emacs Asia Pacific meetup
+
+00:49.200 --> 00:52.280
+since last few months [almost 2 years].
+
+00:52.280 --> 00:54.600
+We will be talking about online meetups
+
+00:54.600 --> 00:57.440
+most of the time.
+
+00:57.440 --> 00:00:59.251
+The beauty of online meetups is,
+
+00:00:59.251 --> 00:01:01.480
+you can join any meetups
+
+01:01.480 --> 01:03.360
+if the time permits,
+
+01:03.360 --> 01:05.080
+if the time zone is same.
+
+01:05.080 --> 01:07.080
+And there is no barrier.
+
+01:07.080 --> 01:10.120
+So let's get started.
+
+01:10.120 --> 01:14.120
+Let's see how a meetup looks like.
+
+01:14.120 --> 01:18.040
+We will see one of the Emacs APAC meetup's
+
+01:18.040 --> 01:25.640
+snippet, basically.
+
+01:25.640 --> 01:29.200
+[Ihor]: There is something called org-indent-mode.
+
+01:29.200 --> 01:33.040
+So, it's like this org-adapt-indentation
+
+01:33.040 --> 01:34.720
+which is like electric indent.
+
+01:34.720 --> 01:37.480
+Like when you press enter, it will indent.
+
+01:37.480 --> 01:41.520
+There is org-indent-mode, which does not require you
+
+01:41.520 --> 01:44.560
+to actually make the indents physically
+
+01:44.560 --> 01:45.600
+in the file.
+
+01:45.600 --> 01:54.320
+It will make things appear indented.
+
+01:54.320 --> 01:55.880
+This one?
+
+01:55.880 --> 01:56.400
+Yeah.
+
+01:56.400 --> 01:57.200
+[Bhavin]: org-adapt-indentation.
+
+01:57.200 --> 02:03.120
+Okay.
+
+02:03.120 --> 02:04.800
+Looks interesting, right?
+
+02:04.800 --> 02:08.320
+So, let's get into more details.
+
+02:08.320 --> 02:09.520
+You might have a question:
+
+02:09.520 --> 02:11.400
+"Why I should attend meetups?"
+
+02:11.400 --> 02:12.240
+That's a good question.
+
+02:12.240 --> 02:14.640
+You should always ask "why".
+
+02:14.640 --> 02:19.160
+It's an opportunity to learn together.
+
+02:19.160 --> 02:21.640
+You basically meet like-minded people,
+
+02:21.640 --> 02:23.560
+like-minded Emacs users,
+
+02:23.560 --> 02:27.400
+and you can always have fun, right?
+
+02:27.400 --> 02:29.160
+You still might have a question:
+
+02:29.160 --> 02:31.040
+"I am a beginner."
+
+02:31.040 --> 02:34.080
+I would say that's a great avenue for you.
+
+02:34.080 --> 02:36.640
+You get to discover more things.
+
+02:36.640 --> 02:38.800
+You can get help if you are facing
+
+02:38.800 --> 02:41.120
+any issues, any errors.
+
+02:41.120 --> 02:42.920
+And always keep in mind that it's okay
+
+02:42.920 --> 02:44.280
+if you don't understand everything
+
+02:44.280 --> 02:45.160
+from the discussions.
+
+02:45.160 --> 02:49.800
+There are going to be times where everything is…,
+
+02:49.800 --> 02:51.960
+all the topics you are not able to understand,
+
+02:51.960 --> 02:56.800
+which is totally fine.
+
+02:56.800 --> 02:58.760
+"I am an experienced user."
+
+02:58.760 --> 03:00.240
+I would say that's even better
+
+03:00.240 --> 03:01.720
+because you can help others
+
+03:01.720 --> 03:03.680
+during the meetup.
+
+03:03.680 --> 03:06.440
+And usually, in Emacs or in general,
+
+03:06.440 --> 03:08.200
+there is always something new to learn.
+
+03:08.200 --> 03:10.160
+There are plenty of packages.
+
+03:10.160 --> 03:11.080
+There might be something
+
+03:11.080 --> 03:12.440
+you have never tried.
+
+03:12.440 --> 03:13.760
+And there are always going to be
+
+03:13.760 --> 03:16.160
+different workflows of using something.
+
+03:16.160 --> 03:23.520
+So now, how do I become part of a meetup, right?
+
+03:23.520 --> 03:26.920
+"How do I become part of a meetup group?"
+
+03:26.920 --> 03:29.000
+The first step you might be doing is
+
+03:29.000 --> 03:30.920
+finding a meetup.
+
+03:30.920 --> 03:32.200
+There is this page,
+
+03:32.200 --> 03:35.120
+EmacsWiki page called Usergroups,
+
+03:35.120 --> 03:37.000
+currently maintained
+
+03:37.000 --> 03:38.680
+by Leo and Sacha.
+
+03:38.680 --> 03:46.600
+So, let's see how that page looks like.
+
+03:46.600 --> 03:48.040
+As you can see, this page tells you
+
+03:48.040 --> 03:51.160
+about all the upcoming events.
+
+03:51.160 --> 00:04:05.485
+And it also has a list of all the meetup groups.
+
+00:04:05.485 --> 00:04:10.000
+So, you can find all the groups there.
+
+04:10.000 --> 04:11.760
+Once you find one,
+
+04:11.760 --> 04:13.480
+you need to join them, right?
+
+04:13.480 --> 04:17.880
+How to join differs from group to group
+
+04:17.880 --> 04:20.520
+but usually you will find a way to subscribe
+
+04:20.520 --> 04:23.160
+to their mailing list or RSS feed,
+
+04:23.160 --> 04:24.520
+join their IRC channels.
+
+04:24.520 --> 04:27.200
+They might have accounts on some platforms
+
+04:27.200 --> 04:29.960
+like Mobilizon or meetup.com.
+
+04:29.960 --> 04:31.400
+You can just go there and join,
+
+04:31.400 --> 04:32.320
+so that you get notified
+
+04:32.320 --> 04:36.840
+whenever there is a new event.
+
+04:36.840 --> 04:39.120
+Now, seeing that list,
+
+04:39.120 --> 04:42.080
+you might say, "There are too many events
+
+04:42.080 --> 04:42.920
+of my interest."
+
+04:42.920 --> 04:47.000
+Don't worry, there is a solution.
+
+04:47.000 --> 04:49.280
+There is an Emacs calendar,
+
+04:49.280 --> 04:51.960
+you can subscribe to this calendar.
+
+04:51.960 --> 04:55.120
+Let's see what all events
+
+04:55.120 --> 04:56.800
+are there in this particular calendar.
+
+04:56.800 --> 05:00.120
+This month there is Emacs Berlin to start with
+
+05:00.120 --> 05:02.840
+and then there is EmacsConf,
+
+05:02.840 --> 05:06.360
+then Emacs APAC is also there.
+
+05:06.360 --> 05:15.520
+Let's see…, there is a companion website
+
+05:15.520 --> 05:17.840
+for this calendar as well.
+
+05:17.840 --> 05:19.240
+Let's go to the website also.
+
+05:19.240 --> 05:24.600
+You will see all the options, how to import it.
+
+05:24.600 --> 05:26.240
+There is ICS file,
+
+05:26.240 --> 05:28.120
+there are different time zones,
+
+05:28.120 --> 05:29.200
+Org mode files.
+
+05:29.200 --> 05:33.200
+You can just go there and subscribe.
+
+05:33.200 --> 05:38.520
+"How do I make most of it?
+
+05:38.520 --> 05:40.640
+If I am attending a meetup,
+
+05:40.640 --> 05:42.120
+how do I make most of it?"
+
+05:42.120 --> 05:44.480
+I would say never hesitate
+
+05:44.480 --> 05:45.520
+from asking questions.
+
+05:45.520 --> 05:46.600
+If there is something new,
+
+05:46.600 --> 05:47.840
+something you don't understand,
+
+05:47.840 --> 05:49.240
+just go ahead and ask questions.
+
+05:49.240 --> 05:51.320
+Ask for help if you are stuck somewhere.
+
+05:51.320 --> 05:54.040
+There are going to be new things,
+
+05:54.040 --> 05:56.120
+so make sure you note them down,
+
+05:56.120 --> 05:58.400
+and you can try those later.
+
+05:58.400 --> 06:04.600
+If possible, have a microphone or webcam on,
+
+06:04.600 --> 06:07.120
+so that you can connect with others very easily.
+
+06:07.120 --> 06:10.560
+If that's not an option for some reason,
+
+06:10.560 --> 06:12.520
+it's fine, you can always use chat
+
+06:12.520 --> 06:13.720
+and interact with everyone.
+
+06:13.720 --> 06:18.560
+So, don't make that a reason for not attending.
+
+06:18.560 --> 06:20.360
+Go ahead and attend,
+
+06:20.360 --> 06:22.640
+even if you just have chat as an option
+
+06:22.640 --> 06:23.720
+to interact with others.
+
+06:23.720 --> 06:27.480
+"Wait, I still have questions."
+
+06:27.480 --> 06:28.520
+Definitely.
+
+06:28.520 --> 06:30.360
+If you have more questions,
+
+06:30.360 --> 06:31.640
+go ahead and post those.
+
+06:31.640 --> 06:34.440
+I will come to them at the end.
+
+06:34.440 --> 06:42.840
+Now we know how to attend,
+
+06:42.840 --> 00:06:44.651
+what are the things you need to do
+
+00:06:44.651 --> 00:06:45.560
+if you want to attend.
+
+06:45.560 --> 00:06:48.418
+"What if I want to start my own meetup group?"
+
+00:06:48.418 --> 00:06:51.520
+Because there is no regional group,
+
+06:51.520 --> 06:53.560
+or there is something very specific
+
+06:53.560 --> 06:55.560
+which you want to start a group about.
+
+06:55.560 --> 07:01.800
+Again, "Why should I start a meetup group?"
+
+07:01.800 --> 07:05.080
+It is a way, I would say, to give back
+
+07:05.080 --> 07:08.880
+to the community by creating a platform
+
+07:08.880 --> 07:10.560
+for people to interact.
+
+07:10.560 --> 00:07:15.440
+You give speakers a platform,
+
+07:15.440 --> 07:17.520
+you also give a platform to the attendees.
+
+07:17.520 --> 07:19.680
+And obviously to have fun with others.
+
+07:19.680 --> 07:25.640
+There are some common questions
+
+07:25.640 --> 07:26.880
+which might come up,
+
+07:26.880 --> 00:07:28.051
+something like,
+
+00:07:28.051 --> 00:07:29.720
+"How much effort do I need to put?"
+
+07:29.720 --> 07:32.600
+Personally, I don't have to put
+
+07:32.600 --> 07:34.520
+more than two hours a month,
+
+07:34.520 --> 07:36.760
+that's including the time
+
+07:36.760 --> 07:37.880
+I attend the meetup.
+
+07:37.880 --> 07:42.600
+"What if I'm new to Emacs?"
+
+07:42.600 --> 07:43.600
+That's totally fine.
+
+07:43.600 --> 07:45.920
+You don't have to know Emacs,
+
+07:45.920 --> 07:47.200
+you don't have to be an expert
+
+07:47.200 --> 07:48.400
+to start a meetup group.
+
+07:48.400 --> 07:49.600
+That's totally fine.
+
+07:49.600 --> 07:51.480
+You will have more folks joining in
+
+07:51.480 --> 07:54.120
+with different experiences.
+
+07:54.120 --> 07:57.160
+That's totally fine to be a beginner
+
+07:57.160 --> 07:58.480
+in Emacs to start a meetup.
+
+07:58.480 --> 08:02.440
+"How do I do it now?"
+
+08:02.440 --> 08:05.680
+So, let's look at some specifics,
+
+08:05.680 --> 08:08.280
+some questions you might need to answer
+
+08:08.280 --> 08:10.520
+in order to start your meetup group.
+
+08:10.520 --> 08:13.640
+Format of the meetup.
+
+08:13.640 --> 08:17.120
+What participants will do during the meetup?
+
+08:17.120 --> 08:20.920
+Let's see one of the options,
+
+08:20.920 --> 08:23.680
+this is one of my favorites.
+
+08:23.680 --> 08:26.640
+Keep it simple, a bit unstructured
+
+08:26.640 --> 08:28.320
+and have free flowing discussions.
+
+08:28.320 --> 08:30.640
+What does that mean?
+
+08:30.640 --> 08:32.720
+That basically means letting people
+
+08:32.720 --> 08:35.480
+ask questions, share new things they have found,
+
+08:35.480 --> 08:39.840
+let them ask doubts, let them ask for help.
+
+08:39.840 --> 08:44.200
+During this free flowing discussions,
+
+08:44.200 --> 08:46.920
+you can go through Emacs News as well,
+
+08:46.920 --> 08:49.760
+go through the topics, and you might find
+
+08:49.760 --> 08:52.600
+something interesting which you can talk about.
+
+08:52.600 --> 08:57.280
+Why I prefer discussions?
+
+08:57.280 --> 09:00.840
+Discussions basically give an opportunity
+
+09:00.840 --> 09:03.880
+to all the participants to participate.
+
+09:03.880 --> 09:06.640
+They get to talk about what they know
+
+09:06.640 --> 09:09.000
+rather than just having one way talk.
+
+09:09.000 --> 09:12.120
+They can basically participate
+
+09:12.120 --> 09:13.600
+by putting up their thoughts.
+
+09:13.600 --> 09:17.200
+Everyone gets to learn more
+
+09:17.200 --> 09:18.480
+as topics change.
+
+09:18.480 --> 09:21.120
+Usually during these free flowing discussions,
+
+09:21.120 --> 09:22.800
+topics keep changing
+
+09:22.800 --> 09:25.120
+and that's how you get to learn more.
+
+09:25.120 --> 09:29.000
+This also has less friction for the speakers.
+
+09:29.000 --> 00:09:31.651
+They won't have a burden that,
+
+00:09:31.651 --> 00:09:34.485
+"Okay, I have a talk in the meetup
+
+00:09:34.485 --> 00:09:35.600
+I need to prepare."
+
+09:35.600 --> 09:38.320
+That just increases friction for them
+
+09:38.320 --> 09:39.040
+to participate.
+
+09:39.040 --> 09:42.080
+If you are having a free flowing discussion,
+
+09:42.080 --> 00:09:44.685
+it's basically just a matter of saying,
+
+00:09:44.685 --> 00:09:47.200
+"Hey, maybe I would like to share my screen,
+
+09:47.200 --> 09:49.440
+and I'll talk about this particular thing."
+
+09:49.440 --> 09:53.560
+What about talks?
+
+09:53.560 --> 09:55.240
+Everyone loves talks, even I do.
+
+09:55.240 --> 09:58.880
+So, make sure you are also accommodating talks,
+
+09:58.880 --> 10:00.800
+allow people to submit talks,
+
+10:00.800 --> 10:03.960
+and have talks plus discussions.
+
+10:03.960 --> 10:07.560
+You can also host watch parties.
+
+10:07.560 --> 10:09.320
+You can pick up
+
+10:09.320 --> 10:11.160
+any of the talks from EmacsConf
+
+10:11.160 --> 10:14.240
+for anything which is out there,
+
+10:14.240 --> 10:15.840
+and you can watch it together,
+
+10:15.840 --> 10:17.240
+and you can have discussion
+
+10:17.240 --> 10:18.240
+about that particular talk.
+
+10:18.240 --> 10:23.000
+The next question
+
+10:23.000 --> 10:24.400
+you might need to answer
+
+10:24.400 --> 10:25.640
+is frequency of the meetup.
+
+10:25.640 --> 10:28.800
+How often the group is going to meet?
+
+10:28.800 --> 10:32.880
+One option is recurring meetups.
+
+10:32.880 --> 10:37.080
+So something like, you meet every month
+
+10:37.080 --> 10:39.000
+on a specific day time.
+
+10:39.000 --> 10:43.640
+Another option is one-off meetups.
+
+10:43.640 --> 10:46.240
+You can meet whenever you have
+
+10:46.240 --> 10:47.520
+some specific talk,
+
+10:47.520 --> 10:49.600
+some specific discussion topic.
+
+10:49.600 --> 10:52.680
+What you can do about the timing is,
+
+10:52.680 --> 10:54.680
+if you are targeting a specific region,
+
+10:54.680 --> 10:56.840
+make sure [people from] all the time zones
+
+10:56.840 --> 10:58.480
+from that region are able to attend.
+
+10:58.480 --> 11:04.480
+Now you have figured out everything
+
+11:04.480 --> 11:06.200
+and you are going to schedule the meetup.
+
+11:06.200 --> 11:08.280
+So, "Should I schedule and just wait?"
+
+11:08.280 --> 11:08.760
+No.
+
+11:08.760 --> 11:10.960
+Go ahead and spread the word about it.
+
+11:10.960 --> 11:12.560
+Let's see what we can do.
+
+11:12.560 --> 11:16.480
+You can post on social media about your event.
+
+11:16.480 --> 11:19.840
+Usually do it a week or two before,
+
+11:19.840 --> 11:24.200
+so that people can plan their other things.
+
+11:24.200 --> 11:27.640
+Share it on local GNU/Linux user groups.
+
+11:27.640 --> 11:30.360
+They might have IRC channels, mailing lists,
+
+11:30.360 --> 11:32.240
+so you should share your event there.
+
+11:32.240 --> 11:35.120
+Reddit seems to be a popular place as well.
+
+11:35.120 --> 11:37.520
+Many people follow and are there,
+
+11:37.520 --> 11:39.960
+so you can post about your event there as well.
+
+11:39.960 --> 11:43.640
+The next option is adding your event
+
+11:43.640 --> 11:45.000
+to Emacs calendar.
+
+11:45.000 --> 11:47.760
+You should get your event added
+
+11:47.760 --> 11:49.680
+to the EmacsWiki and the calendar,
+
+11:49.680 --> 11:51.080
+which we saw in the first part.
+
+11:51.080 --> 11:53.680
+And the instructions are given there.
+
+11:53.680 --> 11:55.640
+So, whenever you schedule a meetup,
+
+11:55.640 --> 11:58.000
+you should definitely add your event
+
+11:58.000 --> 11:58.920
+to those places.
+
+11:58.920 --> 12:02.800
+Next thing you should do is…,
+
+12:02.800 --> 12:04.240
+these are few points
+
+12:04.240 --> 12:07.720
+which you should do during the meetup.
+
+12:07.720 --> 12:10.760
+You should start with the introductions.
+
+12:10.760 --> 12:14.560
+Introductions serve as an icebreaker, usually.
+
+12:14.560 --> 12:18.240
+They make everyone speak about themselves,
+
+12:18.240 --> 12:20.200
+so that everyone knows each other
+
+12:20.200 --> 12:21.120
+a bit at least.
+
+12:21.120 --> 12:24.880
+Make sure it is possible for others
+
+12:24.880 --> 12:27.520
+to participate via chat.
+
+12:27.520 --> 12:30.920
+So, if there are some messages in the chat,
+
+12:30.920 --> 12:32.840
+make sure you relay those to others
+
+12:32.840 --> 12:35.680
+who are talking via audio/video.
+
+12:35.680 --> 12:39.440
+Share your website at the end,
+
+12:39.440 --> 12:41.720
+so that people know and they can follow it,
+
+12:41.720 --> 12:44.360
+and they can join the next event.
+
+12:44.360 --> 12:48.280
+The next is keeping track of time.
+
+12:48.280 --> 12:50.560
+Make sure you keep track of time.
+
+12:50.560 --> 12:52.720
+Have some time, let's say, 1 hour
+
+12:52.720 --> 12:54.760
+or slightly more than that
+
+12:54.760 --> 12:56.600
+and time-bound your event,
+
+12:56.600 --> 12:58.760
+so that we respect everyone's time
+
+12:58.760 --> 13:00.280
+and we conclude in time.
+
+13:00.280 --> 13:05.000
+Now your meetup was done,
+
+13:05.000 --> 13:06.960
+it was good, people attended.
+
+13:06.960 --> 13:07.800
+What's next?
+
+13:07.800 --> 13:10.600
+Publishing the recordings, I would say.
+
+13:10.600 --> 13:14.800
+You should consider publishing the talks
+
+13:14.800 --> 13:15.760
+or discussions both.
+
+13:15.760 --> 13:20.240
+The reason being people can revisit the things.
+
+13:20.240 --> 13:21.960
+Usually people go back
+
+13:21.960 --> 13:23.640
+and watch the recordings again.
+
+13:23.640 --> 13:26.200
+And those who were not able to attend,
+
+13:26.200 --> 13:27.640
+they can also participate
+
+13:27.640 --> 13:28.880
+by watching the recording.
+
+13:28.880 --> 13:32.040
+You can do even more.
+
+13:32.040 --> 13:34.640
+You can have captions for the videos,
+
+13:34.640 --> 13:37.280
+so that people can enjoy the talks
+
+13:37.280 --> 13:40.600
+way better than just audio video.
+
+13:40.600 --> 13:43.400
+And you can even have written summaries
+
+13:43.400 --> 00:13:44.451
+of the discussions,
+
+00:13:44.451 --> 00:13:45.960
+something like with links.
+
+13:45.960 --> 13:48.560
+Let's see some of the examples of summaries.
+
+13:48.560 --> 13:55.080
+This is one of the summaries
+
+13:55.080 --> 13:56.880
+for Austin meetup
+
+13:56.880 --> 13:59.200
+and this is written by someone
+
+13:59.200 --> 14:01.400
+who is participating during that meetup.
+
+14:01.400 --> 14:04.000
+You can see they have put up their thoughts,
+
+14:04.000 --> 14:05.520
+what they think about something
+
+14:05.520 --> 14:08.160
+they got to know in the event.
+
+14:08.160 --> 14:14.280
+Another example we can see is M-x Research.
+
+14:14.280 --> 14:16.800
+You can see they have put up
+
+14:16.800 --> 14:18.960
+all the discussion points.
+
+14:18.960 --> 14:21.320
+They even have action items from the meetup.
+
+14:21.320 --> 14:25.240
+One more example we can see is Emacs APAC.
+
+14:25.240 --> 14:28.280
+What I have done here is,
+
+14:28.280 --> 14:30.360
+I have mentioned the topic and links,
+
+14:30.360 --> 14:32.840
+who shared what.
+
+14:32.840 --> 14:36.720
+And that's about post meetup stuff.
+
+14:36.720 --> 14:38.280
+You can keep it simple.
+
+14:38.280 --> 14:40.960
+Just start with hosting your video recordings,
+
+14:40.960 --> 14:44.240
+and just start with basic links and details.
+
+14:44.240 --> 14:50.480
+So, are we ready to start a meetup?
+
+14:50.480 --> 14:52.880
+Definitely.
+
+14:52.880 --> 14:54.640
+Let's see some of the points
+
+14:54.640 --> 14:56.120
+or checklist, I would say,
+
+14:56.120 --> 14:57.640
+you should do before you start
+
+14:57.640 --> 14:58.200
+a meetup group.
+
+14:58.200 --> 14:59.800
+What are the next steps?
+
+14:59.800 --> 15:04.440
+Have a co-organizer.
+
+15:04.440 --> 15:07.960
+So, have at least one co-organizer or person
+
+15:07.960 --> 15:09.640
+to talk to during the meetup,
+
+15:09.640 --> 15:12.600
+so that even if no one shows up
+
+15:12.600 --> 15:14.320
+you will have someone to talk to
+
+15:14.320 --> 15:16.240
+and you both can discuss
+
+15:16.240 --> 15:20.160
+about the topic you decided to.
+
+15:20.160 --> 15:22.200
+If your friend or the person
+
+15:22.200 --> 15:23.760
+you have reached out to
+
+15:23.760 --> 15:26.760
+are hesitant to become a "co-organizer",
+
+15:26.760 --> 15:28.960
+because that feels like responsibility,
+
+15:28.960 --> 15:29.720
+it's fine.
+
+15:29.720 --> 15:32.360
+You can ask them to just come with you
+
+15:32.360 --> 15:36.480
+and have the discussion during the event.
+
+15:36.480 --> 15:38.720
+And like Andrea explained
+
+15:38.720 --> 15:40.200
+in his talk about 'buddy',
+
+15:40.200 --> 15:43.520
+buddy is someone who is helping you
+
+15:43.520 --> 15:45.000
+with your Emacs journey.
+
+15:45.000 --> 15:48.800
+Buddies and their mentees
+
+15:48.800 --> 15:52.280
+can make their meeting public,
+
+15:52.280 --> 15:56.040
+and that can be a good way to start
+
+15:56.040 --> 15:57.240
+or spin-off a meetup.
+
+15:57.240 --> 16:01.920
+Have a website for your meetup.
+
+16:01.920 --> 16:04.440
+You should definitely have a website
+
+16:04.440 --> 16:05.920
+where people can go and read
+
+16:05.920 --> 16:08.640
+about your event or the group.
+
+16:08.640 --> 16:10.280
+Keep it simple.
+
+16:10.280 --> 16:13.440
+Have RSS feed, so that people can subscribe.
+
+16:13.440 --> 16:15.520
+And whenever you have new talks,
+
+16:15.520 --> 16:17.680
+make sure you add those talks
+
+16:17.680 --> 16:18.880
+to the announcement pages.
+
+16:18.880 --> 16:23.960
+Let's quickly see some of the example websites.
+
+16:23.960 --> 16:32.480
+The first one here is again
+
+16:32.480 --> 16:34.160
+Emacs Asia-Pacific event.
+
+16:34.160 --> 16:36.880
+You can see we have details,
+
+16:36.880 --> 16:41.080
+what is the timing, how to submit a talk,
+
+16:41.080 --> 16:42.000
+how to attend.
+
+16:42.000 --> 16:45.720
+Next example is Emacs Berlin.
+
+16:45.720 --> 16:47.480
+So, you can see they have mentioned
+
+16:47.480 --> 16:48.680
+what is the next event,
+
+16:48.680 --> 16:51.440
+which were the previous events,
+
+16:51.440 --> 16:53.840
+how to participate, how to stay updated.
+
+16:53.840 --> 16:57.040
+And similarly, there is M-x Research as well.
+
+16:57.040 --> 16:59.080
+They have mentioned what are the events,
+
+16:59.080 --> 17:00.600
+what are the upcoming events and all.
+
+17:00.600 --> 17:09.280
+You can just get started
+
+17:09.280 --> 17:11.160
+by taking any of the websites,
+
+17:11.160 --> 17:13.040
+and just modify it to your liking.
+
+17:13.040 --> 17:14.200
+That's totally fine.
+
+17:14.200 --> 17:17.640
+The next thing you will need
+
+17:17.640 --> 17:19.080
+is a video conferencing tool.
+
+17:19.080 --> 17:23.360
+It should support video, screen share, chat.
+
+17:23.360 --> 17:25.120
+These are the few of
+
+17:25.120 --> 17:27.680
+the free software options.
+
+17:27.680 --> 17:29.240
+One is BigBlueButton
+
+17:29.240 --> 17:31.000
+and another is Jitsi Meet.
+
+17:31.000 --> 17:33.040
+You can request for an account
+
+17:33.040 --> 17:36.840
+on the given instance to EmacsConf organizers
+
+17:36.840 --> 17:38.280
+on this mailing list,
+
+17:38.280 --> 17:40.400
+or you can stick to any
+
+17:40.400 --> 17:42.280
+of the Jitsi Meet instances.
+
+17:42.280 --> 17:45.960
+Communication media.
+
+17:45.960 --> 17:47.280
+You should have at least some way
+
+17:47.280 --> 17:51.120
+for people to interact post meetup
+
+17:51.120 --> 17:53.000
+or before the meetup.
+
+17:53.000 --> 00:17:57.385
+You can use any of the existing IRC channels, #emacsconf,
+
+00:17:57.386 --> 00:17:59.880
+or maybe you can use the existing
+
+17:59.880 --> 18:01.720
+GNU/Linux user groups lists.
+
+18:01.720 --> 18:07.600
+I would recommend you to read or watch
+
+18:07.600 --> 18:11.000
+"Starting an Emacs meetup" by Harry Schwartz.
+
+18:11.000 --> 18:13.080
+They have mentioned details
+
+18:13.080 --> 18:14.840
+about in-person meetups,
+
+18:14.840 --> 18:17.720
+but there are many important points
+
+18:17.720 --> 18:20.080
+to consider in that post
+
+18:20.080 --> 18:21.320
+as well as in the recording.
+
+18:21.320 --> 18:23.200
+So, go ahead and definitely watch
+
+18:23.200 --> 18:24.840
+before you start your meetup.
+
+18:24.840 --> 18:29.560
+If you need any help with
+
+18:29.560 --> 18:32.520
+BigBlueButton account, hosting,
+
+18:32.520 --> 18:35.280
+or captioning the talk recordings
+
+18:35.280 --> 18:37.160
+for very specific or good talks,
+
+18:37.160 --> 18:38.880
+don't hesitate to reach out to
+
+18:38.880 --> 18:40.480
+EmacsConf organizers.
+
+18:40.480 --> 18:42.320
+There are many volunteers
+
+18:42.320 --> 18:43.560
+subscribed to that list,
+
+18:43.560 --> 18:45.920
+so you will definitely find
+
+18:45.920 --> 18:50.080
+someone to help you.
+
+18:50.080 --> 18:50.760
+I had one idea.
+
+18:50.760 --> 18:53.240
+If you are one of the organizers,
+
+18:53.240 --> 18:55.400
+or if you plan to start a meetup,
+
+18:55.400 --> 18:57.360
+I was thinking if
+
+18:57.360 --> 18:59.280
+we can have a common platform
+
+18:59.280 --> 19:00.400
+for all the organizers
+
+19:00.400 --> 19:01.240
+to discuss what they are doing,
+
+19:01.240 --> 19:04.000
+what they are experimenting.
+
+19:04.000 --> 19:06.920
+If you are interested,
+
+19:06.920 --> 19:10.400
+drop me an email at this email address.
+
+19:10.400 --> 19:13.200
+If I get somewhere with this idea,
+
+19:13.200 --> 19:15.440
+I will definitely involve everyone
+
+19:15.440 --> 19:16.280
+who is interested.
+
+19:16.280 --> 19:21.240
+With that, we come to the end of my talk.
+
+19:21.240 --> 19:23.440
+I would like to thank Sacha and Leo
+
+19:23.440 --> 19:26.560
+for their inputs while I was creating this talk,
+
+19:26.560 --> 19:30.040
+and thank you for joining.
+
+19:30.040 --> 19:35.280
+Now it is time for the questions.
diff --git a/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main_es.vtt b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main_es.vtt
new file mode 100644
index 00000000..8f23ceb4
--- /dev/null
+++ b/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main_es.vtt
@@ -0,0 +1,1322 @@
+WEBVTT Kind: captions; Language: es; Captioned by quiliro
+
+00:00.000 --> 00:09.880
+Hola a todos y todas. Bienvenidos y bienvenidas a mi conferencia.
+
+00:09.880 --> 00:11.160
+Espero que todos y todas hayan disfrutado hasta ahora
+
+00:11.160 --> 00:14.680
+de EmacsConf, como lo hago yo.
+
+00:14.680 --> 00:15.960
+Pero podrían preguntarse,
+
+00:15.960 --> 00:18.480
+"¿Cómo me encuentro con usuarios y usuarias de Emacs
+
+00:18.480 --> 00:21.560
+luego de la conferencia?"
+
+00:21.560 --> 00:23.760
+¿Qué pasaría si les digo que hay una manera?
+
+00:23.760 --> 00:26.680
+La respuesta son los encuentros locales.
+
+00:26.680 --> 00:29.840
+Estos son grupos locales que organizan eventos
+
+00:29.840 --> 00:34.800
+Se encuentran con cierta frecuencia.
+
+00:34.800 --> 00:36.840
+Eso es de lo que vamos a hablar hoy:
+
+00:36.840 --> 00:39.480
+asistir a encuentros de Emacs y también organizarlos.
+
+00:39.480 --> 00:41.600
+En otras palabras,
+
+00:41.600 --> 00:43.880
+disfrutar de tu peregrinaje por Emacs con más gente!
+
+00:43.880 --> 00:45.880
+Soy Bhavin. Vengo de India,
+
+00:45.880 --> 00:47.280
+y he organizado
+
+00:47.280 --> 00:49.200
+el encuentro Emacs Asia Pacific
+
+00:49.200 --> 00:52.280
+desde hace casi 2 años.
+
+00:52.280 --> 00:54.600
+Hablaré acerca de los encuentros en línea
+
+00:54.600 --> 00:57.440
+la mayoría del tiempo.
+
+00:57.440 --> 00:00:59.251
+La belleza de los encuentros en línea es
+
+00:00:59.251 --> 00:01:01.480
+que puedes unirte a cualquier encuentro,
+
+01:01.480 --> 01:03.360
+si tu tiempo lo permite,
+
+01:03.360 --> 01:05.080
+sin importar la zona horaria.
+
+01:05.080 --> 01:07.080
+... y no existen barreras.
+
+01:07.080 --> 01:10.120
+Así que comencemos.
+
+01:10.120 --> 01:14.120
+Veamos qué aspecto tienen los encuentros.
+
+01:14.120 --> 01:18.040
+Básicalmente, veremos una parte
+
+01:18.040 --> 01:25.640
+de un encuentro Emacs APAC.
+
+01:25.640 --> 01:29.200
+[Ihor]: Existe algo llamado org-indent-mode.
+
+01:29.200 --> 01:33.040
+[Ihor]: Es como org-adapt-indentation
+
+01:33.040 --> 01:34.720
+[Ihor]: que es como la indentación eléctrica.
+
+01:34.720 --> 01:37.480
+[Ihor]: Cuando presionas enter, [el texto] será indentado.
+
+01:37.480 --> 01:41.520
+[Ihor]: Existe org-indent-mode, que no requiere
+
+01:41.520 --> 01:44.560
+[Ihor]: que insertes las indentaciones físicamente
+
+01:44.560 --> 01:45.600
+[Ihor]: en el archivo.
+
+01:45.600 --> 01:54.320
+[Ihor]: Hará que las cosas parezcan indentadas.
+
+01:54.320 --> 01:55.880
+¿Este?
+
+01:55.880 --> 01:56.400
+
+[Ihor]: Sí.
+
+01:56.400 --> 01:57.200
+org-adapt-indentation
+
+01:57.200 --> 02:03.120
+De acuerdo.
+
+02:03.120 --> 02:04.800
+Parece interesante, ¿verdad?
+
+02:04.800 --> 02:08.320
+Así que entremos en detalles.
+
+02:08.320 --> 02:09.520
+Podrías tener una pregunta:
+
+02:09.520 --> 02:11.400
+"¿Por qué debo asistir a encuentros?"
+
+02:11.400 --> 02:12.240
+Esa es una buena pregunta.
+
+02:12.240 --> 02:14.640
+Siempre debieras preguntar "¿por qué".
+
+02:14.640 --> 02:19.160
+Es una oportunidad de aprender juntos y juntas.
+
+02:19.160 --> 02:21.640
+Tú basicamente te encuentras con gente que piensa igual,
+
+02:21.640 --> 02:23.560
+usuarios y usuarias de Emacs que piensan igual.
+
+02:23.560 --> 02:27.400
+... y siempre puedes divertirte, ¿verdad?
+
+02:27.400 --> 02:29.160
+Podrías tener una preocupación:
+
+02:29.160 --> 02:31.040
+"Soy un novato o una novata."
+
+02:31.040 --> 02:34.080
+Yo diría que hay una gran oportunidad para tí.
+
+02:34.080 --> 02:36.640
+Puedes descubrir más cosas.
+
+02:36.640 --> 02:38.800
+Puedes conseguir ayuda, si encuentras
+
+02:38.800 --> 02:41.120
+dificultades, errores.
+
+02:41.120 --> 02:42.920
+Y siempre recuerda que estará bien
+
+02:42.920 --> 02:44.280
+si no entiendes todo
+
+02:44.280 --> 02:45.160
+en las conversaciones.
+
+02:45.160 --> 02:49.800
+Habrá momentos cuando todo sea...
+
+02:49.800 --> 02:51.960
+que otros temas no sean comprensibles;
+
+02:51.960 --> 02:56.800
+lo cual es totalmente comprensible.
+
+02:56.800 --> 02:58.760
+"Soy un usuario experimentado o una usuaria experimentada."
+
+02:58.760 --> 03:00.240
+Diría que esta situación es aún mejor
+
+03:00.240 --> 03:01.720
+porque puedes ayudar a otros y otras
+
+03:01.720 --> 03:03.680
+durante un encuentro.
+
+03:03.680 --> 03:06.440
+Y usualmente, en Emacs o en general,
+
+03:06.440 --> 03:08.200
+siempre hay algo nuevo que aprender.
+
+03:08.200 --> 03:10.160
+Hay abundancia de paquetes.
+
+03:10.160 --> 03:11.080
+Podría haber algo
+
+03:11.080 --> 03:12.440
+que nunca haz probado.
+
+03:12.440 --> 03:13.760
+Y siempre habrá
+
+03:13.760 --> 03:16.160
+diferentes flujos de trabajo para usar [un paquete].
+
+03:16.160 --> 03:23.520
+Así que ahora te preguntarás: ¿cómo me vuelvo parte de un encuentro? ¿Verdad?
+
+03:23.520 --> 03:26.920
+"¿Cómo me vuelvo parte del grupo de un encuentro?"
+
+03:26.920 --> 03:29.000
+El primer paso que podrías emprender
+
+03:29.000 --> 03:30.920
+es buscar un encuentro.
+
+03:30.920 --> 03:32.200
+Existe una página
+
+03:32.200 --> 03:35.120
+del EmacsWiki https://www.emacswiki.org/emacs/Usergroups
+
+03:35.120 --> 03:37.000
+mantenida actualmente
+
+03:37.000 --> 03:38.680
+por Leo y por Sacha.
+
+03:38.680 --> 03:46.600
+Así que, veamos cómo se ve esa página.
+
+03:46.600 --> 03:48.040
+Como puedes ver, esta página se refiere
+
+03:48.040 --> 03:51.160
+a todos los eventos que vendrán.
+
+03:51.160 --> 00:04:05.485
+Además, tiene una lista de todos los grupos de encuentros.
+
+00:04:05.485 --> 00:04:10.000
+Así que, puedes encontrar todos los grupos ahí.
+
+04:10.000 --> 04:11.760
+En cuanto encuentres uno,
+
+04:11.760 --> 04:13.480
+debes unirte a ellos, ¿verdad?
+
+04:13.480 --> 04:17.880
+Cómo unirte difiere de grupo a grupo
+
+04:17.880 --> 04:20.520
+pero usualmente encontrarás una forma de suscribirte
+
+04:20.520 --> 04:23.160
+a su lista de correo o a sus noticias RSS,
+
+04:23.160 --> 04:24.520
+únete a su canal de IRC.
+
+04:24.520 --> 04:27.200
+Podrían tener cuentas en diferentes plataformas
+
+04:27.200 --> 04:29.960
+como Mobilizon o meetup.com [cuidado de que contengan Javascript privativo].
+
+04:29.960 --> 04:31.400
+Puedes ir allá y unirte,
+
+04:31.400 --> 04:32.320
+para que te notifiquen
+
+04:32.320 --> 04:36.840
+cuando hay un evento nuevo.
+
+04:36.840 --> 04:39.120
+Ahora, al ver esa lista
+
+04:39.120 --> 04:42.080
+puedes decir, "Hay demasiados eventos
+
+04:42.080 --> 04:42.920
+de mi interés."
+
+04:42.920 --> 04:47.000
+No te preocupes. Hay una solución.
+
+04:47.000 --> 04:49.280
+Existe un calendario Emacs.
+
+04:49.280 --> 04:51.960
+Puedes suscribirte a este calendario.
+
+04:51.960 --> 04:55.120
+Veamos qué eventos
+
+04:55.120 --> 04:56.800
+hay en este calendario en particular.
+
+04:56.800 --> 05:00.120
+Este mes hay Emacs Berlin para comenzar
+
+05:00.120 --> 05:02.840
+y luego hay EmacsConf.
+
+05:02.840 --> 05:06.360
+Luego hay Emacs APAC, que también está ahí.
+
+05:06.360 --> 05:15.520
+Veamos ... existe un sitio web acompañante
+
+05:15.520 --> 05:17.840
+para este calendario también.
+
+05:17.840 --> 05:19.240
+Vayamos a ese sitio web.
+
+05:19.240 --> 05:24.600
+Verás todas las opciones, como importarlo a tu software.
+
+05:24.600 --> 05:26.240
+Hay un archivo ICS.
+
+05:26.240 --> 05:28.120
+Hay diferentes zonas horarias,
+
+05:28.120 --> 05:29.200
+archivos Org mode.
+
+05:29.200 --> 05:33.200
+Puedes simplemente ir allá y suscribirte.
+
+05:33.200 --> 05:38.520
+"¿Cómo lo aprovecho al máximo?
+
+05:38.520 --> 05:40.640
+Si asisto a un encuentro,
+
+05:40.640 --> 05:42.120
+¿cómo aprovecho al máximo?"
+
+05:42.120 --> 05:44.480
+Yo diría que nunca dudes
+
+05:44.480 --> 05:45.520
+en hacer preguntas.
+
+05:45.520 --> 05:46.600
+Si hay algo nuevo,
+
+05:46.600 --> 05:47.840
+algo que no entiendas,
+
+05:47.840 --> 05:49.240
+solamente haz las preguntas.
+
+05:49.240 --> 05:51.320
+Pide ayuda, si te encuentras atascado con algún problema.
+
+05:51.320 --> 05:54.040
+También existirán asuntos nuevos.
+
+05:54.040 --> 05:56.120
+Así que asegúrate de tomar nota
+
+05:56.120 --> 05:58.400
+y podrás intentar probarlos luego.
+
+05:58.400 --> 06:04.600
+Si es posible, ten listo un micrófono o cámara web encendidas.
+
+06:04.600 --> 06:07.120
+De esa manera podrás conectarte con otres de manera rápida.
+
+06:07.120 --> 06:10.560
+Si esa no es una opción por alguna razón,
+
+06:10.560 --> 06:12.520
+está bien. Siempre puedes usar el chat
+
+06:12.520 --> 06:13.720
+e interactuar con todas y con todos.
+
+06:13.720 --> 06:18.560
+Así que esa no es una razón para no asistir.
+
+06:18.560 --> 06:20.360
+Anímate y asiste,
+
+06:20.360 --> 06:22.640
+aunque solamente tengas el chat como única opción
+
+06:22.640 --> 06:23.720
+para interactuar con otras y otros.
+
+06:23.720 --> 06:27.480
+"Espera. Aún tengo preguntas."
+
+06:27.480 --> 06:28.520
+Seguro.
+
+06:28.520 --> 06:30.360
+Si tienes más preguntas,
+
+06:30.360 --> 06:31.640
+plantéalas.
+
+06:31.640 --> 06:34.440
+Llegaré a ellas al final.
+
+06:34.440 --> 06:42.840
+Ahora sabemos cómo asistir,
+
+06:42.840 --> 00:06:44.651
+cuáles son las cosas que debes hacer
+
+00:06:44.651 --> 00:06:45.560
+si deseas asistir.
+
+06:45.560 --> 00:06:48.418
+"¿Qué pasa si deseo iniciar mi propio grupo de encuentro?"
+
+00:06:48.418 --> 00:06:51.520
+porque no hay un grupo regional
+
+06:51.520 --> 06:53.560
+o existe un tema muy específico
+
+06:53.560 --> 06:55.560
+del que quieres tener un grupo particular.
+
+06:55.560 --> 07:01.800
+De nuevo, "¿Por qué debería iniciar un grupo de encuentro?"
+
+07:01.800 --> 07:05.080
+Es una manera, diría yo, para tener reciprocidad
+
+07:05.080 --> 07:08.880
+con la comunidad, mediante la creación de una plataforma
+
+07:08.880 --> 07:10.560
+para que la gente interactúe.
+
+07:10.560 --> 00:07:15.440
+Ofreces a los conferencistas una plataforma.
+
+07:15.440 --> 07:17.520
+También le ofreces una platforma a los asistentes.
+
+07:17.520 --> 07:19.680
+Y, obviamente, para divertirse junto con otros.
+
+07:19.680 --> 07:25.640
+Hay preguntas comunes
+
+07:25.640 --> 07:26.880
+que pueden presentarse.
+
+07:26.880 --> 00:07:28.051
+Algo como:
+
+00:07:28.051 --> 00:07:29.720
+"¿Cuánto esfuerzo se requiere?"
+
+07:29.720 --> 07:32.600
+Personalmente, yo no debo poner
+
+07:32.600 --> 07:34.520
+más de dos horas por mes.
+
+07:34.520 --> 07:36.760
+Eso incluye el tiempo
+
+07:36.760 --> 07:37.880
+para atender al encuentro.
+
+07:37.880 --> 07:42.600
+"¿Qué pasa si soy novato en Emacs?"
+
+07:42.600 --> 07:43.600
+Eso no importa.
+
+07:43.600 --> 07:45.920
+No necesitas saber Emacs.
+
+07:45.920 --> 07:47.200
+No necesitas ser un experto
+
+07:47.200 --> 07:48.400
+par iniciar un groupo de encuentro.
+
+07:48.400 --> 07:49.600
+Está muy bien.
+
+07:49.600 --> 07:51.480
+Tendrás más gente que se una
+
+07:51.480 --> 07:54.120
+con diferente experiencia.
+
+07:54.120 --> 07:57.160
+Es totalmente aceptable ser un novato
+
+07:57.160 --> 07:58.480
+en Emacs para iniciar un encuentro.
+
+07:58.480 --> 08:02.440
+"Ahora, ¿cómo lo hago?"
+
+08:02.440 --> 08:05.680
+Así que, veamos algunos detalles,
+
+08:05.680 --> 08:08.280
+algunas preguntas que podrías necesitar contestar
+
+08:08.280 --> 08:10.520
+para iniciar tu grupo de encuentro.
+
+08:10.520 --> 08:13.640
+Formato del encuentro.
+
+08:13.640 --> 08:17.120
+¿Qué harán los participantes durante el encuentro?
+
+08:17.120 --> 08:20.920
+Veamos una de las opciones.
+
+08:20.920 --> 08:23.680
+Esta es una de mis favoritas.
+
+08:23.680 --> 08:26.640
+Mantenlo sencillo, un poco desestructurado
+
+08:26.640 --> 08:28.320
+y asegúrate de que las conversaciones fluyan libremente.
+
+08:28.320 --> 08:30.640
+¿Qué sígnifica eso?
+
+08:30.640 --> 08:32.720
+Basicamente significa dejar a las personas
+
+08:32.720 --> 08:35.480
+preguntar, compartir nuevas cosas que han encontrado.
+
+08:35.480 --> 08:39.840
+Permíteles preguntar sobre sus dudas. Premíteles pedir ayuda.
+
+08:39.840 --> 08:44.200
+Durante estas conversaciones de libre flujo,
+
+08:44.200 --> 08:46.920
+puedes también cubrir Noticas de Emacs.
+
+08:46.920 --> 08:49.760
+Revisa los temas y podrías encontrar
+
+08:49.760 --> 08:52.600
+algo interesante de lo que puedas hablar.
+
+08:52.600 --> 08:57.280
+¿Por qué prefiero las conversaciones?
+
+08:57.280 --> 09:00.840
+Básicamente, las conversaciones brindan una oportunidad
+
+09:00.840 --> 09:03.880
+para todos los asistentes a participar.
+
+09:03.880 --> 09:06.640
+Logran hablar de lo que conocen,
+
+09:06.640 --> 09:09.000
+en lugar de solamente tener un monólogo.
+
+09:09.000 --> 09:12.120
+Pueden participar, básicamente
+
+09:12.120 --> 09:13.600
+al exponer sus pensamientos.
+
+09:13.600 --> 09:17.200
+Todos consiguen aprender más
+
+09:17.200 --> 09:18.480
+mientras cambian los temas.
+
+09:18.480 --> 09:21.120
+Usualmente durante estas conversaciones de libre flujo,
+
+09:21.120 --> 09:22.800
+los temas siguen cambiando
+
+09:22.800 --> 09:25.120
+y esa es la manera en que consigues aprender más.
+
+09:25.120 --> 09:29.000
+Esto también ofrece menos fricción para les conferencistas.
+
+09:29.000 --> 00:09:31.651
+No sentirán el peso de:
+
+00:09:31.651 --> 00:09:34.485
+"De acuerdo, tengo que dar una conferencia en este encuentro
+
+00:09:34.485 --> 00:09:35.600
+que requiero preparar."
+
+09:35.600 --> 09:38.320
+Eso solamente incrementa la fricción para que ellos
+
+09:38.320 --> 09:39.040
+participen.
+
+09:39.040 --> 09:42.080
+Si logras una conversación de libre flujo,
+
+09:42.080 --> 00:09:44.685
+solamente es asunto de decir:
+
+00:09:44.685 --> 00:09:47.200
+"Hey, Quizá quiera compartir mi pantalla
+
+09:47.200 --> 09:49.440
+y hablaré de este tema en particular."
+
+09:49.440 --> 09:53.560
+¿Qué hay sobre las conferencias?
+
+09:53.560 --> 09:55.240
+Todos adoran las conferencias, incluso yo.
+
+09:55.240 --> 09:58.880
+Así que asegúrate de acomodar las conferencias también.
+
+09:58.880 --> 10:00.800
+Permite a la gente presentar sus conferencias
+
+10:00.800 --> 10:03.960
+y sostén conferencias y conversaciones.
+
+10:03.960 --> 10:07.560
+También puedes sostener proyecciones.
+
+10:07.560 --> 10:09.320
+Puedes tomar
+
+10:09.320 --> 10:11.160
+cualquiera de las conferencias de EmacsConf,
+
+10:11.160 --> 10:14.240
+de lo que quiera que se encuentre ahí,
+
+10:14.240 --> 10:15.840
+y puedes mirarla juntos.
+
+10:15.840 --> 10:17.240
+Luego pueden tener una conversación
+
+10:17.240 --> 10:18.240
+acerca de esa conferencia en particular.
+
+10:18.240 --> 10:23.000
+La siguiente pregunta
+
+10:23.000 --> 10:24.400
+que podrías necesitar contestar
+
+10:24.400 --> 10:25.640
+es acerca de la frecuencia de los encuentros.
+
+10:25.640 --> 10:28.800
+¿Qué tan a menudo se reunirá el grupo?
+
+10:28.800 --> 10:32.880
+Una opción son los encuentros recurrentes.
+
+10:32.880 --> 10:37.080
+Así que algo como, reunirse cada mes
+
+10:37.080 --> 10:39.000
+un día específico a cierta hora.
+
+10:39.000 --> 10:43.640
+Otra opción son los encuentros de una sola ocasión.
+
+10:43.640 --> 10:46.240
+Puedes reunirte cuando sea
+
+10:46.240 --> 10:47.520
+que ofrezcas una conferencia en particular,
+
+10:47.520 --> 10:49.600
+algún tema específico de conversación.
+
+10:49.600 --> 10:52.680
+Lo que harías sobre los usos horarios es,
+
+10:52.680 --> 10:54.680
+si apuntas a una región específica,
+
+10:54.680 --> 10:56.840
+asegúrate que todos puedan asistir
+
+10:56.840 --> 10:58.480
+desde los distintos usos horarios de esa región.
+
+10:58.480 --> 11:04.480
+Ahora haz descifrado todo
+
+11:04.480 --> 11:06.200
+y que vas a agendar el encuentro.
+
+11:06.200 --> 11:08.280
+Así que "¿Debiría agendar y solamente esperar?"
+
+11:08.280 --> 11:08.760
+No.
+
+11:08.760 --> 11:10.960
+Difunde la noticia.
+
+11:10.960 --> 11:12.560
+Veamos qué podemos hacer.
+
+11:12.560 --> 11:16.480
+Puedes publicar en redes sociales el evento.
+
+11:16.480 --> 11:19.840
+Usualmente se debe hacer con una o dos semanas de antelación
+
+11:19.840 --> 11:24.200
+para que la gente pueda planificar sus otros asuntos.
+
+11:24.200 --> 11:27.640
+Compártelo en los grupos locales de usuarios de GNU con linux.
+
+11:27.640 --> 11:30.360
+Podrían tener canales de IRC, listas de correo.
+
+11:30.360 --> 11:32.240
+Así que debes compartir [la convocatoria] a tu evento ahí.
+
+11:32.240 --> 11:35.120
+Reddit también parece ser un lugar popular para anunciar.
+
+11:35.120 --> 11:37.520
+Hay mucha gente y seguidores que están ahí.
+
+11:37.520 --> 11:39.960
+Así que puedes anunciar sobre tu evento ahí tambien.
+
+11:39.960 --> 11:43.640
+La siguiente opción es agregar tu evento
+
+11:43.640 --> 11:45.000
+al calendario Emacs.
+
+11:45.000 --> 11:47.760
+Debes conseguir que tu evento se añada
+
+11:47.760 --> 11:49.680
+a EmacsWiki y al calendario,
+
+11:49.680 --> 11:51.080
+que vimos en la primera parte [de esta conferencia].
+
+11:51.080 --> 11:53.680
+Y las instrucciones se encuentran ahí.
+
+11:53.680 --> 11:55.640
+Así que, cuando sea que agendes un encuentro,
+
+11:55.640 --> 11:58.000
+debes definitivamente añadir tu evento
+
+11:58.000 --> 11:58.920
+a aquellos lugares.
+
+11:58.920 --> 12:02.800
+Lo siguiente que debes hacer es ...
+
+12:02.800 --> 12:04.240
+estos son algunos puntos
+
+12:04.240 --> 12:07.720
+que debes realizar durante el encuentro.
+
+12:07.720 --> 12:10.760
+Debes iniciar con las introducciones.
+
+12:10.760 --> 12:14.560
+Las introducciones sirven para romper el hielo, usualmente.
+
+12:14.560 --> 12:18.240
+Hacen que todos hablen acerca de sí mismos
+
+12:18.240 --> 12:20.200
+para que todos se conozcan
+
+12:20.200 --> 12:21.120
+al menos un poco.
+
+12:21.120 --> 12:24.880
+Haz posible que otros
+
+12:24.880 --> 12:27.520
+participen via chat.
+
+12:27.520 --> 12:30.920
+De tal manera que, si hay mensajes en el chat,
+
+12:30.920 --> 12:32.840
+asegúrate de relegarlos
+
+12:32.840 --> 12:35.680
+a quienes están hablando via audio/video.
+
+12:35.680 --> 12:39.440
+Comparte tu sitio web al final
+
+12:39.440 --> 12:41.720
+para que las personas lo sepan y lo sigan
+
+12:41.720 --> 12:44.360
+y para que puedan venir al siguiente evento.
+
+12:44.360 --> 12:48.280
+Lo siguiente es controlar el tiempo.
+
+12:48.280 --> 12:50.560
+Asegúrate de controlar el tiempo.
+
+12:50.560 --> 12:52.720
+Reserva un tiempo, puede ser una hora,
+
+12:52.720 --> 12:54.760
+o algo más que eso,
+
+12:54.760 --> 12:56.600
+y fija ese horario para tu evento
+
+12:56.600 --> 12:58.760
+con el fin de respetar el tiempo de todos
+
+12:58.760 --> 13:00.280
+y que se termine a tiempo.
+
+13:00.280 --> 13:05.000
+Ahora tu encuentro termina,
+
+13:05.000 --> 13:06.960
+fue bueno y la gente vino.
+
+13:06.960 --> 13:07.800
+¿Qué sigue?
+
+13:07.800 --> 13:10.600
+Publicar las grabaciones, diría yo.
+
+13:10.600 --> 13:14.800
+Deberías considerar publicar las conferencias
+
+13:14.800 --> 13:15.760
+o las conversaciones, o ambas.
+
+13:15.760 --> 13:20.240
+La razón es que las personas pueden revisitarlas.
+
+13:20.240 --> 13:21.960
+Usualmente, la gente vuelve
+
+13:21.960 --> 13:23.640
+y mira las grabaciones nuevamente.
+
+13:23.640 --> 13:26.200
+Y aquellos que no pudieron asistir,
+
+13:26.200 --> 13:27.640
+ellos también pueden participar
+
+13:27.640 --> 13:28.880
+al observar la grabación.
+
+13:28.880 --> 13:32.040
+Puedes hacer aún más.
+
+13:32.040 --> 13:34.640
+Puedes tener subtítulos para los vídeos
+
+13:34.640 --> 13:37.280
+para que la gente pueda disfrutar de las conferencias
+
+13:37.280 --> 13:40.600
+de mejor manera que solamente el audio y el vídeo.
+
+13:40.600 --> 13:43.400
+E inclusive tú puedes tener resúmenes escritos
+
+13:43.400 --> 00:13:44.451
+de las conversaciones,
+
+00:13:44.451 --> 00:13:45.960
+o algo parecido con los hipervínculos.
+
+13:45.960 --> 13:48.560
+Veamos algunos de los ejemplos con los resúmenes.
+
+13:48.560 --> 13:55.080
+Este es uno de los resúmenes
+
+13:55.080 --> 13:56.880
+del encuentro en Austin [Texas, EEUUA]
+
+13:56.880 --> 13:59.200
+y fue escrito por alguien
+
+13:59.200 --> 14:01.400
+quien participó durante el encuentro.
+
+14:01.400 --> 14:04.000
+Puedes ver que publicó sus pensamientos,
+
+14:04.000 --> 14:05.520
+lo que pensaban sobre un asunto
+
+14:05.520 --> 14:08.160
+que aprendieron en el evento.
+
+14:08.160 --> 14:14.280
+Otro ejemplo que podemos ver es M-x investigar.
+
+14:14.280 --> 14:16.800
+Puedes ver lo que han publicado ...
+
+14:16.800 --> 14:18.960
+todos los puntos de la conversación.
+
+14:18.960 --> 14:21.320
+Incluso han recopilado puntos de acción mediante el encuentro.
+
+14:21.320 --> 14:25.240
+Un ejemplo más que podemos ver es Emacs APAC.
+
+14:25.240 --> 14:28.280
+Lo que he hecho es,
+
+14:28.280 --> 14:30.360
+yo he mencionado el tema y los hipervínculos ...
+
+14:30.360 --> 14:32.840
+quién compartió qué.
+
+14:32.840 --> 14:36.720
+Y eso es lo que hay sobre asuntos para después del evento.
+
+14:36.720 --> 14:38.280
+Puedes mantenerlo sencillo.
+
+14:38.280 --> 14:40.960
+Solamente inicia con alojar las grabaciones de vídeo
+
+14:40.960 --> 14:44.240
+y solamente inicia con los hipervínculos básicas y con los detalles.
+
+14:44.240 --> 14:50.480
+Así que, ¿estamos listos para iniciar un encuentro?
+
+14:50.480 --> 14:52.880
+¡Definitivamente!
+
+14:52.880 --> 14:54.640
+Repasemos algunos de los puntos
+
+14:54.640 --> 14:56.120
+o hagamos una lista, yo diría,
+
+14:56.120 --> 14:57.640
+sobre lo que debes hacer antes de iniciar
+
+14:57.640 --> 14:58.200
+un grupo de encuentro.
+
+14:58.200 --> 14:59.800
+¿Cuáles son los siguientes pasos?
+
+14:59.800 --> 15:04.440
+Consigue un co-organizador.
+
+15:04.440 --> 15:07.960
+Entonces, ten al menos un co-organizador
+
+15:07.960 --> 15:09.640
+o persona con quien hablar durante el encuentro
+
+15:09.640 --> 15:12.600
+para que, aunque nadie más venga,
+
+15:12.600 --> 15:14.320
+tengas con quien hablar
+
+15:14.320 --> 15:16.240
+y ambos pueden conversar
+
+15:16.240 --> 15:20.160
+sobre el tema que pretendían.
+
+15:20.160 --> 15:22.200
+Si tu amigo o la persona
+
+15:22.200 --> 15:23.760
+que conseguiste
+
+15:23.760 --> 15:26.760
+duda en convertirse en co-organizadora
+
+15:26.760 --> 15:28.960
+porque siente que es una responsabilidad,
+
+15:28.960 --> 15:29.720
+está bien.
+
+15:29.720 --> 15:32.360
+Puedes pedirle que solamente te acompañe
+
+15:32.360 --> 15:36.480
+y sostén la conversación durante el evento.
+
+15:36.480 --> 15:38.720
+Y, como Andrea explicó
+
+15:38.720 --> 15:40.200
+en su conferencia sobre los 'compañeros',
+
+15:40.200 --> 15:43.520
+'compañero' es quien te ayuda
+
+15:43.520 --> 15:45.000
+en tu travesía de Emacs.
+
+15:45.000 --> 15:48.800
+Compañeros y pupilos
+
+15:48.800 --> 15:52.280
+pueden hacer de su encuentro uno que sea público
+
+15:52.280 --> 15:56.040
+y esa puede ser una buena manera de comenzar
+
+15:56.040 --> 15:57.240
+a poner a rodar un encuentro.
+
+15:57.240 --> 16:01.920
+Ten un sitio web para tu encuentro.
+
+16:01.920 --> 16:04.440
+Definitivamente debes tener un sitio web
+
+16:04.440 --> 16:05.920
+donde la gente pueda leer
+
+16:05.920 --> 16:08.640
+sobre tu evento o sobre el grupo.
+
+16:08.640 --> 16:10.280
+Mantenlo simple.
+
+16:10.280 --> 16:13.440
+Levanta noticias de RSS para que las personas puedan suscribirse.
+
+16:13.440 --> 16:15.520
+Y cuando tengas nuevas conferencias,
+
+16:15.520 --> 16:17.680
+asegúrate de añadir esas conferencias
+
+16:17.680 --> 16:18.880
+a las páginas de anuncios.
+
+16:18.880 --> 16:23.960
+Rápidamente, veamos algunos sitios web de ejemplo.
+
+16:23.960 --> 16:32.480
+El primero es nuevamente
+
+16:32.480 --> 16:34.160
+el del evento de Emacs Asia-Pacific.
+
+16:34.160 --> 16:36.880
+Puedes ver que mostramos detalles,
+
+16:36.880 --> 16:41.080
+el horario, cómo proponer una conferencia,
+
+16:41.080 --> 16:42.000
+cómo asistir.
+
+16:42.000 --> 16:45.720
+El siguiente ejemplo es Emacs Berlin.
+
+16:45.720 --> 16:47.480
+Ahí puedes ver que han mencionado
+
+16:47.480 --> 16:48.680
+cuál es el siguiente evento,
+
+16:48.680 --> 16:51.440
+cuáles fueron los eventos previos,
+
+16:51.440 --> 16:53.840
+cómo participar, cómo mantenerse actualizado.
+
+16:53.840 --> 16:57.040
+Y de igual manera, existe M-x investigar.
+
+16:57.040 --> 16:59.080
+Han mencionado cuáles son los eventos,
+
+16:59.080 --> 17:00.600
+cuáles son los eventos venideros y todo lo demás.
+
+17:00.600 --> 17:09.280
+Puedes iniciar,
+
+17:09.280 --> 17:11.160
+simplemente tomando cualquiera de estos sitios web
+
+17:11.160 --> 17:13.040
+y solamente modifícalos a tu gusto.
+
+17:13.040 --> 17:14.200
+Es totalmente aceptable.
+
+17:14.200 --> 17:17.640
+Lo siguiente que requerirás
+
+17:17.640 --> 17:19.080
+es de una herramienta para videoconferencia.
+
+17:19.080 --> 17:23.360
+Debería soportar vídeo, compartir escritorio, chat.
+
+17:23.360 --> 17:25.120
+Estas son algunas
+
+17:25.120 --> 17:27.680
+de las opciones en software libre.
+
+17:27.680 --> 17:29.240
+Una es BigBlueButton
+
+17:29.240 --> 17:31.000
+y otra es Jitsi Meet.
+
+17:31.000 --> 17:33.040
+Puedes solicitar una cuenta en la instancia apropiada
+
+17:33.040 --> 17:36.840
+a los organizadores de EmacsConf
+
+17:36.840 --> 17:38.280
+que están en esta lista de correo,
+
+17:38.280 --> 17:40.400
+o puedes mantenerte en cualquiera
+
+17:40.400 --> 17:42.280
+de las instancias de Jitsi Meet.
+
+17:42.280 --> 17:45.960
+Medios de comunicación.
+
+17:45.960 --> 17:47.280
+Deberías tener al menos una manera
+
+17:47.280 --> 17:51.120
+para que la gente interactúe después del encuentro
+
+17:51.120 --> 17:53.000
+y antes del encuentro.
+
+17:53.000 --> 17:55.760
+Puedes utilizar cualquiera de los canales existentes en IRC,
+
+17:55.760 --> 17:59.880
+#emacsconf, o quizá desees
+
+17:59.880 --> 18:01.720
+usar las listas de grupos de usuarios de GNU con Linux.
+
+18:01.720 --> 18:07.600
+Recomendaría que leas o mires
+
+18:07.600 --> 18:11.000
+"Starting an Emacs meetup" por Harry Schwartz.
+
+18:11.000 --> 18:13.080
+Ha mencionado los detalles
+
+18:13.080 --> 18:14.840
+sobre encuentros personales
+
+18:14.840 --> 18:17.720
+pero hay mucho puntos importantes
+
+18:17.720 --> 18:20.080
+a considerar en esa publicación
+
+18:20.080 --> 18:21.320
+tanto como en la grabación.
+
+18:21.320 --> 18:23.200
+Así que, ve y definitivamente mira [ese vídeo]
+
+18:23.200 --> 18:24.840
+antes de iniciar tu encuentro.
+
+18:24.840 --> 18:29.560
+Si necesitas ayuda
+
+18:29.560 --> 18:32.520
+con la cuenta, el alojamiento
+
+18:32.520 --> 18:35.280
+o para poner subtítulos a las grabaciones de BigBlueButton
+
+18:35.280 --> 18:37.160
+para conferencias muy específicas o buenas,
+
+18:37.160 --> 18:38.880
+no dudes en buscar
+
+18:38.880 --> 18:40.480
+a los organizadores de EmacsConf.
+
+18:40.480 --> 18:42.320
+Hay muchos voluntarios
+
+18:42.320 --> 18:43.560
+suscritos a esa lista [de correo].
+
+18:43.560 --> 18:45.920
+Así que definitivamente encontrarás
+
+18:45.920 --> 18:50.080
+alguien quien te ayude.
+
+18:50.080 --> 18:50.760
+Tuve una idea.
+
+18:50.760 --> 18:53.240
+Si tu eres uno de les organizadores
+
+18:53.240 --> 18:55.400
+o si planeas iniciar un encuentro,
+
+18:55.400 --> 18:57.360
+pensaba en que si tendríamos
+
+18:57.360 --> 18:59.280
+una plataforma común
+
+18:59.280 --> 19:00.400
+para que todos les organizadores
+
+19:00.400 --> 19:01.240
+conversen sobre lo que están haciendo,
+
+19:01.240 --> 19:04.000
+lo que están expermentando.
+
+19:04.000 --> 19:06.920
+Si estás interesado, envíame un correo a este correo electrónico
+
+19:06.920 --> 19:10.400
+bhavin192 [arroba] geeksocket [punto] in.
+
+19:10.400 --> 19:13.200
+Si logro llegar a algún lado con esta idea,
+
+19:13.200 --> 19:15.440
+definitivamente involucraré a todos
+
+19:15.440 --> 19:16.280
+quienes estén interesados.
+
+19:16.280 --> 19:21.240
+Con eso, llegamos al final de mi conferencia.
+
+19:21.240 --> 19:23.440
+Me gustaría agradecer a Sacha y a Leo
+
+19:23.440 --> 19:26.560
+por sus recomendaciones mientras creaba esta conferencia
+
+19:26.560 --> 19:30.040
+y a ustedes por unirse.
+
+19:30.040 --> 19:35.280
+Ahora es el momento para las preguntas.
diff --git a/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.vtt b/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.vtt
new file mode 100644
index 00000000..f9ec7319
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.vtt
@@ -0,0 +1,611 @@
+WEBVTT
+
+00:00.000 --> 00:09.660
+About five seconds until we go live.
+
+00:09.660 --> 00:10.660
+And we are live!
+
+00:10.660 --> 00:11.660
+Hello again!
+
+00:11.660 --> 00:15.580
+It's the first time you're seeing me today, and hopefully you're still laughing from
+
+00:15.580 --> 00:18.940
+the little joke Carl had at the end of his talk.
+
+00:18.940 --> 00:20.940
+Hi Carl, how are you doing?
+
+00:20.940 --> 00:26.260
+I'm fine thanks, how are you doing?
+
+00:26.260 --> 00:29.700
+I'm doing pretty fine, but I am currently struggling to make my windows slightly larger
+
+00:29.700 --> 00:31.240
+because what am I doing?
+
+00:31.240 --> 00:34.920
+Okay, okay, I think people can see me relatively well right now.
+
+00:34.920 --> 00:38.120
+Yeah, I am doing well, and thank you for the joke.
+
+00:38.120 --> 00:42.960
+It feels like when I see people wearing suits during a BBB presentation, or sorry, not a
+
+00:42.960 --> 00:47.880
+BBB presentation, an EmacsConc presentation, I feel like it's a reply to my own style and
+
+00:47.880 --> 00:48.880
+I feel attacked.
+
+00:48.880 --> 00:53.200
+But I will just confirm, how do I do this without making too much of a fool, I will
+
+00:53.200 --> 01:00.260
+lower my standing desk, and you can see that I am actually wearing trousers.
+
+01:00.260 --> 01:04.000
+So yes, I am wearing socks and sandals because it's really cold right now and it's very comfortable
+
+01:04.000 --> 01:05.000
+as well.
+
+01:05.000 --> 01:11.580
+Don't ask me on this, but I am technically more dressed than you are.
+
+01:11.580 --> 01:17.580
+Well this was a lederhose, actually a quite nice lederhose, which you wear for specific
+
+01:17.580 --> 01:18.580
+occasions.
+
+01:18.580 --> 01:23.440
+It's not considered as something special.
+
+01:23.440 --> 01:28.320
+No, definitely, but it is looking a little bit odd to my French style.
+
+01:28.320 --> 01:32.400
+Yeah, especially the combination, yes, you're right.
+
+01:32.400 --> 01:36.680
+Right, we could be talking about hours for this, but I suppose people are not actually
+
+01:36.680 --> 01:39.720
+here to hear us talk about this, but about you talk.
+
+01:39.720 --> 01:44.720
+I'm not going to make the affront of asking if you've got the pad open, considering that
+
+01:44.720 --> 01:48.520
+you have been managing the pad and helping us manage the pad for what, three years now,
+
+01:48.520 --> 01:49.520
+or something?
+
+01:49.520 --> 01:57.240
+Yeah, but this year, actually, it's doing great without my help, so yeah.
+
+01:57.240 --> 02:00.100
+Actually there are already two answers.
+
+02:00.100 --> 02:04.360
+Somebody was nice enough to copy my answers from the IRC to here.
+
+02:04.360 --> 02:10.440
+Can you filter out blocked tasks on stuff like your agenda, on specific agenda view,
+
+02:10.440 --> 02:14.920
+when you want to know what you can do next?
+
+02:14.920 --> 02:20.120
+That's a tricky question.
+
+02:20.120 --> 02:25.280
+The blocked tasks are never shown on the agenda by default.
+
+02:25.280 --> 02:36.200
+Whenever there is no scheduled timestamp attached to a heading, it's not visible on my agenda.
+
+02:36.200 --> 02:43.400
+If you use the dependencies, as I described it in the demo, you will see that the scheduled
+
+02:43.400 --> 02:51.520
+timestamp, or date stamp, is only added when the previous one is marked as done, or canceled.
+
+02:51.520 --> 02:57.480
+So therefore, blocked tasks are never shown on the agenda by default, if you use it in
+
+02:57.480 --> 03:01.520
+this, in that way.
+
+03:01.520 --> 03:06.720
+The functionality seems quite nice, but the markup seems pretty heavy in the property
+
+03:06.720 --> 03:07.720
+drawers.
+
+03:07.720 --> 03:17.320
+Do you ever have any issues having so much meta-level information?
+
+03:17.320 --> 03:27.960
+No, as long as I don't have to type it manually, I don't see any issue at all, so far.
+
+03:27.960 --> 03:35.000
+Because I tend to have very, rather large org-mode files in any way.
+
+03:35.000 --> 03:41.840
+So far, I haven't thought of, oh my gosh, this is so bloated, I need to simplify it.
+
+03:41.840 --> 03:45.320
+Not yet.
+
+03:45.320 --> 03:52.360
+Looking for the IRC, if there is something going on.
+
+03:52.360 --> 03:56.120
+If not, we'll be able to, because this is the showdown people were waiting.
+
+03:56.120 --> 04:02.720
+Two years ago, you wrote an article about Algrom not being good, and I'm being polite.
+
+04:02.720 --> 04:05.160
+We need to fight this out right now.
+
+04:05.160 --> 04:07.000
+Yeah, sure.
+
+04:07.000 --> 04:18.120
+Actually, I do think that Zettelkasten methods are interesting, but so far, I haven't seen
+
+04:18.120 --> 04:21.400
+much use in my personal use.
+
+04:21.400 --> 04:26.960
+But I can imagine that, for example, if you're working on a PhD thesis, or you're studying
+
+04:26.960 --> 04:31.780
+in some research field and so forth, it's quite handy.
+
+04:31.780 --> 04:40.800
+The only thing my concept so far doesn't have what the usual Zettelkasten methods do provide
+
+04:40.800 --> 04:46.960
+is this visual navigation method, which I would not use anyway.
+
+04:46.960 --> 04:53.960
+So I don't see any purpose at all for Zettelkasten methods for my personal use cases, as long
+
+04:53.960 --> 05:01.160
+as I don't think that this visual navigation would be very handy in my case.
+
+05:01.160 --> 05:07.880
+I'm very happy with the bidirectional links, because they get me from A to B, and I can
+
+05:07.880 --> 05:12.700
+connect ideas and headings and tasks and whatnot.
+
+05:12.700 --> 05:20.440
+So this is basically the most important part of Zettelkasten method from my perspective.
+
+05:20.440 --> 05:26.880
+And this is what these bidirectional links and dependencies provide for me in my personal
+
+05:26.880 --> 05:27.880
+setup.
+
+05:27.880 --> 05:34.080
+Yeah, and I was taking a jab at it, because even you, with your own article, you were
+
+05:34.080 --> 05:41.080
+saying how, you know, it's a title to grab attention, but actually you had a lot of things
+
+05:41.080 --> 05:42.080
+Yeah, it was trick-based.
+
+05:42.080 --> 05:48.200
+Yeah, I didn't want to say the word, you know, I'm trying to be, like, I didn't read the
+
+05:48.200 --> 05:51.960
+actual title that should title the article.
+
+05:51.960 --> 05:55.760
+But yeah, I think you were also interested in what we were discussing yesterday.
+
+05:55.760 --> 06:00.240
+I can't remember which talk, because we had a number of org talks, but when I was discussing
+
+06:00.240 --> 06:05.680
+in one of the Q&A the concept of a slip box for multiple peoples, you seemed to be interested
+
+06:05.680 --> 06:07.800
+in this topic as well.
+
+06:07.800 --> 06:08.800
+Yes.
+
+06:08.800 --> 06:15.440
+Yeah, my personal interest is in personal information management, but collaborative
+
+06:15.440 --> 06:20.540
+information management is of course a very related and important part, and I have some
+
+06:20.540 --> 06:27.240
+background by writing a PhD thesis on organizing information and files and whatnot, and therefore
+
+06:27.240 --> 06:37.460
+I'm interested in the ideas how to make a collaborative, let's say, something that might
+
+06:37.460 --> 06:42.200
+actually work within a work group or even larger.
+
+06:42.200 --> 06:49.960
+There are some things that overlap between personal information management and collaborative,
+
+06:49.960 --> 07:01.680
+for example, I'm sure you know the vocabulary problem, where people do have different mental
+
+07:01.680 --> 07:08.520
+models of the same stuff, so therefore finding one common phrase or one common word is a
+
+07:08.520 --> 07:15.200
+difficult task to do, and you get these kind of troubles all over the place if you go into
+
+07:15.200 --> 07:16.680
+that direction.
+
+07:16.680 --> 07:23.560
+Yeah, this is why I think just like a lot of software solutions, they need to be backed
+
+07:23.560 --> 07:25.720
+up by strong methodology on the side.
+
+07:25.720 --> 07:30.080
+It feels like it's always a balance when you have the tools that are helping you enable
+
+07:30.080 --> 07:39.160
+something like Emacs, like Org, like Zorcast, EL, Orgrom, or any kind of the, I don't want
+
+07:39.160 --> 07:44.040
+to say Orgrom clone, it's like Dark Souls, when everything becomes a Dark Souls clone,
+
+07:44.040 --> 07:50.840
+that's not the point, we have Zorcast and modes in Emacs that allow you to do this no-taking,
+
+07:50.840 --> 07:51.840
+so that's the tools.
+
+07:51.840 --> 07:55.960
+And then you have the methods on the other end, which are about how do you use those
+
+07:55.960 --> 08:00.800
+tools to work with multiple people, we're only talking about collective sandbox here.
+
+08:00.800 --> 08:06.760
+And yeah, there is obviously the vocabulary discussion, the point that Carl just mentioned,
+
+08:06.760 --> 08:11.200
+there are some solutions methodologically, like you can have a taxonomy of all the words
+
+08:11.200 --> 08:16.760
+you're using, if you have a list of patterns, for instance, it's good to fix the language
+
+08:16.760 --> 08:21.600
+within a file, so that you can have something that people can read.
+
+08:21.600 --> 08:27.840
+It's kind of like, you have dictionaries, obviously, but it reminds me of some very
+
+08:27.840 --> 08:32.720
+specific dictionaries, like the hacker dictionary, when you have a lot of entries, where people
+
+08:32.720 --> 08:38.200
+can learn the lingua, how to use the internet, how to chat on IOC, stuff like this, it feels
+
+08:38.200 --> 08:45.320
+like a group sandbox is always going to be oriented towards solving a particular project,
+
+08:45.320 --> 08:49.600
+I think, and I think taxonomy and vocabulary would be very important to have.
+
+08:49.600 --> 08:54.280
+Anyway, I don't want to take too much, this is a very interesting topic, obviously, you
+
+08:54.280 --> 09:00.080
+wrote a PhD on it, and I wrote software on it, and you've wrote software on it as well,
+
+09:00.080 --> 09:06.640
+but we should probably talk about this later, at least, but maybe come up with something
+
+09:06.640 --> 09:08.640
+to present in a year or so.
+
+09:08.640 --> 09:09.640
+Okay.
+
+09:09.640 --> 09:17.480
+So, somebody wrote the BBB is not open yet, I don't know if it's on purpose or not.
+
+09:17.480 --> 09:18.480
+I'll do this now.
+
+09:18.480 --> 09:21.640
+You'll see me whisper, you'll see something very fancy, look at me, I'm going to press
+
+09:21.640 --> 09:24.600
+the button, you're going to see something appear at the bottom to talk to production,
+
+09:24.600 --> 09:30.440
+this is the thing that I've developed since yesterday, it's amazing, wasn't it?
+
+09:30.440 --> 09:32.840
+This was technology, right there.
+
+09:32.840 --> 09:37.320
+So yes, the BBB will be open in about 30 seconds to one minute.
+
+09:37.320 --> 09:42.080
+And people, it's the first one of the day, so I'll do the reminder.
+
+09:42.080 --> 09:48.440
+In order to join us in a room right now, where I'm talking with Carl, you will need to go
+
+09:48.440 --> 09:56.280
+to the talk page, so you can find all the talks on emaskov.org-2022.
+
+09:56.280 --> 10:02.000
+Then you find the talk by Carl Voigt, you can look for his name, you click on the link
+
+10:02.000 --> 10:06.800
+over there and at the top you will have a link to the BBB room in which we are currently. Also
+
+10:06.800 --> 10:13.840
+if you're on IRC you will just have gotten a notification about joining the room. So in the
+
+10:13.840 --> 10:18.400
+meantime Carl, how about we answer some of the new questions that you have on the pad whilst people
+
+10:18.400 --> 10:29.680
+get warmed up. Sure. So the next one, does this change how you use to-do keywords next to do
+
+10:29.680 --> 10:40.880
+blocked? Avoiding some or starting to use others? No. I don't see any connection. And my keywords
+
+10:40.880 --> 10:56.160
+are next, oops, next, started, waiting, done, cancelled. That's basically it if you're interested.
+
+10:56.160 --> 11:02.800
+But my configuration is online anyway. I can paste the link later. And yes, I can paste the link to
+
+11:02.800 --> 11:12.880
+my thesis as well as ask on the IRC. Carl, if you don't mind, I do have a quick question because
+
+11:12.880 --> 11:19.360
+I'm going to forget otherwise. We have someone in IRC asking you, is your PhD published? I'm not a
+
+11:19.360 --> 11:26.560
+PhD but your thesis is published. Yes, of course. Everything of my PhD is public including the actual
+
+11:26.560 --> 11:33.760
+research work, the hard figures of the user experiments and the derived functions, everything
+
+11:33.760 --> 11:41.920
+of course. The later one actually should be also in org mode so 100% reproducible which was very
+
+11:41.920 --> 11:47.200
+important to me. Would you have a link, so maybe not right now but in the pad, could you include a
+
+11:47.200 --> 11:53.760
+link later on? I've already wrote down a question for that on my own so that I don't forget to
+
+11:53.760 --> 11:58.240
+answer it afterwards. Okay, amazing. Thank you. You can continue with the questions. We also have
+
+11:58.240 --> 12:02.400
+people joining on. I see microphones now and some of the people joining on BBB so I'm excited. I'm
+
+12:02.400 --> 12:07.680
+getting ready for your questions. But in the meantime, Carl, feel free to go. I'm answering
+
+12:07.680 --> 12:15.200
+all the questions in the pad anyway so if somebody is asking something in the BBB, I'm open to it.
+
+12:15.200 --> 12:21.360
+Right, there is just one other thing I need to say. We need to move with the next talk in about
+
+12:21.360 --> 12:27.440
+eight minutes. So, Carl, if you could maybe not rush but answer fairly quickly the last questions
+
+12:27.440 --> 12:35.680
+on the pad, then we can move on to live Q&A inside BBB. Sure. OrgBrain has stuff like parent links
+
+12:35.680 --> 12:40.560
+and directional links, sibling links, and if org.roam.else had nothing else interesting,
+
+12:40.560 --> 12:48.560
+what about, like, the previous stuff? I'm going to be honest, I'm not sure what the previous stuff
+
+12:48.560 --> 12:59.360
+was either. So, referring to side window, where it's not only the linked heading, so not only the
+
+12:59.360 --> 13:08.240
+link is shown but actually some heading title and short contents below it. So, that's very handy
+
+13:08.240 --> 13:13.520
+when you are looking, like, or is it relevant, or it's not relevant.
+
+13:16.720 --> 13:25.040
+To me, it's not relevant at the moment. I don't have the requirement for specific link types
+
+13:25.760 --> 13:32.080
+or directions. I like how, Carl, you feel obligated to write and speak at the same time.
+
+13:32.080 --> 13:36.240
+Like, you can let go of your responsibility as the pad. We have another volunteer helping you
+
+13:36.240 --> 13:42.000
+with the pad right now, so don't worry about it. Perfect. So, do you find that the links are fragile,
+
+13:42.000 --> 13:50.080
+hard to maintain? No, not at all. The only thing that I have to remark here is probably that
+
+13:50.080 --> 13:58.640
+sometimes I rename the links when the heading actually was renamed afterward and the link name
+
+13:58.640 --> 14:06.640
+isn't reflecting the actual heading. Then I do a quick search and replace all of my Org Mode files,
+
+14:06.640 --> 14:13.840
+but that's basically it. So, no, I really love the bi-directional and uni-directional links,
+
+14:14.640 --> 14:23.440
+and it doesn't give me any burden to maintain them. Would it be of interest to, like, make auto
+
+14:23.440 --> 14:35.840
+description for links in Org? You have an ID, you don't have any description, but then
+
+14:35.840 --> 14:44.240
+description is generated automatically. My IDs are auto-generated and they are generated from
+
+14:44.240 --> 14:50.880
+the heading title, so usually my links are pretty much self-explanatory.
+
+14:50.880 --> 14:58.640
+Oh, so what you're referring to is that you have a link, then you rename the linked heading,
+
+14:58.640 --> 15:05.440
+and then you change the link ID. Oh yeah, that's true. Links are not synchronized with their
+
+15:05.440 --> 15:15.120
+headings once they are generated, but usually a heading title is not changed that often by me,
+
+15:15.120 --> 15:24.960
+so this is not a really important problem in my use cases. PhD thesis unlinked later.
+
+15:24.960 --> 15:33.440
+Why not Org UUIDs for IDs and the Preferences human-readable ones? Yeah, I hate UUIDs because
+
+15:33.440 --> 15:42.640
+they tell me nothing at all, so I want to get an idea to what I'm linking to. Therefore, I've got
+
+15:42.640 --> 15:52.800
+rid of all UUIDs in my setup and I prefer something that gives me as a user an idea of
+
+15:52.800 --> 16:04.000
+what's happening when I open up this link. Sorry, have you been able to hear me? Is it
+
+16:04.000 --> 16:10.000
+the first OTS mic of the conference? Wow, this is amazing. I was mispressing the button, I think.
+
+16:10.000 --> 16:14.320
+I apologize humbly, deeply, and sincerely about the hot mic. No problem.
+
+16:19.360 --> 16:26.640
+Do you have or use anything for what links here to this heading in a more occurred grep style
+
+16:26.640 --> 16:36.560
+buffer and auto? No, not yet. I'm not using that, but I may be able to what links to here
+
+16:36.560 --> 16:42.480
+by looking for the ID. All the heading IDs start with a date stamp and then a
+
+16:43.440 --> 16:52.160
+string which is made up from the heading title. If I want to see what links to this specific heading
+
+16:52.160 --> 17:01.200
+without having backlinks, I usually use org occur within the buffer and get the result right away.
+
+17:01.200 --> 17:08.640
+All right, I'm just going to give you, I have the bad role here, I have to be the man with
+
+17:08.640 --> 17:14.320
+the watch telling you that we have about three minutes left in this talk and afterwards we'll
+
+17:14.320 --> 17:18.240
+need to move on to the next one. So you have about two minutes. Carla, I didn't ask you if
+
+17:18.240 --> 17:22.640
+you had anything else to add over your talk. I wish we had more time to discuss because it's
+
+17:22.640 --> 17:26.400
+a very interesting topic, but sadly we will have to get going with the next talk in two minutes.
+
+17:26.400 --> 17:33.280
+So the next two minutes are yours. I continue answering questions on the
+
+17:33.280 --> 17:46.720
+pad of course and you'll see me around on the IRC. I'm still around in IRC. I will answer all
+
+17:46.720 --> 17:54.400
+the questions on the pad even after we continue and everybody who wants to get in touch and talk
+
+17:54.400 --> 18:01.920
+about this stuff may find me on the internet. Sure, there is still the nebulous concept.
+
+18:01.920 --> 18:07.520
+Every Microsoft says we should have a meeting room for maintainers or for people well invested
+
+18:07.520 --> 18:14.000
+into org and melpa stuff and package writing because it feels like if we have so many ideas
+
+18:14.640 --> 18:18.640
+and so far the only person who's been able to implement every single idea they have is
+
+18:18.640 --> 18:25.600
+Alfa Papa because I have no idea how they do it. That's actually a group of people I think.
+
+18:26.640 --> 18:33.440
+Yes, we need to check if Alfa Papa appeared in two different rooms at the same time. I need to
+
+18:33.440 --> 18:42.000
+confirm this for my own sanity. But yeah, barring Adam from being able to do this, we have so many
+
+18:42.000 --> 18:46.400
+ideas and it feels like if we were talking about them with other people we might be able to implement.
+
+18:46.400 --> 18:49.760
+I've been asking about the cloning machine so maybe Alfa Papa got one.
+
+18:51.200 --> 18:56.560
+Yeah, well anyway I'm sorry for cutting the conversation a little short but we will have
+
+18:56.560 --> 19:02.480
+to get started with the next talk. So thank you so much Karl for taking the time first to send a
+
+19:02.480 --> 19:07.440
+recording to us for answering questions now and also for being a volunteer for eMaximum. Thank
+
+19:07.440 --> 19:14.000
+you so much for all of those three things. Oh, you're welcome. We will probably see you next
+
+19:14.000 --> 19:20.160
+year. I am now definitely set on expecting a Cardboard talk every year and you will have to
+
+19:20.160 --> 19:25.600
+top it next year. I'm not sure what you will find to make the end funny but you have set the bar
+
+19:25.600 --> 19:31.840
+quite high and you need to go even higher this time. Next time without the Leda Jose oil.
+
+19:33.280 --> 19:38.240
+As long as you don't show up, put more clothes, not fewer garments, please.
+
+19:38.240 --> 19:45.520
+We will have to get started with the next talk. Thank you so much Karl. No, I'm sorry. We need to
+
+19:45.520 --> 19:49.760
+get moving to the next talk. I'll be closing the BBB room and we'll start with the next talk at
+
+19:49.760 --> 19:58.160
+the top of the minute in 30 seconds. Bye-bye everyone. Bye. All right, we are not live anymore.
+
+19:58.160 --> 20:01.920
+Thank you so much Karl. I have to get going. We need to make sure everything works now.
+
+20:01.920 --> 20:07.840
+Sure. Bye. Bye-bye.
+
diff --git a/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main--chapters.vtt b/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main--chapters.vtt
new file mode 100644
index 00000000..a5b85095
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main--chapters.vtt
@@ -0,0 +1,34 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:18.680
+Introduction
+
+00:00:18.680 --> 00:01:42.680
+Setting up the demo
+
+00:01:42.680 --> 00:03:03.920
+Linking between headings
+
+00:03:03.920 --> 00:03:51.640
+Link drawers
+
+00:03:51.640 --> 00:04:09.960
+Bi-directional links
+
+00:04:09.960 --> 00:05:07.680
+Projects
+
+00:05:07.680 --> 00:05:51.600
+Dependencies
+
+00:05:51.600 --> 00:06:39.320
+Jumping between dependencies
+
+00:06:39.320 --> 00:07:49.120
+Closing the project
+
+00:07:49.120 --> 00:08:15.640
+Task dependencies between files
+
+00:08:15.640 --> 00:08:56.000
+Conclusion
diff --git a/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.vtt b/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.vtt
new file mode 100644
index 00000000..d67d0a64
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.vtt
@@ -0,0 +1,508 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:05.600
+Hello, my name is Karl Voit
+
+00:00:05.600 --> 00:00:08.720
+and I'm going to show you a little demo
+
+00:00:08.720 --> 00:00:10.920
+on how I'm working with links
+
+00:00:10.920 --> 00:00:12.760
+between arbitrary headings
+
+00:00:12.760 --> 00:00:16.240
+and how I define dependencies between tasks
+
+00:00:16.240 --> 00:00:18.680
+when I'm working with projects and so forth.
+
+00:00:18.680 --> 00:00:22.680
+For that purpose, I've created a repository
+
+00:00:22.680 --> 00:00:27.680
+that contains the files we are going to work with,
+
+00:00:27.680 --> 00:00:30.000
+with the overall setup and so forth.
+
+00:00:30.000 --> 00:00:32.840
+So you just have to download this repository
+
+00:00:32.840 --> 00:00:36.400
+and you're able to replay everything
+
+00:00:36.400 --> 00:00:38.120
+which you are going to see here.
+
+00:00:38.120 --> 00:00:44.360
+If you've downloaded the configuration of the demo,
+
+00:00:44.360 --> 00:00:49.160
+you see those files, and you start the Emacs
+
+00:00:49.160 --> 00:00:52.800
+with an empty configuration
+
+00:00:52.800 --> 00:00:59.480
+and link demo file, like that.
+
+00:00:59.480 --> 00:01:03.800
+So let me just briefly increase the font size.
+
+00:01:03.800 --> 00:01:05.760
+Setting up the demo is easy.
+
+00:01:05.760 --> 00:01:08.600
+I've done the key visualization,
+
+00:01:08.600 --> 00:01:11.840
+the webcam part, and I've started the Emacs
+
+00:01:11.840 --> 00:01:13.920
+and increased the font size.
+
+00:01:13.920 --> 00:01:17.720
+And the last thing and the most important thing
+
+00:01:17.720 --> 00:01:18.680
+you need to do here
+
+00:01:18.680 --> 00:01:20.360
+is executing the babel block,
+
+00:01:20.360 --> 00:01:23.800
+which consists of more or less dirty Elisp code
+
+00:01:23.800 --> 00:01:27.040
+that installs the necessary packages, functions,
+
+00:01:27.040 --> 00:01:29.800
+and bindings required in this demo.
+
+00:01:29.800 --> 00:01:32.400
+You need to acknowledge the execution
+
+00:01:32.400 --> 00:01:36.160
+with yes and return, and after a couple of seconds,
+
+00:01:36.160 --> 00:01:37.920
+everything is downloaded
+
+00:01:37.920 --> 00:01:42.680
+and set up nicely for your demo.
+
+00:01:42.680 --> 00:01:45.040
+The first demo is the demo
+
+00:01:45.040 --> 00:01:46.960
+where I'm going to show you
+
+00:01:46.960 --> 00:01:48.480
+how I'm working with links
+
+00:01:48.480 --> 00:01:50.120
+between arbitrary headings.
+
+00:01:50.120 --> 00:01:52.440
+It consists of two commands,
+
+00:01:52.440 --> 00:01:55.480
+org-super-links-quick-insert-inline-link,
+
+00:01:55.480 --> 00:01:56.640
+and the second one is
+
+00:01:56.640 --> 00:01:59.160
+org-super-links-quick-insert-drawer-link.
+
+00:01:59.160 --> 00:02:01.040
+So the difference is,
+
+00:02:01.040 --> 00:02:03.720
+the first one is an inline link,
+
+00:02:03.720 --> 00:02:07.640
+and the second one only depends
+
+00:02:07.640 --> 00:02:09.960
+on the drawers of the headings.
+
+00:02:09.960 --> 00:02:12.800
+So let's show you what I mean.
+
+00:02:12.800 --> 00:02:15.240
+If I'm inserting here the inline link
+
+00:02:15.240 --> 00:02:18.680
+to the second one, which I have to choose
+
+00:02:18.680 --> 00:02:21.200
+from the result set here,
+
+00:02:21.200 --> 00:02:26.440
+you see that there is this second heading link
+
+00:02:26.440 --> 00:02:29.480
+included here in the first heading.
+
+00:02:29.480 --> 00:02:34.920
+Let's open up the first and second heading.
+
+00:02:34.920 --> 00:02:37.120
+You see that I can jump this link
+
+00:02:37.120 --> 00:02:40.520
+to the second heading. The first heading
+
+00:02:40.520 --> 00:02:42.000
+as well as the second heading
+
+00:02:42.000 --> 00:02:43.880
+get human readable IDs,
+
+00:02:43.880 --> 00:02:46.040
+which I personally prefer.
+
+00:02:46.040 --> 00:02:49.320
+The second one gets
+
+00:02:49.320 --> 00:02:51.600
+a backheading in a link drawer,
+
+00:02:51.600 --> 00:02:53.680
+which was created automatically.
+
+00:02:53.680 --> 00:02:57.440
+So this is a method where I link arbitrary headings,
+
+00:02:57.440 --> 00:02:59.167
+and that's the main reason
+
+00:02:59.168 --> 00:03:01.214
+why I personally don't need any
+
+00:03:01.215 --> 00:03:03.920
+Zettelkasten-based method like Org Roam.
+
+00:03:03.920 --> 00:03:08.600
+The next command which I want to show you
+
+00:03:08.600 --> 00:03:13.480
+is the link between those drawers.
+
+00:03:13.480 --> 00:03:17.720
+So in order to link the third to the fourth,
+
+00:03:17.720 --> 00:03:20.320
+I need to look for the fourth.
+
+00:03:20.320 --> 00:03:24.200
+In this case, you do not see
+
+00:03:24.200 --> 00:03:27.400
+any inline link like here above,
+
+00:03:27.400 --> 00:03:31.520
+but you see the :PROPERTIES: drawers
+
+00:03:31.520 --> 00:03:35.400
+and the :LINKS: drawers in both headings.
+
+00:03:35.400 --> 00:03:38.480
+So there is a forward- and a back-link
+
+00:03:38.480 --> 00:03:40.200
+between those two headings,
+
+00:03:40.200 --> 00:03:42.920
+and if you see a links drawer
+
+00:03:42.920 --> 00:03:45.440
+you know that there are
+
+00:03:45.440 --> 00:03:47.560
+linked headings you can follow.
+
+00:03:47.560 --> 00:03:51.640
+I do find this method very very handy.
+
+00:03:51.640 --> 00:03:53.600
+Of course, this doesn't only work
+
+00:03:53.600 --> 00:03:57.120
+within one single Org mode file.
+
+00:03:57.120 --> 00:04:01.440
+It works between arbitrary Org mode files
+
+00:04:01.440 --> 00:04:02.633
+as long as they are
+
+00:04:02.634 --> 00:04:05.760
+part of your Org Mode agenda list.
+
+00:04:05.760 --> 00:04:08.280
+So that was the first heading
+
+00:04:08.280 --> 00:04:09.960
+with the bi-directional links.
+
+00:04:09.960 --> 00:04:11.640
+The second one is a little bit
+
+00:04:11.640 --> 00:04:13.080
+more complicated than that
+
+00:04:13.080 --> 00:04:17.280
+because I show you how I'm working with projects.
+
+00:04:17.280 --> 00:04:19.533
+Usually, I start the project
+
+00:04:19.534 --> 00:04:22.080
+by adding a "Why?" statement
+
+00:04:22.080 --> 00:04:25.200
+so that I remember why this project
+
+00:04:25.200 --> 00:04:27.440
+needs to be done in the first place.
+
+00:04:27.440 --> 00:04:32.280
+I do a brainstorming on the tasks
+
+00:04:32.280 --> 00:04:33.933
+that need to be done in the project
+
+00:04:33.934 --> 00:04:36.280
+as a simple list.
+
+00:04:36.280 --> 00:04:39.360
+With this handy command (C-c *),
+
+00:04:39.360 --> 00:04:43.840
+I'm converting it to a list of Org mode headings.
+
+00:04:43.840 --> 00:04:47.040
+Now let's add the NEXT keyword,
+
+00:04:47.040 --> 00:04:49.000
+which is my default to-do keyword,
+
+00:04:49.001 --> 00:04:49.760
+to the first heading.
+
+00:04:49.760 --> 00:04:53.320
+You notice that there is a CREATED property
+
+00:04:53.320 --> 00:04:56.480
+which is not relevant to the demo itself,
+
+00:04:56.480 --> 00:04:57.840
+but it's part of my setup.
+
+00:04:57.840 --> 00:05:00.840
+I really like those created headings
+
+00:05:00.840 --> 00:05:03.640
+because when I add arbitrary headings,
+
+00:05:03.640 --> 00:05:07.680
+this CREATED property is added automatically.
+
+00:05:07.680 --> 00:05:11.480
+So now I want to define a dependency
+
+00:05:11.480 --> 00:05:12.967
+between "Empty garage"
+
+00:05:12.968 --> 00:05:14.800
+and "Paint walls and floor."
+
+00:05:14.800 --> 00:05:18.480
+I do that by invoking my command here,
+
+00:05:18.480 --> 00:05:22.520
+and look for the "Paint walls" heading.
+
+00:05:22.520 --> 00:05:28.600
+In this dialogue, you may add a scheduled date
+
+00:05:28.600 --> 00:05:30.233
+and/or a deadline date
+
+00:05:30.234 --> 00:05:34.240
+and/or a to-do statement. For this demo
+
+00:05:34.240 --> 00:05:37.640
+I only choose the to-do keyword.
+
+00:05:37.640 --> 00:05:39.400
+You notice that there is
+
+00:05:39.400 --> 00:05:41.000
+this TRIGGER property added.
+
+00:05:41.000 --> 00:05:43.280
+That's default behavior of org-edna
+
+00:05:43.280 --> 00:05:47.200
+which is managing the dependencies, in my case.
+
+00:05:47.200 --> 00:05:51.600
+In the other one, there is this BLOCKER property.
+
+00:05:51.600 --> 00:05:55.360
+It's very handy to know that those IDs
+
+00:05:55.360 --> 00:05:57.880
+might be used for jumping
+
+00:05:57.880 --> 00:06:00.640
+between those dependencies again.
+
+00:06:00.640 --> 00:06:03.600
+Those two headings don't have to be necessarily
+
+00:06:03.600 --> 00:06:05.560
+in the very same Org Mode file.
+
+00:06:05.560 --> 00:06:07.920
+They may be scattered around
+
+00:06:07.920 --> 00:06:11.000
+your Org Mode agenda files all over the place.
+
+00:06:11.000 --> 00:06:16.160
+So continuing this definition of dependency
+
+00:06:16.160 --> 00:06:19.040
+between the second and the third one...
+
+00:06:19.040 --> 00:06:23.000
+I'm using the search "Bring back stuff"...
+
+00:06:23.000 --> 00:06:24.800
+the search functionality...
+
+00:06:24.800 --> 00:06:28.800
+I choose the NEXT keyword here, its dependency.
+
+00:06:28.800 --> 00:06:32.480
+The same holds true for the last two.
+
+00:06:32.480 --> 00:06:37.400
+"Is painted", for example. I'm going to use
+
+00:06:37.400 --> 00:06:39.320
+the NEXT keyword again.
+
+00:06:39.320 --> 00:06:44.520
+I tend to use the last task of any project
+
+00:06:44.520 --> 00:06:47.120
+to close the overall project.
+
+00:06:47.120 --> 00:06:49.880
+So if I show you this one,
+
+00:06:49.880 --> 00:06:57.040
+I'm using the dependency to "Garage" project,
+
+00:06:57.040 --> 00:07:02.200
+and this time I'm using the DONE keyword.
+
+00:07:02.200 --> 00:07:04.920
+Of course, the properties
+
+00:07:04.920 --> 00:07:07.920
+look like that all the time,
+
+00:07:07.920 --> 00:07:11.640
+so there is a trigger from the first task
+
+00:07:11.640 --> 00:07:13.920
+to the second one, and there is a blocker
+
+00:07:13.920 --> 00:07:17.120
+from the second one back to the first one,
+
+00:07:17.120 --> 00:07:21.640
+and when I'm actually doing the project,
+
+00:07:21.640 --> 00:07:25.520
+I may now mark the first task as DONE,
+
+00:07:25.520 --> 00:07:28.360
+and you notice that the second one
+
+00:07:28.360 --> 00:07:31.440
+automatically gets a next keyword.
+
+00:07:31.440 --> 00:07:34.600
+This happened, of course, for all those tasks.
+
+00:07:34.600 --> 00:07:38.920
+The neat thing is when I close the last one,
+
+00:07:38.920 --> 00:07:42.760
+the overall project gets its DONE keyword as well.
+
+00:07:42.760 --> 00:07:46.360
+So this is how I'm working with
+
+00:07:46.360 --> 00:07:49.120
+projects and dependencies.
+
+00:07:49.120 --> 00:07:53.720
+Most of the time, task dependencies
+
+00:07:53.720 --> 00:07:58.160
+are not even within the same Org Mode subheading,
+
+00:07:58.160 --> 00:08:01.600
+let's say. Also, I'm using dependencies
+
+00:08:01.600 --> 00:08:03.720
+between different Org Mode files.
+
+00:08:03.720 --> 00:08:07.160
+This is a very, very cool way of defining
+
+00:08:07.160 --> 00:08:10.040
+what to do next in a project,
+
+00:08:10.040 --> 00:08:12.667
+without looking for tasks
+
+00:08:12.668 --> 00:08:15.640
+that can't be done at that stage.
+
+00:08:15.640 --> 00:08:20.240
+You can have a look at the details of the demo
+
+00:08:20.240 --> 00:08:23.800
+by checking out the files in the repository.
+
+00:08:23.800 --> 00:08:27.080
+That's it for the demo,
+
+00:08:27.080 --> 00:08:30.720
+and therefore I thank you for your patience.
+
+00:08:30.720 --> 00:08:32.160
+I wish you good luck,
+
+00:08:32.160 --> 00:08:39.520
+and I hope that I could show you one or two tricks
+
+00:08:39.520 --> 00:08:42.080
+that you can add to your Org Mode setup
+
+00:08:42.080 --> 00:08:47.040
+in order to help you with your daily work.
+
+00:08:47.040 --> 00:08:56.000
+So bye from me, till next time.
diff --git a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt
new file mode 100644
index 00000000..7f9550b2
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt
@@ -0,0 +1,2348 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:26.000
+ [MUSIC PLAYING]
+
+00:00:26.000 --> 00:00:36.000
+ [MUSIC PLAYING]
+
+00:00:36.000 --> 00:00:42.480
+ And so this little application--
+
+00:00:42.480 --> 00:00:46.480
+ well, I'll skip that and just kind of jump right
+
+00:00:46.480 --> 00:00:49.760
+ into my thesis for those of you that
+
+00:00:49.760 --> 00:00:53.360
+ might be planning to duck out for the RMS talk,
+
+00:00:53.360 --> 00:00:55.520
+ starting in a little bit.
+
+00:00:55.520 --> 00:00:59.360
+ So essentially, my thesis here is really
+
+00:00:59.360 --> 00:01:04.800
+ that the Emacs toolchain can easily
+
+00:01:04.800 --> 00:01:10.280
+ be combined with other skills and used in kind of a Unix
+
+00:01:10.280 --> 00:01:13.280
+ paradigm of having sort of different tools
+
+00:01:13.280 --> 00:01:14.960
+ to do different steps.
+
+00:01:14.960 --> 00:01:17.760
+ We might actually use the same tool
+
+00:01:17.760 --> 00:01:19.240
+ to implement a couple of steps.
+
+00:01:19.240 --> 00:01:22.080
+ But with that paradigm, each step
+
+00:01:22.080 --> 00:01:24.960
+ is an individual item that can be sort of dropped in
+
+00:01:24.960 --> 00:01:26.400
+ and replaced.
+
+00:01:26.400 --> 00:01:29.560
+ So over the course of the talk, hopefully I'll
+
+00:01:29.560 --> 00:01:31.080
+ come back to that thesis.
+
+00:01:31.080 --> 00:01:35.800
+ But I'll now jump back and start walking through what is
+
+00:01:35.800 --> 00:01:37.040
+ orgvm?
+
+00:01:37.040 --> 00:01:39.560
+ So this is a very simple proof of concept program.
+
+00:01:39.560 --> 00:01:44.200
+ We'll just jump over to perhaps a prettier view of the
+
+00:01:44.200 --> 00:01:44.880
+ source
+
+00:01:44.880 --> 00:01:45.520
+ code for it.
+
+00:01:45.520 --> 00:01:49.200
+ This is implemented-- oops.
+
+00:01:49.200 --> 00:01:53.160
+ There's some cruft, I think, in my local.
+
+00:01:53.160 --> 00:01:56.560
+ All right, so there's config block at the top.
+
+00:01:56.560 --> 00:01:58.120
+ And we'll be jumping back and forth
+
+00:01:58.120 --> 00:02:01.880
+ between the code and the documentation.
+
+00:02:01.880 --> 00:02:04.080
+ So the first thing I want to point out
+
+00:02:04.080 --> 00:02:05.960
+ is that this is written in Node.js.
+
+00:02:05.960 --> 00:02:08.600
+ But I think you'll find it'd be pretty trivial to implement
+
+00:02:08.600 --> 00:02:10.840
+ in any language.
+
+00:02:10.840 --> 00:02:13.960
+ Certainly, you're more than welcome to use this.
+
+00:02:13.960 --> 00:02:17.920
+ I'd be happy to accept your patches or feature requests
+
+00:02:17.920 --> 00:02:20.080
+ and things like that.
+
+00:02:20.080 --> 00:02:21.680
+ Of course, bug reports.
+
+00:02:21.680 --> 00:02:25.760
+ But I'd also encourage others to roll their own.
+
+00:02:25.760 --> 00:02:28.760
+ You might well come up with a different version of this
+
+00:02:28.760 --> 00:02:29.600
+ that's even cooler.
+
+00:02:29.600 --> 00:02:32.160
+ And we can learn from each other.
+
+00:02:32.160 --> 00:02:34.200
+ If you heard one of my talks before,
+
+00:02:34.200 --> 00:02:36.200
+ you probably recognize a common theme.
+
+00:02:36.200 --> 00:02:40.320
+ I'm a big fan of head-first development
+
+00:02:40.320 --> 00:02:43.540
+ as a way to get invested in both the tool chain and a
+
+00:02:43.540 --> 00:02:44.120
+ culture.
+
+00:02:44.120 --> 00:02:49.560
+ All right, so let's come back to orgvm.
+
+00:02:49.560 --> 00:02:52.280
+ First of all, we'll start with the itch I was trying to
+
+00:02:52.280 --> 00:02:52.840
+ scratch.
+
+00:02:52.840 --> 00:02:58.240
+ I wanted to be able to quickly use a web browser
+
+00:02:58.240 --> 00:03:00.680
+ to browse my org documents.
+
+00:03:00.680 --> 00:03:03.530
+ It's particularly handy when the documents are full of
+
+00:03:03.530 --> 00:03:03.960
+ cross
+
+00:03:03.960 --> 00:03:05.640
+ links to each other.
+
+00:03:05.640 --> 00:03:10.080
+ That meant I wanted to automatically export,
+
+00:03:10.080 --> 00:03:12.280
+ particularly to HTML.
+
+00:03:12.280 --> 00:03:17.280
+ But it made sense for me to include Markdown, PDF,
+
+00:03:17.280 --> 00:03:18.880
+ or whatever format I want.
+
+00:03:18.880 --> 00:03:22.760
+ Because many times, I'm going to look at that file
+
+00:03:22.760 --> 00:03:29.480
+ and then pop it into an email or upload it somewhere.
+
+00:03:29.480 --> 00:03:33.240
+ And then finally, it should be, therefore,
+
+00:03:33.240 --> 00:03:36.840
+ pretty easy to download the document rather than view it
+
+00:03:36.840 --> 00:03:38.320
+ once I'm done.
+
+00:03:38.320 --> 00:03:42.200
+ So let's just run a quick demo.
+
+00:03:42.200 --> 00:03:44.760
+ You'll see I'm still a Windows user.
+
+00:03:44.760 --> 00:03:45.960
+ Yeah, I'm working on it.
+
+00:03:45.960 --> 00:03:52.320
+ So all right, first thing that we're going to do
+
+00:03:52.320 --> 00:03:53.320
+ is fire up the program.
+
+00:03:53.320 --> 00:04:00.200
+ Actually, for simplicity, let's just
+
+00:04:00.200 --> 00:04:01.760
+ admit we live in a DOS world.
+
+00:04:01.760 --> 00:04:19.760
+ And as you can see, there's not much to it
+
+00:04:19.760 --> 00:04:21.520
+ to get the application running.
+
+00:04:22.680 --> 00:04:22.680
+
+
+00:04:22.680 --> 00:04:25.960
+ So with that done, then, I can run out to my local host.
+
+00:04:25.960 --> 00:04:36.780
+ And we'll just start by plugging in the name of an org file
+
+00:04:36.780 --> 00:04:37.560
+.
+
+00:04:37.560 --> 00:04:45.820
+ So I've got a little org file that I prepared that just
+
+00:04:45.820 --> 00:04:46.640
+ kind
+
+00:04:46.640 --> 00:04:49.040
+ of provides a proof of concept to this.
+
+00:04:49.040 --> 00:04:53.560
+ And you can see, as imagined, we're automatically
+
+00:04:53.560 --> 00:04:54.640
+ turning that org file.
+
+00:04:54.640 --> 00:04:56.320
+ Let's just take a quick look at it.
+
+00:04:56.320 --> 00:05:10.280
+ And here's that file now.
+
+00:05:10.280 --> 00:05:11.960
+ But you can see nothing up my sleeve.
+
+00:05:11.960 --> 00:05:14.000
+ This is a very basic org file that I
+
+00:05:14.000 --> 00:05:16.560
+ use for testing this program.
+
+00:05:16.560 --> 00:05:17.640
+ Images work.
+
+00:05:17.640 --> 00:05:21.800
+ We've got some nicely syntax highlighted code
+
+00:05:21.800 --> 00:05:25.560
+ blocks in a couple different languages.
+
+00:05:25.560 --> 00:05:29.760
+ And not really that much going on there.
+
+00:05:29.760 --> 00:05:33.760
+ All right, let's come back to the documentation.
+
+00:05:33.760 --> 00:05:36.680
+ I pretty well covered this, I think.
+
+00:05:36.680 --> 00:05:39.720
+ But you'll need a relatively recent version of Emacs.
+
+00:05:39.720 --> 00:05:43.640
+ I haven't taken any pains to make this backward compatible.
+
+00:05:43.640 --> 00:05:46.000
+ To be fair, I haven't tested it extensively.
+
+00:05:46.000 --> 00:05:50.320
+ It may well work on Emacs 26 or older versions.
+
+00:05:50.320 --> 00:05:55.120
+ I'm personally running 27.1 and 28,
+
+00:05:55.120 --> 00:05:57.080
+ as well as recent builds of 29.
+
+00:05:57.080 --> 00:06:02.560
+ There's some quick start instructions here,
+
+00:06:02.560 --> 00:06:03.900
+ which I'm going to take as read.
+
+00:06:03.900 --> 00:06:09.160
+ You probably saw the key element of this, which
+
+00:06:09.160 --> 00:06:11.920
+ involves starting the program.
+
+00:06:11.920 --> 00:06:13.520
+ You do-- I will call out Yale.
+
+00:06:13.520 --> 00:06:15.320
+ If you're trying to play with this yourself,
+
+00:06:15.320 --> 00:06:20.080
+ don't forget to run the npm install command.
+
+00:06:20.080 --> 00:06:23.240
+ That'll bring in express.js, which the JavaScript we're
+
+00:06:23.240 --> 00:06:24.920
+ about to look at is built on.
+
+00:06:24.920 --> 00:06:33.480
+ So let's just take a look at the usage patterns real quick.
+
+00:06:33.480 --> 00:06:35.920
+ To use this, we're simply giving the document name
+
+00:06:35.920 --> 00:06:42.760
+ without the org extension in whatever file path--
+
+00:06:42.760 --> 00:06:46.960
+ or I'm sorry, whatever we've configured the server
+
+00:06:46.960 --> 00:06:50.800
+ to run on, in this case, port 3000.
+
+00:06:50.800 --> 00:06:52.960
+ I also want to call attention to the fact
+
+00:06:52.960 --> 00:06:55.880
+ that nothing in this program protects you
+
+00:06:55.880 --> 00:06:57.240
+ from damaging yourself.
+
+00:06:57.240 --> 00:07:00.560
+ This isn't meant as a production capability.
+
+00:07:00.560 --> 00:07:03.290
+ This is something that's used to publish your own note
+
+00:07:03.290 --> 00:07:04.840
+ files
+
+00:07:04.840 --> 00:07:06.520
+ and roll them up to yourself.
+
+00:07:06.520 --> 00:07:08.680
+ That's something I'll definitely look at adding,
+
+00:07:08.680 --> 00:07:12.240
+ but I want people to be careful of it
+
+00:07:12.240 --> 00:07:14.720
+ while this is in an alpha state.
+
+00:07:14.720 --> 00:07:22.960
+ So the default response is HTML, and we saw that here.
+
+00:07:22.960 --> 00:07:26.240
+ But we also can modify the response format.
+
+00:07:26.240 --> 00:07:29.800
+ We're currently supporting HTML, Markdown, and PDF.
+
+00:07:29.800 --> 00:07:34.280
+ And that's really enough to select a different format.
+
+00:07:34.280 --> 00:07:36.640
+ That's really nothing more than adding--
+
+00:07:36.640 --> 00:07:45.040
+ [AUDIO OUT]
+
+00:07:45.040 --> 00:07:48.040
+ --type, OK.
+
+00:07:48.040 --> 00:07:50.680
+ Not sure what's going on there.
+
+00:07:50.680 --> 00:07:57.080
+ OK, well, there goes my demo.
+
+00:07:57.080 --> 00:07:59.440
+ Shows me for doing my talk live.
+
+00:08:03.920 --> 00:08:06.960
+ But this, fortunately, this error message
+
+00:08:06.960 --> 00:08:08.840
+ is a nice segue to the part of the talk
+
+00:08:08.840 --> 00:08:10.240
+ that I'd really like to focus on,
+
+00:08:10.240 --> 00:08:13.520
+ hopefully bringing me back to that thesis.
+
+00:08:13.520 --> 00:08:17.760
+ So as we start to look at code, what we're looking for
+
+00:08:17.760 --> 00:08:21.640
+ is really this Emacs Lisp that's getting generated here.
+
+00:08:21.640 --> 00:08:24.000
+ And you'll notice that's the stuff
+
+00:08:24.000 --> 00:08:27.600
+ I thought was important to produce as diagnostics
+
+00:08:27.600 --> 00:08:29.840
+ for the programs running as well.
+
+00:08:29.840 --> 00:08:34.000
+ So spoiler, this e-lisp is dynamically
+
+00:08:34.000 --> 00:08:35.400
+ generated by the program.
+
+00:08:35.400 --> 00:08:38.160
+ And that's really the core of the way
+
+00:08:38.160 --> 00:08:42.680
+ org VM or my org VM works.
+
+00:08:42.680 --> 00:08:47.360
+ So this should look pretty similar to the view of the code
+
+00:08:47.360 --> 00:08:48.880
+ we had a moment ago.
+
+00:08:48.880 --> 00:08:51.840
+ You can see I've got some bases.
+
+00:08:51.840 --> 00:08:53.680
+ This is all hard-coded into the program,
+
+00:08:53.680 --> 00:08:56.720
+ nothing fancy going on here.
+
+00:08:56.720 --> 00:09:00.280
+ The debug is simply controlling that diagnostic output
+
+00:09:00.280 --> 00:09:01.560
+ that we looked at.
+
+00:09:01.560 --> 00:09:04.240
+ There's some other, hopefully fairly self-explanatory
+
+00:09:04.240 --> 00:09:09.160
+ programs or properties, where to find Emacs and so forth.
+
+00:09:09.160 --> 00:09:16.320
+ And then finally, we come in to the meat of it,
+
+00:09:16.320 --> 00:09:21.840
+ the variables that are used to control what e-lisp we
+
+00:09:21.840 --> 00:09:24.280
+ can generate dynamically.
+
+00:09:24.280 --> 00:09:27.400
+ So here, we're controlling the extension
+
+00:09:27.400 --> 00:09:29.360
+ that it should look for org files.
+
+00:09:29.360 --> 00:09:31.560
+ Hopefully not too many people out there
+
+00:09:31.560 --> 00:09:34.080
+ with a weird extension for the org files,
+
+00:09:34.080 --> 00:09:37.920
+ but this should support that.
+
+00:09:37.920 --> 00:09:40.120
+ I'm afraid that is something I've been known to do.
+
+00:09:40.120 --> 00:09:49.520
+ Then we define a list of additional export types.
+
+00:09:49.520 --> 00:09:50.760
+ Here's one that ought to work.
+
+00:09:50.760 --> 00:09:53.200
+ Let's take a look at type equals org.
+
+00:09:54.720 --> 00:09:54.720
+
+
+00:09:54.720 --> 00:09:59.320
+ And, aha, it's giving us the file.
+
+00:09:59.320 --> 00:10:00.680
+ So I'm not going to open that up,
+
+00:10:00.680 --> 00:10:02.400
+ but now we can see that that's definitely
+
+00:10:02.400 --> 00:10:09.200
+ working for certain versions of working.
+
+00:10:09.200 --> 00:10:14.280
+ So this list of type parameters is
+
+00:10:14.280 --> 00:10:15.720
+ controlling the supported types.
+
+00:10:15.720 --> 00:10:18.550
+ Hopefully it should be fairly easy to add in different ones
+
+00:10:18.550 --> 00:10:18.800
+.
+
+00:10:18.800 --> 00:10:21.480
+ The fancy footwork here is just a list
+
+00:10:21.480 --> 00:10:23.480
+ of the types that we're going to be using.
+
+00:10:23.480 --> 00:10:29.320
+ The fancy footwork here involves, first of all,
+
+00:10:29.320 --> 00:10:32.240
+ there's the extension and the MIME type.
+
+00:10:32.240 --> 00:10:36.520
+ That's, as you might guess, used to control the response
+
+00:10:36.520 --> 00:10:37.040
+ content
+
+00:10:37.040 --> 00:10:38.720
+ type.
+
+00:10:38.720 --> 00:10:40.920
+ We also have this replace variable.
+
+00:10:40.920 --> 00:10:44.000
+ This prevents-- there's an optimization
+
+00:10:44.000 --> 00:10:48.840
+ to send an existing PDF or HTML file if that's already
+
+00:10:48.840 --> 00:10:53.520
+ there, but only if the original source org file hasn't
+
+00:10:53.520 --> 00:10:56.240
+ been modified since.
+
+00:10:56.240 --> 00:10:59.920
+ This replace effectively can turn that off.
+
+00:10:59.920 --> 00:11:03.040
+ If I remove the replace equals true attribute,
+
+00:11:03.040 --> 00:11:07.600
+ then I'll be prevented from overwriting that.
+
+00:11:07.600 --> 00:11:10.320
+ In other words, I'll always send a cached version.
+
+00:11:10.320 --> 00:11:13.880
+ That might be helpful if, for example, you've
+
+00:11:13.880 --> 00:11:16.560
+ got hand-tuned PDFs and you don't want to accidentally
+
+00:11:16.560 --> 00:11:17.200
+ overwrite them.
+
+00:11:19.120 --> 00:11:19.120
+
+
+00:11:19.120 --> 00:11:23.480
+ All right, let's get into the code a little bit more.
+
+00:11:23.480 --> 00:11:28.280
+ I'm going to skip past the really good stuff
+
+00:11:28.280 --> 00:11:32.520
+ and jump into the boring parts so that we have them
+
+00:11:32.520 --> 00:11:34.240
+ as context.
+
+00:11:34.240 --> 00:11:37.160
+ Here's the default path.
+
+00:11:37.160 --> 00:11:41.880
+ And it is going to send me the readme from the project--
+
+00:11:41.880 --> 00:11:47.120
+ from the project repo if I don't specify a path.
+
+00:11:47.120 --> 00:11:51.240
+ And then we have a couple of different endpoints
+
+00:11:51.240 --> 00:11:52.480
+ that we support.
+
+00:11:52.480 --> 00:11:55.560
+ We'll come back to this first one.
+
+00:11:55.560 --> 00:11:59.600
+ For now, let's start with the more normal one, which
+
+00:11:59.600 --> 00:12:01.760
+ is just giving us a file name.
+
+00:12:01.760 --> 00:12:04.160
+ So we can see we start by figuring out
+
+00:12:04.160 --> 00:12:08.520
+ what the physical file name should be called.
+
+00:12:08.520 --> 00:12:10.280
+ And assuming that that exists--
+
+00:12:15.600 --> 00:12:17.080
+ sorry, I've confused myself.
+
+00:12:17.080 --> 00:12:23.000
+ So this is the caching or the optimization
+
+00:12:23.000 --> 00:12:25.640
+ that I mentioned, sending the existing file.
+
+00:12:25.640 --> 00:12:31.360
+ This file exists is where the optimization is
+
+00:12:31.360 --> 00:12:38.680
+ that regenerates the file if the source
+
+00:12:38.680 --> 00:12:41.840
+ or document for the HTML generator has changed.
+
+00:12:45.080 --> 00:12:46.760
+ Again, this is a short talk, so I'm not
+
+00:12:46.760 --> 00:12:49.320
+ going to go into all the nuances of this JavaScript code.
+
+00:12:49.320 --> 00:12:52.800
+ It's pretty far from an Emacs-related thing.
+
+00:12:52.800 --> 00:12:56.040
+ So with that said, then, the rest of this program
+
+00:12:56.040 --> 00:12:59.360
+ is really mostly just handling the different error.
+
+00:12:59.360 --> 00:13:01.000
+ I didn't understand that type.
+
+00:13:01.000 --> 00:13:02.080
+ I don't know the document.
+
+00:13:02.080 --> 00:13:03.040
+ I failed.
+
+00:13:03.040 --> 00:13:06.480
+ Otherwise, there's the caching.
+
+00:13:06.480 --> 00:13:14.520
+ And here's really where things get interesting,
+
+00:13:14.520 --> 00:13:19.200
+ where we've generated some ELISP,
+
+00:13:19.200 --> 00:13:22.280
+ and then we're calling Emacs with that ELISP.
+
+00:13:22.280 --> 00:13:24.760
+ If everything works, we'll send the file.
+
+00:13:24.760 --> 00:13:27.800
+ If it doesn't, we'll send the 500.
+
+00:13:27.800 --> 00:13:30.920
+ And we've already seen the 500, so we know that works.
+
+00:13:30.920 --> 00:13:33.760
+ All right, let's get to the interesting part.
+
+00:13:33.760 --> 00:13:37.320
+ Sorry, one more footnote.
+
+00:13:37.320 --> 00:13:39.320
+ There is a capability built in that will
+
+00:13:39.320 --> 00:13:41.040
+ allow us to execute an org block.
+
+00:13:41.040 --> 00:13:42.840
+ Let's see if that's working in our local.
+
+00:13:44.800 --> 00:13:44.800
+
+
+00:13:44.800 --> 00:13:47.200
+ I'll remind myself how to do it.
+
+00:13:47.200 --> 00:13:49.560
+ It's run.
+
+00:13:49.560 --> 00:13:53.320
+ I think it's called test.
+
+00:13:53.320 --> 00:13:56.360
+ And that's returning a 500.
+
+00:13:56.360 --> 00:13:58.400
+ I'm suspecting that's running because I'm running
+
+00:13:58.400 --> 00:13:59.760
+ in command instead of bash.
+
+00:13:59.760 --> 00:14:06.040
+ Oh, yeah, so the failure is happening
+
+00:14:06.040 --> 00:14:07.720
+ after I generate the ELISP.
+
+00:14:07.720 --> 00:14:10.280
+ I'm pretty confident that is what the actual problem is.
+
+00:14:10.280 --> 00:14:12.760
+ If we have time, I'll jump back over there
+
+00:14:12.760 --> 00:14:19.280
+ and relaunch it in mingity-bash.
+
+00:14:19.280 --> 00:14:21.440
+ And we can see it actually work.
+
+00:14:21.440 --> 00:14:24.200
+ But this works pretty well for me on my work laptop.
+
+00:14:24.200 --> 00:14:25.860
+ I didn't have to make any changes to it.
+
+00:14:25.860 --> 00:14:28.120
+ So I have a fairly high amount of confidence,
+
+00:14:28.120 --> 00:14:32.400
+ at least in trivial cases, this works pretty well.
+
+00:14:32.400 --> 00:14:37.800
+ All right, so what I actually wanted to talk about today--
+
+00:14:37.800 --> 00:14:42.400
+ and I'm going to be kind of hand-waving around this ES5
+
+00:14:42.400 --> 00:14:46.480
+ class that I've got and kind of the way that works.
+
+00:14:46.480 --> 00:14:49.840
+ Hopefully, this will be pretty familiar to you
+
+00:14:49.840 --> 00:14:53.440
+ if you are a JavaScript programmer.
+
+00:14:53.440 --> 00:14:58.660
+ The interesting stuff comes when we want to build some LISP
+
+00:14:58.660 --> 00:14:59.000
+.
+
+00:15:01.960 --> 00:15:09.410
+ Here, you can see that I really don't have a whole lot of
+
+00:15:09.410 --> 00:15:09.720
+ code
+
+00:15:09.720 --> 00:15:11.280
+ around formatting LISP.
+
+00:15:11.280 --> 00:15:14.360
+ You can see that I've special-cased
+
+00:15:14.360 --> 00:15:19.840
+ whether the arguments that were passed
+
+00:15:19.840 --> 00:15:20.880
+ happen to be a function.
+
+00:15:20.880 --> 00:15:25.480
+ If they are, I'm going to call that function.
+
+00:15:25.480 --> 00:15:31.720
+ And then the result will be formatted as LISP.
+
+00:15:31.720 --> 00:15:35.040
+ So this would be a recursive call here.
+
+00:15:35.040 --> 00:15:40.960
+ Otherwise, I'm just going to return the arguments.
+
+00:15:40.960 --> 00:15:48.440
+ Sorry, otherwise, I will slap a pair of parentheses
+
+00:15:48.440 --> 00:15:53.440
+ around the result of walking that list
+
+00:15:53.440 --> 00:15:57.880
+ if I get formatting each element of the list of arguments
+
+00:15:57.880 --> 00:16:02.600
+ that this format LISP process calls
+
+00:16:02.600 --> 00:16:04.920
+ and separating them with spaces.
+
+00:16:04.920 --> 00:16:10.880
+ So in short form, this program walks through a list.
+
+00:16:10.880 --> 00:16:14.000
+ If the list it receives is a function,
+
+00:16:14.000 --> 00:16:16.080
+ it calls that function.
+
+00:16:16.080 --> 00:16:19.320
+ Once that's handled or otherwise,
+
+00:16:19.320 --> 00:16:22.720
+ we simply walk the list, taking the arguments,
+
+00:16:22.720 --> 00:16:26.000
+ concatenating them on strings, and finally,
+
+00:16:26.000 --> 00:16:28.560
+ wrap the results in parentheses.
+
+00:16:28.560 --> 00:16:31.760
+ So what I didn't mention there but might be obvious
+
+00:16:31.760 --> 00:16:36.120
+ is if I have a nested list, the inner list
+
+00:16:36.120 --> 00:16:38.600
+ will be subjected to the same treatment.
+
+00:16:38.600 --> 00:16:43.000
+ So this is a recursive sort of algorithm.
+
+00:16:43.000 --> 00:16:51.520
+ All right, so now when I go to export,
+
+00:16:51.520 --> 00:16:53.520
+ actually, in the interest of time,
+
+00:16:53.520 --> 00:16:55.800
+ I'm going to avoid walking through that piece of code
+
+00:16:55.800 --> 00:16:58.840
+ and let's focus instead on the more interesting part
+
+00:16:58.840 --> 00:17:02.360
+ of how that LISP gets encoded.
+
+00:17:02.360 --> 00:17:07.520
+ So coming back to the PDF is a good example here
+
+00:17:07.520 --> 00:17:10.320
+ because it's got a special case.
+
+00:17:10.320 --> 00:17:14.280
+ You can see I've specified this export fun or export
+
+00:17:14.280 --> 00:17:15.320
+ function.
+
+00:17:15.320 --> 00:17:19.560
+ That's a property none of these other types have.
+
+00:17:22.400 --> 00:17:27.280
+ And you can see it contains a meat LISP telling us
+
+00:17:27.280 --> 00:17:29.760
+ how to call the export for it.
+
+00:17:29.760 --> 00:17:32.680
+ Let's go see how that's used.
+
+00:17:32.680 --> 00:17:35.720
+ At the very end of what I just skipped over,
+
+00:17:35.720 --> 00:17:40.600
+ the detailed how the org export process works,
+
+00:17:40.600 --> 00:17:45.040
+ you'll see that I am ending with a step
+
+00:17:45.040 --> 00:17:48.000
+ to call the export function.
+
+00:17:48.000 --> 00:17:54.520
+ Here, I look to see whether I have an export function
+
+00:17:54.520 --> 00:17:55.400
+ property.
+
+00:17:55.400 --> 00:18:00.920
+ If I do, I call that function.
+
+00:18:00.920 --> 00:18:06.760
+ And if I don't, I build this list with the default org
+
+00:18:06.760 --> 00:18:14.320
+ export to file function using the file name and an output
+
+00:18:14.320 --> 00:18:15.640
+ file name.
+
+00:18:15.640 --> 00:18:18.480
+ So this, hopefully, is pretty familiar to anybody
+
+00:18:18.480 --> 00:18:22.950
+ that's manually messed around with calling org export to
+
+00:18:22.950 --> 00:18:23.560
+ file.
+
+00:18:23.560 --> 00:18:25.800
+ If it isn't, you can pretty well trust me for it.
+
+00:18:25.800 --> 00:18:28.280
+ There's nothing very special going on.
+
+00:18:28.280 --> 00:18:30.760
+ This looks rather like--
+
+00:18:30.760 --> 00:18:37.240
+ poor example there.
+
+00:18:37.240 --> 00:18:38.960
+ Let's go back to our markdown.
+
+00:18:38.960 --> 00:18:46.320
+ [AUDIO OUT]
+
+00:18:46.320 --> 00:18:47.720
+ And there, we can see--
+
+00:18:47.720 --> 00:18:49.840
+ - I'm going to make a quick announcement.
+
+00:18:49.840 --> 00:18:50.760
+ Can you hear me?
+
+00:18:50.760 --> 00:18:52.480
+ - Yes, go for it.
+
+00:18:52.480 --> 00:18:54.280
+ - OK, let me just show my face.
+
+00:18:54.280 --> 00:18:55.400
+ Oh, I'm not showing my face.
+
+00:18:55.400 --> 00:18:55.640
+ Damn it.
+
+00:18:55.640 --> 00:18:57.000
+ OK, I'll make the announcement.
+
+00:18:57.000 --> 00:18:58.600
+ You won't see my face quite yet.
+
+00:18:58.600 --> 00:19:00.360
+ We are about to get started.
+
+00:19:00.360 --> 00:19:02.440
+ Well, we actually just got started on dev
+
+00:19:02.440 --> 00:19:06.040
+ with the talk by RMS.
+
+00:19:06.040 --> 00:19:08.920
+ So if you want to hop over to watch the talk by RMS,
+
+00:19:08.920 --> 00:19:09.760
+ feel free to do so.
+
+00:19:09.760 --> 00:19:12.240
+ Otherwise, we will be continuing on Gen with Corwin
+
+00:19:12.240 --> 00:19:14.520
+ to finish his talk and have a Q&A. Corwin,
+
+00:19:14.520 --> 00:19:16.080
+ you can feel free to go now.
+
+00:19:16.080 --> 00:19:18.560
+ - OK, bye, everybody.
+
+00:19:18.560 --> 00:19:22.800
+ And for those sticking around, I'm
+
+00:19:22.800 --> 00:19:25.040
+ just going to keep pressing on with this.
+
+00:19:25.040 --> 00:19:30.240
+ In fact, I'm going to dive back into the part
+
+00:19:30.240 --> 00:19:35.400
+ that I skipped here, which is the rest of how
+
+00:19:35.400 --> 00:19:37.400
+ this export functionality works.
+
+00:19:37.400 --> 00:19:41.400
+ So just to make sure the dot is tied together,
+
+00:19:41.400 --> 00:19:44.440
+ the core of how this program works
+
+00:19:44.440 --> 00:19:49.320
+ is generating some ELISP and then passing it
+
+00:19:49.320 --> 00:19:51.680
+ to Emacs in batch mode.
+
+00:19:51.680 --> 00:19:53.280
+ So if that wasn't perfectly clear,
+
+00:19:53.280 --> 00:19:57.240
+ that's really what's going on with this program.
+
+00:19:57.240 --> 00:19:59.240
+ The rest of the implementation is just
+
+00:19:59.240 --> 00:20:01.840
+ a way to do that or certain features that
+
+00:20:01.840 --> 00:20:08.440
+ are supported in that generated ELISP, if you will.
+
+00:20:08.440 --> 00:20:11.720
+ So this is, you could say, the minimum implementation
+
+00:20:11.720 --> 00:20:16.220
+ I could come up with to create a web server for my local
+
+00:20:16.220 --> 00:20:16.560
+ org
+
+00:20:16.560 --> 00:20:17.320
+ documents.
+
+00:20:17.320 --> 00:20:24.440
+ And I will also interrupt myself to just pull up
+
+00:20:24.440 --> 00:20:28.040
+ the etherpad real quick.
+
+00:20:28.040 --> 00:20:29.600
+ Actually, if somebody is listening
+
+00:20:29.600 --> 00:20:34.720
+ and can share a link to that, I closed my browser window
+
+00:20:34.720 --> 00:20:36.400
+ with my links in it.
+
+00:20:36.400 --> 00:20:44.520
+ But sure, I'm happy to take questions at any point, Leo,
+
+00:20:44.520 --> 00:20:48.480
+ if there are any questions for me.
+
+00:20:48.480 --> 00:20:49.720
+ Are you hanging out with me?
+
+00:20:49.720 --> 00:20:53.360
+ Instead of watching RMS, you can go.
+
+00:20:53.360 --> 00:20:54.600
+ I'm teasing.
+
+00:20:54.600 --> 00:20:58.840
+ No, I mean, we know that some people can
+
+00:20:58.840 --> 00:21:00.000
+ have both streams open.
+
+00:21:00.000 --> 00:21:01.560
+ It's fine.
+
+00:21:01.560 --> 00:21:03.320
+ And right now, it's not the Q&A with RMS.
+
+00:21:03.320 --> 00:21:04.640
+ It's just the presentation.
+
+00:21:04.640 --> 00:21:07.040
+ So feel free to hang out a little longer
+
+00:21:07.040 --> 00:21:09.080
+ if you just want the live stuff.
+
+00:21:09.080 --> 00:21:09.960
+ Don't worry about it.
+
+00:21:09.960 --> 00:21:10.760
+ You're fine.
+
+00:21:10.760 --> 00:21:13.720
+ Yeah, and forgive me, everybody.
+
+00:21:13.720 --> 00:21:16.280
+ If you were hoping for a quick, succinct talk,
+
+00:21:16.280 --> 00:21:18.960
+ I happen to know I was going to be opposite RMS.
+
+00:21:18.960 --> 00:21:23.240
+ So I awarded myself the liberty of rambling.
+
+00:21:23.240 --> 00:21:26.840
+ So if you do have a question, something that I alluded to
+
+00:21:26.840 --> 00:21:29.800
+ and haven't come back to yet, you should, by all means,
+
+00:21:29.800 --> 00:21:30.320
+ prompt me.
+
+00:21:30.320 --> 00:21:33.800
+ A comment I might do--
+
+00:21:33.800 --> 00:21:35.400
+ I'm just giving you a little heads up.
+
+00:21:35.400 --> 00:21:38.640
+ I might need to go help at some point of a dev.
+
+00:21:38.640 --> 00:21:43.120
+ So if I need to do so, I will let you know right now
+
+00:21:43.120 --> 00:21:44.280
+ inside the BBB room.
+
+00:21:44.280 --> 00:21:46.160
+ And you'll be on your own to manage the chat.
+
+00:21:46.160 --> 00:21:47.960
+ And you can just talk backstage to us
+
+00:21:47.960 --> 00:21:50.240
+ to manage what we do with the stream, OK?
+
+00:21:50.240 --> 00:21:52.160
+ Yep, that should be no problem at all.
+
+00:21:52.160 --> 00:21:53.760
+ I've got my pad up now.
+
+00:21:53.760 --> 00:21:55.160
+ Thank you, Chancellor.
+
+00:21:55.160 --> 00:21:58.040
+ And I'm sorry about butchering your name there.
+
+00:21:58.040 --> 00:22:03.360
+ And yep, I've got my chat open.
+
+00:22:03.360 --> 00:22:06.400
+ And I think I'm pretty well set to self-manage.
+
+00:22:06.400 --> 00:22:07.640
+ Oh, I don't have a camera on.
+
+00:22:07.640 --> 00:22:09.360
+ So you can't see me giving you the thumbs up.
+
+00:22:09.360 --> 00:22:09.860
+ OK, good.
+
+00:22:09.860 --> 00:22:16.000
+ All right, so let's just walk through,
+
+00:22:16.000 --> 00:22:18.400
+ because it's sort of an interesting code.
+
+00:22:18.400 --> 00:22:20.560
+ Let's just take a look real quick
+
+00:22:20.560 --> 00:22:24.720
+ at how we generated our e-list here,
+
+00:22:24.720 --> 00:22:26.520
+ because it is--
+
+00:22:26.520 --> 00:22:27.640
+ there we go.
+
+00:22:27.640 --> 00:22:29.240
+ It is a little bit interesting.
+
+00:22:29.240 --> 00:22:32.040
+ So here is the method.
+
+00:22:32.040 --> 00:22:34.080
+ So I didn't get into detail on this.
+
+00:22:34.080 --> 00:22:37.680
+ But there's an ES5 class that represents an org mode
+
+00:22:37.680 --> 00:22:38.920
+ document.
+
+00:22:38.920 --> 00:22:42.260
+ It has the static debug property that, as you might imagine
+
+00:22:42.260 --> 00:22:42.400
+,
+
+00:22:42.400 --> 00:22:45.480
+ can be overridden by that debug setting
+
+00:22:45.480 --> 00:22:48.440
+ we looked at in the defaults.
+
+00:22:48.440 --> 00:22:51.440
+ We also have a static variable that--
+
+00:22:51.440 --> 00:22:57.440
+ a static property that does nothing more than getting
+
+00:22:57.440 --> 00:23:00.360
+ the path to emacs out of those defaults.
+
+00:23:00.360 --> 00:23:02.120
+ Similarly, we have a class method
+
+00:23:02.120 --> 00:23:09.520
+ to spawn out an emacs, as I mentioned, in batch mode,
+
+00:23:09.520 --> 00:23:12.720
+ eval-ing some arbitrary list that's passed in.
+
+00:23:12.720 --> 00:23:20.480
+ All right, so the type--
+
+00:23:20.480 --> 00:23:23.080
+ this is where things start to get interesting.
+
+00:23:23.080 --> 00:23:26.480
+ So this is an implementation detail,
+
+00:23:26.480 --> 00:23:30.040
+ but-- that it's written as a static method.
+
+00:23:30.040 --> 00:23:32.160
+ But essentially, what's going on here
+
+00:23:32.160 --> 00:23:34.840
+ is looking up from that type list
+
+00:23:34.840 --> 00:23:37.480
+ to try to find a type that's passed in,
+
+00:23:37.480 --> 00:23:41.240
+ and that's returning one of these blocks.
+
+00:23:41.240 --> 00:23:44.800
+ Let's say I requested HTML, which would be the default.
+
+00:23:44.800 --> 00:23:48.760
+ Then I'm going to get this set of properties back.
+
+00:23:50.760 --> 00:23:50.760
+
+
+00:23:50.760 --> 00:23:51.260
+ All right.
+
+00:23:51.260 --> 00:24:04.200
+ Essentially, this program generates a program
+
+00:24:04.200 --> 00:24:10.840
+ or a little block of executable elisp.
+
+00:24:10.840 --> 00:24:15.920
+ However, in some cases, where if the load path has
+
+00:24:15.920 --> 00:24:20.920
+ been customized in that type block,
+
+00:24:20.920 --> 00:24:25.000
+ or I think that's the only case I supported.
+
+00:24:25.000 --> 00:24:28.960
+ There was another complexity I removed.
+
+00:24:28.960 --> 00:24:32.000
+ So in that case, then I can simply
+
+00:24:32.000 --> 00:24:33.560
+ replace that program with a let.
+
+00:24:33.560 --> 00:24:41.680
+ Either way, I'm going to have everything I generate
+
+00:24:41.680 --> 00:24:45.840
+ be encapsulated in a single block.
+
+00:24:45.840 --> 00:24:49.240
+ The-- then I'm calling that format list process
+
+00:24:49.240 --> 00:24:52.760
+ that we talked about, appending to that--
+
+00:24:52.760 --> 00:25:01.680
+ or inserting into, you could say, the outer scope.
+
+00:25:01.680 --> 00:25:05.000
+ And we start by finding the file.
+
+00:25:05.000 --> 00:25:11.400
+ We then load any libraries that might be needed.
+
+00:25:11.400 --> 00:25:13.520
+ In some cases, the type might not
+
+00:25:13.520 --> 00:25:15.160
+ have any external libraries.
+
+00:25:15.160 --> 00:25:18.440
+ So we just-- so that's a no op.
+
+00:25:18.440 --> 00:25:24.120
+ And then finally, we're going to execute
+
+00:25:24.120 --> 00:25:27.160
+ that logic I mentioned before about selecting
+
+00:25:27.160 --> 00:25:30.160
+ either the default or export to file,
+
+00:25:30.160 --> 00:25:36.200
+ or else whatever elisp we've staged for exporting
+
+00:25:36.200 --> 00:25:38.160
+ that particular file type.
+
+00:25:38.160 --> 00:25:41.480
+ And again, in the case of PDF, there's
+
+00:25:41.480 --> 00:25:46.240
+ a special function that's used to trigger that export.
+
+00:25:46.240 --> 00:25:49.160
+ Or you may be aware that that's a little more complicated.
+
+00:25:49.160 --> 00:25:50.840
+ There's intermediate forms there.
+
+00:25:50.840 --> 00:25:56.760
+ All right.
+
+00:25:56.760 --> 00:26:01.320
+ So just reminding myself if there's anything else
+
+00:26:01.320 --> 00:26:03.760
+ I have to cover on background.
+
+00:26:03.760 --> 00:26:07.440
+ And I think that pretty well covers the basics.
+
+00:26:07.440 --> 00:26:09.880
+ All right, let's look at that source block execute.
+
+00:26:09.880 --> 00:26:14.600
+ This is the other use of the format list function.
+
+00:26:14.600 --> 00:26:16.800
+ So here, rather than looking at the type
+
+00:26:16.800 --> 00:26:24.720
+ and passing that through our org export method,
+
+00:26:24.720 --> 00:26:29.080
+ and then that type is used to get the list
+
+00:26:29.080 --> 00:26:30.840
+ that we want to create.
+
+00:26:30.840 --> 00:26:37.600
+ In the case of source block execute,
+
+00:26:37.600 --> 00:26:40.520
+ we're kind of rolling it a lot more by hand.
+
+00:26:40.520 --> 00:26:43.920
+ So this gives us a good chance to sort of unwind
+
+00:26:43.920 --> 00:26:49.600
+ how that list looks when it's staged as JavaScript data.
+
+00:26:49.600 --> 00:26:52.760
+ So here again, I wrap everything in a progon.
+
+00:26:52.760 --> 00:26:58.480
+ I start by preventing an interactive prompt
+
+00:26:58.480 --> 00:27:01.240
+ for the Babel execution.
+
+00:27:01.240 --> 00:27:04.960
+ And then we load languages.
+
+00:27:04.960 --> 00:27:12.240
+ This relates to another piece of our configuration
+
+00:27:12.240 --> 00:27:17.600
+ where we've specified a set of languages
+
+00:27:17.600 --> 00:27:19.920
+ that it's OK to execute.
+
+00:27:19.920 --> 00:27:24.120
+ So if that type isn't in this list,
+
+00:27:24.120 --> 00:27:28.800
+ then we won't be able to execute it in line
+
+00:27:28.800 --> 00:27:32.720
+ through our trivial little web server.
+
+00:27:32.720 --> 00:27:33.640
+ All right.
+
+00:27:33.640 --> 00:27:40.600
+ With that done, then, loading the selected language,
+
+00:27:40.600 --> 00:27:43.960
+ we then once again open the file.
+
+00:27:43.960 --> 00:27:46.360
+ And we're-- whoops.
+
+00:27:46.360 --> 00:27:51.800
+ Let bind a return value, which is
+
+00:27:51.800 --> 00:27:55.840
+ calculated by using org source block execute on the name
+
+00:27:55.840 --> 00:27:58.040
+ of the block that's given.
+
+00:27:58.040 --> 00:28:05.160
+ And then we use a temp buffer to write that out
+
+00:28:05.160 --> 00:28:06.640
+ to a temporary file.
+
+00:28:06.640 --> 00:28:08.440
+ This is actually a little clumsy,
+
+00:28:08.440 --> 00:28:12.720
+ but I haven't put the effort in to have this written out
+
+00:28:12.720 --> 00:28:17.480
+ to the standard output cleanly instead of using a temp file
+
+00:28:17.480 --> 00:28:17.840
+.
+
+00:28:17.840 --> 00:28:20.480
+ So under-- this is another example of where it may not
+
+00:28:20.480 --> 00:28:22.520
+ be production-- well, it definitely
+
+00:28:22.520 --> 00:28:27.680
+ is not production-worthy code in that under heavy load,
+
+00:28:27.680 --> 00:28:30.860
+ this would certainly break with collisions on the Babel
+
+00:28:30.860 --> 00:28:32.040
+ file,
+
+00:28:32.040 --> 00:28:34.120
+ the name of the Babel file.
+
+00:28:34.120 --> 00:28:37.480
+ In any case, once we've staged up our ELISP, which is--
+
+00:28:37.480 --> 00:28:42.560
+ this is basically variable interpolation,
+
+00:28:42.560 --> 00:28:47.680
+ then we just call emacs on that.
+
+00:28:47.680 --> 00:28:49.720
+ And if we look down to where that's called,
+
+00:28:49.720 --> 00:28:54.640
+ you can see that the org Babel file name calculated here.
+
+00:28:54.640 --> 00:28:58.040
+ [AUDIO OUT]
+
+00:28:58.040 --> 00:29:15.000
+ Is there a problem?
+
+00:29:15.000 --> 00:29:15.760
+ No, I'm fine.
+
+00:29:15.760 --> 00:29:18.000
+ I'm just lost in my code.
+
+00:29:18.000 --> 00:29:19.040
+ OK, cool.
+
+00:29:19.040 --> 00:29:21.160
+ Oh, means, oh, I need to intervene.
+
+00:29:21.160 --> 00:29:22.240
+ What is going on?
+
+00:29:22.240 --> 00:29:23.200
+ Carry on, please.
+
+00:29:23.200 --> 00:29:24.120
+ No, I'm fine, Leo.
+
+00:29:24.120 --> 00:29:25.480
+ Thank you.
+
+00:29:25.480 --> 00:29:27.280
+ All right, so then--
+
+00:29:27.280 --> 00:29:28.680
+ so you can see we get--
+
+00:29:28.680 --> 00:29:36.720
+ we send the Babel file here, which
+
+00:29:36.720 --> 00:29:41.640
+ is calculated manually.
+
+00:29:41.640 --> 00:29:45.440
+ A bit sloppy there, since I have essentially the same--
+
+00:29:45.440 --> 00:29:47.000
+ I have two different places where
+
+00:29:47.000 --> 00:29:52.480
+ I'm calculating the org doc file in two different ways.
+
+00:29:52.480 --> 00:29:54.720
+ Have I encouraged you to write your own yet?
+
+00:29:54.720 --> 00:29:56.440
+ Or send patches.
+
+00:29:56.440 --> 00:30:01.240
+ All right, so that's pretty much the nuts and bolts
+
+00:30:01.240 --> 00:30:02.400
+ of this program.
+
+00:30:02.400 --> 00:30:06.720
+ Let's go back to just seeing if we can't make it run.
+
+00:30:22.120 --> 00:30:22.620
+ All right.
+
+00:30:22.620 --> 00:30:45.880
+ All right, well, I apologize for not
+
+00:30:45.880 --> 00:30:49.560
+ having taken the time to stage my demo this morning.
+
+00:30:49.560 --> 00:30:52.680
+ I'm going to try to make it better for you.
+
+00:30:52.680 --> 00:30:59.920
+ But apparently, it's going to be non-trivial
+
+00:30:59.920 --> 00:31:04.520
+ to make the program work.
+
+00:31:04.520 --> 00:31:07.160
+ Let's just-- before I completely give up,
+
+00:31:07.160 --> 00:31:13.320
+ let's go ahead and try our Babel execute.
+
+00:31:13.320 --> 00:31:14.800
+ And that, too, is failing.
+
+00:31:14.800 --> 00:31:18.040
+ So there's something unhappy in my local world.
+
+00:31:18.040 --> 00:31:19.040
+ There it goes.
+
+00:31:19.040 --> 00:31:26.600
+ But in any case, let's go ahead and just take a look at
+
+00:31:26.600 --> 00:31:28.000
+ that.
+
+00:31:28.000 --> 00:31:30.640
+ Let's see.
+
+00:31:30.640 --> 00:31:31.600
+ Control Enter.
+
+00:31:31.600 --> 00:31:40.200
+ Let's take a look at that generated ELS
+
+00:31:40.200 --> 00:31:42.840
+ and compare it to-- whoa--
+
+00:31:42.840 --> 00:31:44.000
+ and compare it to--
+
+00:31:44.000 --> 00:31:52.400
+ I'm just going to format this manually,
+
+00:31:52.400 --> 00:31:56.000
+ because I've forgotten my key bindings to auto-format it.
+
+00:31:56.000 --> 00:32:02.240
+ There we go.
+
+00:32:02.240 --> 00:32:07.960
+ All right.
+
+00:32:07.960 --> 00:32:13.120
+ So now we can see, as promised, there's really
+
+00:32:13.120 --> 00:32:16.200
+ nothing going on here other than the interpolation
+
+00:32:16.200 --> 00:32:18.640
+ of the variables in.
+
+00:32:18.640 --> 00:32:24.360
+ We're inserting-- we're using an insert and write file
+
+00:32:24.360 --> 00:32:27.800
+ method, which is, again, rather sloppy,
+
+00:32:27.800 --> 00:32:32.040
+ to generate the text file.
+
+00:32:32.040 --> 00:32:32.880
+ All right.
+
+00:32:32.880 --> 00:32:34.760
+ Let's come back to our documentation
+
+00:32:34.760 --> 00:32:39.760
+ and see if we can put a bow on the project.
+
+00:32:39.760 --> 00:32:43.760
+ So I hope I've convinced you that this was actually
+
+00:32:43.760 --> 00:32:45.480
+ rather easy to do.
+
+00:32:45.480 --> 00:32:52.440
+ The entirety of my index.js file is 262 lines,
+
+00:32:52.440 --> 00:32:59.810
+ and that includes a good 40 of whitespace and configuration
+
+00:32:59.810 --> 00:33:00.280
+.
+
+00:33:03.760 --> 00:33:06.840
+ It has only one dependency, the Express, which
+
+00:33:06.840 --> 00:33:08.240
+ really builds the web server.
+
+00:33:08.240 --> 00:33:11.520
+ Any language you'd rather implement this in
+
+00:33:11.520 --> 00:33:14.120
+ will have a similar capability for building
+
+00:33:14.120 --> 00:33:16.280
+ some type of trivial web server.
+
+00:33:16.280 --> 00:33:18.400
+ And I think you may find--
+
+00:33:18.400 --> 00:33:22.640
+ I certainly found that a large portion of the code base
+
+00:33:22.640 --> 00:33:28.080
+ is really making the errors meaningful,
+
+00:33:28.080 --> 00:33:32.420
+ in that, in some cases, sending an appropriate HTTP status
+
+00:33:32.420 --> 00:33:34.360
+ based on what happened.
+
+00:33:34.360 --> 00:33:41.160
+ In other cases-- let's see if I've got an explicit throw
+
+00:33:41.160 --> 00:33:41.520
+ left
+
+00:33:41.520 --> 00:33:42.640
+ in here--
+
+00:33:42.640 --> 00:33:45.840
+ in other cases, just trapping different types
+
+00:33:45.840 --> 00:33:47.440
+ of failure conditions.
+
+00:33:47.440 --> 00:33:54.000
+ I'm going to look at my pad, and I do see a question here.
+
+00:33:54.000 --> 00:33:55.120
+ So let me jump in here.
+
+00:33:55.120 --> 00:33:58.880
+ [VIDEO PLAYBACK]
+
+00:33:58.880 --> 00:34:00.640
+ - Cohen, just to make sure, are you switching to Q&A?
+
+00:34:00.640 --> 00:34:02.380
+ Are you finished with your presentation?
+
+00:34:02.380 --> 00:34:05.260
+ - Well, as I said, I'm happy to take Q&A throughout.
+
+00:34:05.260 --> 00:34:08.420
+ But yes, let's say yes to that.
+
+00:34:08.420 --> 00:34:10.900
+ - OK, so Cohen, what I'm going to need to do now--
+
+00:34:10.900 --> 00:34:12.140
+ you are in charge of the room.
+
+00:34:12.140 --> 00:34:14.060
+ We are going to open up the room so
+
+00:34:14.060 --> 00:34:17.220
+ that if people have questions watching right now on Gen,
+
+00:34:17.220 --> 00:34:18.700
+ feel free to come in.
+
+00:34:18.700 --> 00:34:22.780
+ And there was something else I needed to say.
+
+00:34:22.780 --> 00:34:24.620
+ Yes, Cohen, if there's any problem,
+
+00:34:24.620 --> 00:34:25.700
+ whisper to us on Mumble.
+
+00:34:25.700 --> 00:34:27.500
+ So you might want to unmute Mumble
+
+00:34:27.500 --> 00:34:29.620
+ and be able to listen to us over there.
+
+00:34:29.620 --> 00:34:32.480
+ - I can't do that, Leo.
+
+00:34:32.480 --> 00:34:36.440
+ If I unmute, Mumble is going to bleed through.
+
+00:34:36.440 --> 00:34:36.960
+ - OK, sure.
+
+00:34:36.960 --> 00:34:41.160
+ Well, if you have any problem, type in emacsconf-org.ch
+
+00:34:41.160 --> 00:34:41.160
+annel,
+
+00:34:41.160 --> 00:34:42.520
+ and we'll be with you, OK?
+
+00:34:42.520 --> 00:34:43.520
+ - Or I'll PM somebody.
+
+00:34:43.520 --> 00:34:45.760
+ But I don't anticipate having any problems.
+
+00:34:45.760 --> 00:34:49.040
+ I'll put something in org when I run out of steam here.
+
+00:34:49.040 --> 00:34:50.400
+ How's that?
+
+00:34:50.400 --> 00:34:51.160
+ - Amazing, cool.
+
+00:34:51.160 --> 00:34:53.320
+ So I will have to leave the room, though.
+
+00:34:53.320 --> 00:34:56.800
+ I'm leaving the recording going so that we have your Q&A.
+
+00:34:56.800 --> 00:34:58.080
+ And whenever you're available--
+
+00:34:58.080 --> 00:35:02.180
+ - I'll shut off the recording when I close the room.
+
+00:35:02.180 --> 00:35:02.980
+ - OK, great.
+
+00:35:02.980 --> 00:35:04.460
+ Good luck, Cohen.
+
+00:35:04.460 --> 00:35:06.500
+ - Thank you.
+
+00:35:06.500 --> 00:35:09.780
+ All right, and if you're still with me, well, thanks.
+
+00:35:09.780 --> 00:35:13.620
+ I appreciate that.
+
+00:35:13.620 --> 00:35:16.740
+ I did offer to be opposite RMS.
+
+00:35:16.740 --> 00:35:20.060
+ And I'm in no way offended if people do want to jump over,
+
+00:35:20.060 --> 00:35:23.540
+ especially as that starts to shift over to Q&A.
+
+00:35:23.540 --> 00:35:26.980
+ I'm taking Leo's leaving as a pretty good indication
+
+00:35:26.980 --> 00:35:28.780
+ that that's happening now-ish.
+
+00:35:28.780 --> 00:35:34.750
+ So I totally understand if folks are more excited to do
+
+00:35:34.750 --> 00:35:35.020
+ that.
+
+00:35:35.020 --> 00:35:37.940
+ Meanwhile, let me just jump over to the question
+
+00:35:37.940 --> 00:35:38.660
+ that I received.
+
+00:35:38.660 --> 00:35:46.460
+ I'll show the pad here so that I save myself
+
+00:35:46.460 --> 00:35:47.860
+ reading the question out.
+
+00:35:47.860 --> 00:35:48.940
+ But I'll paraphrase it.
+
+00:35:48.940 --> 00:35:52.660
+ Why am I not running the web server in emacs?
+
+00:35:52.660 --> 00:35:54.380
+ That would be a great way to do it.
+
+00:35:54.380 --> 00:35:57.100
+ I chose to build it in Node.js because that
+
+00:35:57.100 --> 00:35:58.460
+ was trivially easy for me.
+
+00:36:22.140 --> 00:36:24.780
+ And then finally, am I using org info.js?
+
+00:36:24.780 --> 00:36:27.540
+ No, I learned about this essentially at this conference.
+
+00:36:27.540 --> 00:36:30.660
+ So that's something I'll be learning more about.
+
+00:36:30.660 --> 00:36:32.460
+ And it could well influence this project.
+
+00:36:32.460 --> 00:36:34.900
+ [TYPING]
+
+00:36:34.900 --> 00:36:56.180
+ All right, and thanks for the questions.
+
+00:36:59.020 --> 00:37:02.820
+ All right, I'm going to slow my roll just a little bit here
+
+00:37:02.820 --> 00:37:06.980
+ because I think I kind of have all the time in the world.
+
+00:37:06.980 --> 00:37:11.540
+ I will be wrapping up within about 15 or 20 minutes
+
+00:37:11.540 --> 00:37:15.620
+ at the latest just to avoid stressing out
+
+00:37:15.620 --> 00:37:19.100
+ my fellow organizers, especially Leo and Sasha that
+
+00:37:19.100 --> 00:37:22.260
+ have the bulk of the heavy lifting this year.
+
+00:37:22.260 --> 00:37:26.820
+ And amen, and really, thanks all to everybody.
+
+00:37:26.820 --> 00:37:29.540
+ God, the nicest part of doing my own talk
+
+00:37:29.540 --> 00:37:31.980
+ is that I get to say that.
+
+00:37:31.980 --> 00:37:35.460
+ It's just so much fun to contribute to emacsConf.
+
+00:37:35.460 --> 00:37:38.740
+ And if you're at all interested, there's
+
+00:37:38.740 --> 00:37:43.100
+ plenty of completely backstage, behind the curtain role.
+
+00:37:43.100 --> 00:37:45.340
+ Behind the curtain roles doesn't mean
+
+00:37:45.340 --> 00:37:49.020
+ you have to be somebody that likes talking or being
+
+00:37:49.020 --> 00:37:50.060
+ on webcam.
+
+00:37:50.060 --> 00:37:52.300
+ Sorry that my camera isn't working this year.
+
+00:37:52.300 --> 00:37:53.980
+ I spent quite a while fussing with that
+
+00:37:53.980 --> 00:37:56.740
+ and lost all my time to get my prereq working.
+
+00:37:56.740 --> 00:38:10.140
+ All right, so trying to think where I can take us
+
+00:38:10.140 --> 00:38:11.540
+ without my demo working.
+
+00:38:11.540 --> 00:38:14.540
+ I was really hoping to show the org Babel piece.
+
+00:38:14.540 --> 00:38:15.580
+ That's really fun.
+
+00:38:15.580 --> 00:38:20.420
+ So let me just mention briefly how I'm using this at work.
+
+00:38:20.420 --> 00:38:25.980
+ So at work, I'll have some type of org document.
+
+00:38:25.980 --> 00:38:27.700
+ And usually, it's a project.
+
+00:38:27.700 --> 00:38:32.900
+ So the title of the document is My Project.
+
+00:38:32.900 --> 00:38:37.820
+ And then I'll have a requirements section.
+
+00:38:37.820 --> 00:38:43.540
+ And I'll have a meeting notes section.
+
+00:38:43.540 --> 00:38:44.980
+ That's probably the key thing.
+
+00:38:44.980 --> 00:38:49.540
+ And then as the project goes on, I'll start having--
+
+00:38:49.540 --> 00:38:50.740
+ I'm a solutions architect.
+
+00:38:50.740 --> 00:38:55.420
+ So my job is formalizing design in large part.
+
+00:38:55.420 --> 00:39:01.740
+ So then I'll have a design documents section.
+
+00:39:01.740 --> 00:39:05.020
+ And this is where I'll be doing a lot of my work.
+
+00:39:05.020 --> 00:39:07.220
+ So I'll start out saying--
+
+00:39:07.220 --> 00:39:26.620
+ [AUDIO OUT]
+
+00:39:26.620 --> 00:39:29.340
+ And maybe Bob is a subject matter expert
+
+00:39:29.340 --> 00:39:32.460
+ whose buy-in I need to have on how we're going
+
+00:39:32.460 --> 00:39:34.820
+ to do the high-level design.
+
+00:39:34.820 --> 00:39:38.470
+ Maybe a lead engineer or a dev manager or something like
+
+00:39:38.470 --> 00:39:39.460
+ that.
+
+00:39:39.460 --> 00:39:43.580
+ All right, as my work goes on, then this
+
+00:39:43.580 --> 00:39:47.620
+ will start getting into more detail.
+
+00:39:47.620 --> 00:40:16.620
+ [AUDIO OUT]
+
+00:40:16.620 --> 00:40:18.660
+ And things of this nature.
+
+00:40:18.660 --> 00:40:20.180
+ As things get further and further,
+
+00:40:20.180 --> 00:40:21.740
+ I'll actually have documentation
+
+00:40:21.740 --> 00:40:22.820
+ that I'm adding in here.
+
+00:40:22.820 --> 00:40:28.900
+ Oh, I see.
+
+00:40:28.900 --> 00:40:29.740
+ It's a big mess.
+
+00:40:29.740 --> 00:40:32.140
+ All right, well, we'll just reuse this.
+
+00:40:32.140 --> 00:40:40.380
+ So I can insert those all in line.
+
+00:40:40.380 --> 00:40:44.140
+ And now for the fun part, let's see if the most trivial
+
+00:40:44.140 --> 00:40:44.460
+ case
+
+00:40:44.460 --> 00:40:45.460
+ is working here.
+
+00:40:47.460 --> 00:40:47.460
+
+
+00:40:47.460 --> 00:40:49.940
+ [CLICK]
+
+00:40:49.940 --> 00:40:51.180
+ No.
+
+00:40:51.180 --> 00:40:52.900
+ All right, completely broken.
+
+00:40:52.900 --> 00:40:57.260
+ Let me drag.
+
+00:40:57.260 --> 00:41:05.180
+ All right, well, apologies again for the poor quality
+
+00:41:05.180 --> 00:41:06.260
+ of my demo today.
+
+00:41:06.260 --> 00:41:13.900
+ And let me just look real quick at my Etherpad once more.
+
+00:41:13.900 --> 00:41:16.820
+ And I'll glance at BBB to see if there's anybody
+
+00:41:16.820 --> 00:41:18.140
+ jumping in with questions.
+
+00:41:18.140 --> 00:41:23.740
+ And then I'll go back to IRC and look for questions there.
+
+00:41:23.740 --> 00:41:33.180
+ OK, and I don't see any additional questions on the pad.
+
+00:41:33.180 --> 00:41:35.780
+ I'm just going to scan IRC real quick.
+
+00:41:35.780 --> 00:41:42.460
+ I suspect that the TreeSitter comment isn't for me.
+
+00:41:42.460 --> 00:41:44.900
+ [CHUCKLES]
+
+00:41:44.900 --> 00:41:56.620
+ All right, and I'm not seeing a lot of questions there.
+
+00:41:56.620 --> 00:42:04.340
+ So I'm just going to vamp for just a minute or two.
+
+00:42:04.340 --> 00:42:07.980
+ As I mentioned, I'm a conference volunteer.
+
+00:42:07.980 --> 00:42:09.700
+ This is my third year volunteering
+
+00:42:09.700 --> 00:42:11.940
+ with the conference.
+
+00:42:11.940 --> 00:42:15.140
+ And probably if you take one thing away from my talk,
+
+00:42:15.140 --> 00:42:17.740
+ it should be I really like volunteering
+
+00:42:17.740 --> 00:42:18.500
+ for the conference.
+
+00:42:18.500 --> 00:42:19.900
+ It's fun.
+
+00:42:19.900 --> 00:42:23.500
+ It makes me feel sort of close to the pulse.
+
+00:42:23.500 --> 00:42:26.660
+ And it gives me a chance to just interact
+
+00:42:26.660 --> 00:42:29.260
+ with people that have very different perspectives
+
+00:42:29.260 --> 00:42:32.740
+ on Emacs, which is something that I really value a lot.
+
+00:42:32.740 --> 00:42:40.220
+ Emacs, like anything else sort of in the internet world,
+
+00:42:40.220 --> 00:42:42.940
+ has a real echo chamber factor.
+
+00:42:42.940 --> 00:42:47.660
+ If you do or don't use Package, you probably
+
+00:42:47.660 --> 00:42:49.380
+ interact with a lot of people that
+
+00:42:49.380 --> 00:42:53.500
+ feel the same way about that.
+
+00:42:53.500 --> 00:42:57.420
+ And so I really recommend volunteering for EmacsConf
+
+00:42:57.420 --> 00:43:01.340
+ as a way to sort of mix it up and get
+
+00:43:01.340 --> 00:43:05.250
+ to know people that may not use Emacs the same way that you
+
+00:43:05.250 --> 00:43:05.540
+ do.
+
+00:43:08.380 --> 00:43:10.420
+ Or perhaps more on topic, though,
+
+00:43:10.420 --> 00:43:14.300
+ the log line for this talk is it's really quite easy
+
+00:43:14.300 --> 00:43:20.760
+ to build a program that uses Emacs in a pipeline capability
+
+00:43:20.760 --> 00:43:20.980
+.
+
+00:43:20.980 --> 00:43:23.780
+ I think there's a ton of opportunity in this space.
+
+00:43:23.780 --> 00:43:27.700
+ This particular example is just a trivial web server
+
+00:43:27.700 --> 00:43:29.540
+ written
+
+00:43:29.540 --> 00:43:30.780
+ using Node.js.
+
+00:43:30.780 --> 00:43:39.660
+ But as was pointed out, we could have used LNode as a web
+
+00:43:39.660 --> 00:43:40.060
+ server
+
+00:43:40.060 --> 00:43:44.060
+ and done the entire thing within Emacs Lisp.
+
+00:43:44.060 --> 00:43:49.980
+ Or really, almost any technology would get us this
+
+00:43:49.980 --> 00:43:52.900
+ capability.
+
+00:43:52.900 --> 00:43:54.660
+ From an implementation standpoint,
+
+00:43:54.660 --> 00:43:59.270
+ I had a lot of fun building this trivial little e-lisp pars
+
+00:43:59.270 --> 00:43:59.580
+er.
+
+00:43:59.580 --> 00:44:03.220
+ And I'm rather pleased with the fact
+
+00:44:03.220 --> 00:44:07.340
+ that the entirety of that--
+
+00:44:07.340 --> 00:44:14.180
+ the entire algorithm for turning JavaScript or JSON data,
+
+00:44:14.180 --> 00:44:20.420
+ we could say, into e-lisp is really a one-liner.
+
+00:44:20.420 --> 00:44:25.820
+ Albeit a nasty one-liner, that was pretty cool
+
+00:44:25.820 --> 00:44:28.180
+ to discover how simple that was.
+
+00:44:28.180 --> 00:44:31.220
+ So in my mind, that opens up a lot of possibility.
+
+00:44:31.220 --> 00:44:32.940
+ If it's this easy in JavaScript, I
+
+00:44:32.940 --> 00:44:35.700
+ wouldn't expect it to be hard, any more difficult
+
+00:44:35.700 --> 00:44:36.860
+ in your favorite language.
+
+00:44:36.860 --> 00:44:41.140
+ Glance one more time to see if there
+
+00:44:41.140 --> 00:44:42.940
+ happen to be any other questions.
+
+00:44:42.940 --> 00:44:47.300
+ And not seeing any, I'm going to go ahead and start
+
+00:44:47.300 --> 00:44:49.500
+ wrapping up my chat now.
+
+00:44:49.500 --> 00:44:51.620
+ It will take me a couple of minutes to do that.
+
+00:44:51.620 --> 00:44:54.580
+ So if you do have any other questions that you
+
+00:44:54.580 --> 00:44:56.460
+ want to drop into the pad or any comments,
+
+00:44:56.460 --> 00:44:59.740
+ you're more than welcome to hit me with those
+
+00:44:59.740 --> 00:45:03.820
+ as I coordinate closing this chat, this talk,
+
+00:45:03.820 --> 00:45:06.100
+ with the organizer team.
+
+00:45:06.100 --> 00:45:09.580
+ [AUDIO OUT]
+
+00:45:09.580 --> 00:45:12.580
+ [AUDIO OUT]
+
+00:45:14.580 --> 00:45:14.580
+
+
+00:45:14.580 --> 00:45:17.580
+ [AUDIO OUT]
+
+00:45:17.580 --> 00:45:20.580
+ [AUDIO OUT]
+
+00:45:22.580 --> 00:45:22.580
+
+
+00:45:22.580 --> 00:45:25.580
+ [AUDIO OUT]
+
+00:45:25.580 --> 00:45:33.580
+ [AUDIO OUT]
+
+00:45:33.580 --> 00:45:44.580
+ [AUDIO OUT]
+
+00:45:44.580 --> 00:45:47.620
+ [AUDIO OUT]
+
+00:45:47.620 --> 00:45:50.620
+ [AUDIO OUT]
+
+00:45:50.620 --> 00:45:53.620
+ [AUDIO OUT]
+
+00:45:53.620 --> 00:45:56.620
+ [AUDIO OUT]
+
+00:45:56.620 --> 00:45:59.620
+ [AUDIO OUT]
+
+00:46:01.620 --> 00:46:01.620
+
+
+00:46:01.620 --> 00:46:04.620
+ [AUDIO OUT]
+
diff --git a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt
new file mode 100644
index 00000000..b1835675
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt
@@ -0,0 +1,80 @@
+WEBVTT
+
+
+00:00:36.000 --> 00:01:31.080
+Introduction
+
+00:01:31.080 --> 00:02:01.880
+What is orgvm?
+
+00:02:01.880 --> 00:02:49.560
+Nodejs
+
+00:02:49.560 --> 00:03:38.320
+The itch I was trying to scratch
+
+00:03:38.320 --> 00:05:29.760
+Demo
+
+00:05:29.760 --> 00:06:24.920
+Needs a relatively recent version of Emacs
+
+00:06:24.920 --> 00:08:13.520
+Usage patterns
+
+00:08:13.520 --> 00:09:09.160
+Emacs Lisp
+
+00:09:09.160 --> 00:10:38.720
+Variables
+
+00:10:38.720 --> 00:11:17.200
+Replace
+
+00:11:19.120 --> 00:13:06.480
+Getting into the code some more
+
+00:13:06.480 --> 00:13:37.320
+Generating Elisp
+
+00:13:37.320 --> 00:14:32.400
+Org blocks
+
+00:14:32.400 --> 00:16:43.000
+Building some Lisp
+
+00:16:43.000 --> 00:19:25.040
+How Elisp gets encoded
+
+00:19:25.040 --> 00:22:09.860
+How the export works
+
+00:22:09.860 --> 00:26:07.440
+Walking through the code
+
+00:26:07.440 --> 00:32:39.760
+Executing the source block
+
+00:32:39.760 --> 00:33:55.120
+Conclusion
+
+00:33:58.880 --> 00:35:48.940
+Questions and answers
+
+00:35:48.940 --> 00:35:58.460
+Why am I not running the web server in Emacs?
+
+00:36:22.140 --> 00:37:35.460
+Is this using org-info-js?
+
+00:37:35.460 --> 00:38:15.580
+EmacsConf
+
+00:38:15.580 --> 00:42:04.340
+How I'm using this at work
+
+00:42:04.340 --> 00:43:05.540
+Volunteering for EmacsConf
+
+00:43:08.380 --> 00:45:06.100
+It's easy to build a program that uses Emacs in the pipeline
diff --git a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt
new file mode 100644
index 00000000..7ee7fca6
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt
@@ -0,0 +1,2258 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:36.000 --> 00:00:42.480
+And so this little application--
+
+00:00:42.480 --> 00:00:42.503
+well, I'll skip that and just kind of
+
+00:00:42.504 --> 00:00:49.142
+jump right into my thesis for those of you
+
+00:00:49.143 --> 00:00:53.360
+that might be planning to duck out for the RMS talk,
+
+00:00:53.360 --> 00:00:55.520
+starting in a little bit.
+
+00:00:55.520 --> 00:00:55.545
+So essentially, my thesis here is really that
+
+00:00:55.546 --> 00:00:59.378
+the Emacs toolchain can easily be combined
+
+00:00:59.379 --> 00:01:08.793
+with other skills and used in kind of
+
+00:01:08.794 --> 00:01:13.280
+a Unix paradigm of having sort of different tools
+
+00:01:13.280 --> 00:01:14.960
+to do different steps.
+
+00:01:14.960 --> 00:01:17.760
+We might actually use the same tool
+
+00:01:17.760 --> 00:01:19.240
+to implement a couple of steps.
+
+00:01:19.240 --> 00:01:22.080
+But with that paradigm, each step
+
+00:01:22.080 --> 00:01:22.086
+is an individual item that can be sort of
+
+00:01:22.087 --> 00:01:26.400
+dropped in and replaced.
+
+00:01:26.400 --> 00:01:26.420
+So over the course of the talk,
+
+00:01:26.421 --> 00:01:31.080
+hopefully I'll come back to that thesis.
+
+NOTE What is orgvm?
+
+00:01:31.080 --> 00:01:31.086
+But I'll now jump back and start walking through
+
+00:01:31.087 --> 00:01:37.040
+what is orgvm?
+
+00:01:37.040 --> 00:01:39.560
+So this is a very simple proof of concept program.
+
+00:01:39.560 --> 00:01:39.586
+We'll just jump over to perhaps
+
+00:01:39.587 --> 00:01:45.520
+a prettier view of the source code for it.
+
+00:01:45.520 --> 00:01:49.200
+This is implemented-- oops.
+
+00:01:49.200 --> 00:01:53.160
+There's some cruft, I think, in my local.
+
+00:01:53.160 --> 00:01:56.560
+All right, so this config block at the top...
+
+00:01:56.560 --> 00:01:58.120
+And we'll be jumping back and forth
+
+00:01:58.120 --> 00:02:01.880
+between the code and the documentation.
+
+NOTE Nodejs
+
+00:02:01.880 --> 00:02:04.080
+So the first thing I want to point out
+
+00:02:04.080 --> 00:02:05.960
+is that this is written in Node.js,
+
+00:02:05.960 --> 00:02:08.600
+but I think you'll find it'd be pretty trivial to implement
+
+00:02:08.600 --> 00:02:10.840
+in any language.
+
+00:02:10.840 --> 00:02:13.960
+Certainly, you're more than welcome to use this.
+
+00:02:13.960 --> 00:02:17.920
+I'd be happy to accept your patches or feature requests
+
+00:02:17.920 --> 00:02:20.080
+and things like that.
+
+00:02:20.080 --> 00:02:21.680
+Of course, bug reports.
+
+00:02:21.680 --> 00:02:25.760
+But I'd also encourage others to roll their own.
+
+00:02:25.760 --> 00:02:28.760
+You might well come up with a different version of this
+
+00:02:28.760 --> 00:02:29.600
+that's even cooler.
+
+00:02:29.600 --> 00:02:32.160
+And we can learn from each other.
+
+00:02:32.160 --> 00:02:34.200
+If you heard one of my talks before,
+
+00:02:34.200 --> 00:02:36.200
+you probably recognize a common theme.
+
+00:02:36.200 --> 00:02:40.320
+I'm a big fan of head-first development
+
+00:02:40.320 --> 00:02:40.336
+as a way to get invested in both
+
+00:02:40.337 --> 00:02:44.120
+the tool chain and a culture.
+
+00:02:44.120 --> 00:02:49.560
+All right, so let's come back to orgvm.
+
+NOTE The itch I was trying to scratch
+
+00:02:49.560 --> 00:02:49.586
+First of all, we'll start with
+
+00:02:49.587 --> 00:02:52.840
+the itch I was trying to scratch.
+
+00:02:52.840 --> 00:02:58.240
+I wanted to be able to quickly use a web browser
+
+00:02:58.240 --> 00:03:00.680
+to browse my Org documents.
+
+00:03:00.680 --> 00:03:01.420
+It's particularly handy when the documents
+
+00:03:01.421 --> 00:03:05.640
+are full of cross links to each other.
+
+00:03:05.640 --> 00:03:10.080
+That meant I wanted to automatically export,
+
+00:03:10.080 --> 00:03:12.280
+particularly to HTML.
+
+00:03:12.280 --> 00:03:17.280
+But it made sense for me to include Markdown, PDF,
+
+00:03:17.280 --> 00:03:18.880
+or whatever format I want.
+
+00:03:18.880 --> 00:03:22.760
+Because many times, I'm going to look at that file
+
+00:03:22.760 --> 00:03:29.480
+and then pop it into an email or upload it somewhere.
+
+00:03:29.480 --> 00:03:33.240
+And then finally, it should be, therefore,
+
+00:03:33.240 --> 00:03:33.753
+pretty easy to download the document
+
+00:03:33.754 --> 00:03:38.320
+rather than view it, once I'm done.
+
+NOTE Demo
+
+00:03:38.320 --> 00:03:42.200
+So let's just run a quick demo.
+
+00:03:42.200 --> 00:03:44.760
+You'll see I'm still a Windows user.
+
+00:03:44.760 --> 00:03:45.960
+Yeah, I'm working on it.
+
+00:03:45.960 --> 00:03:52.320
+So all right, first thing that we're going to do
+
+00:03:52.320 --> 00:03:53.320
+is fire up the program.
+
+00:03:53.320 --> 00:04:00.200
+Actually, for simplicity, let's just
+
+00:04:00.200 --> 00:04:01.760
+admit we live in a DOS world.
+
+00:04:01.760 --> 00:04:19.760
+And as you can see, there's not much to it
+
+00:04:19.760 --> 00:04:21.520
+to get the application running.
+
+00:04:22.680 --> 00:04:25.960
+So with that done, then, I can run out to my localhost.
+
+00:04:25.960 --> 00:04:36.780
+And we'll just start by plugging in the name of an Org file.
+
+00:04:37.560 --> 00:04:37.586
+So I've got a little Org file that I prepared
+
+00:04:37.587 --> 00:04:49.040
+that just kind of provides a proof of concept to this.
+
+00:04:49.040 --> 00:04:53.560
+And you can see, as imagined, we're automatically
+
+00:04:53.560 --> 00:04:54.640
+turning that Org file...
+
+00:04:54.640 --> 00:04:56.320
+Let's just take a quick look at it.
+
+00:04:56.320 --> 00:05:10.280
+And here's that file now.
+
+00:05:10.280 --> 00:05:11.960
+You can see, nothing up my sleeve.
+
+00:05:11.960 --> 00:05:11.961
+This is a very basic Org file
+
+00:05:11.962 --> 00:05:16.560
+that I use for testing this program.
+
+00:05:16.560 --> 00:05:17.640
+Images work.
+
+00:05:17.640 --> 00:05:21.836
+We've got some nicely syntax-highlighted code blocks
+
+00:05:21.837 --> 00:05:25.560
+in a couple different languages,
+
+00:05:25.560 --> 00:05:29.760
+and not really that much going on there.
+
+NOTE Needs a relatively recent version of Emacs
+
+00:05:29.760 --> 00:05:33.760
+All right, let's come back to the documentation.
+
+00:05:33.760 --> 00:05:36.680
+I pretty well covered this, I think.
+
+00:05:36.680 --> 00:05:39.720
+But you'll need a relatively recent version of Emacs.
+
+00:05:39.720 --> 00:05:43.640
+I haven't taken any pains to make this backward compatible.
+
+00:05:43.640 --> 00:05:46.000
+To be fair, I haven't tested it extensively.
+
+00:05:46.000 --> 00:05:50.320
+It may well work on Emacs 26 or older versions.
+
+00:05:50.320 --> 00:05:55.120
+I'm personally running 27.1 and 28,
+
+00:05:55.120 --> 00:05:57.080
+as well as recent builds of 29.
+
+00:05:57.080 --> 00:06:02.560
+There's some quick start instructions here,
+
+00:06:02.560 --> 00:06:03.900
+which I'm going to take as read.
+
+00:06:03.900 --> 00:06:08.600
+You probably saw the key element of this,
+
+00:06:08.601 --> 00:06:11.920
+which involves starting the program.
+
+00:06:11.920 --> 00:06:13.520
+You do-- I will call out Yale.
+
+00:06:13.520 --> 00:06:15.320
+If you're trying to play with this yourself,
+
+00:06:15.320 --> 00:06:20.080
+don't forget to run the npm install command.
+
+00:06:20.080 --> 00:06:20.086
+That'll bring in express.js,
+
+00:06:20.087 --> 00:06:24.920
+which the JavaScript we're about to look at is built on.
+
+NOTE Usage patterns
+
+00:06:24.920 --> 00:06:33.480
+So let's just take a look at the usage patterns real quick.
+
+00:06:33.480 --> 00:06:35.920
+To use this, we're simply giving the document name
+
+00:06:35.920 --> 00:06:42.760
+without the .org extension in whatever file path--
+
+00:06:42.760 --> 00:06:46.960
+or I'm sorry, whatever we've configured the server
+
+00:06:46.960 --> 00:06:50.800
+to run on, in this case, port 3000.
+
+00:06:50.800 --> 00:06:52.960
+I also want to call attention to the fact
+
+00:06:52.960 --> 00:06:55.880
+that nothing in this program protects you
+
+00:06:55.880 --> 00:06:57.240
+from damaging yourself.
+
+00:06:57.240 --> 00:07:00.560
+This isn't meant as a production capability.
+
+00:07:00.560 --> 00:07:00.586
+This is something that's used to publish
+
+00:07:00.587 --> 00:07:04.840
+your own note files
+
+00:07:04.840 --> 00:07:06.520
+and roll them out to yourself.
+
+00:07:06.520 --> 00:07:08.680
+That's something I'll definitely look at adding,
+
+00:07:08.680 --> 00:07:12.240
+but I want people to be careful of it
+
+00:07:12.240 --> 00:07:14.720
+while this is in an alpha state.
+
+00:07:14.720 --> 00:07:22.960
+So the default response is HTML, and we saw that here.
+
+00:07:22.960 --> 00:07:26.240
+But we also can modify the response format.
+
+00:07:26.240 --> 00:07:29.800
+We're currently supporting HTML, Markdown, and PDF.
+
+00:07:29.800 --> 00:07:34.280
+And that's really enough to select a different format.
+
+00:07:34.280 --> 00:07:48.040
+That's really nothing more than adding type. Okay.
+
+00:07:48.040 --> 00:07:50.680
+Not sure what's going on there.
+
+00:07:50.680 --> 00:07:57.080
+Okay, well, there goes my demo.
+
+00:07:57.080 --> 00:07:59.440
+Shows me for doing my talk live.
+
+00:08:03.920 --> 00:08:06.960
+But this, fortunately, this error message
+
+00:08:06.960 --> 00:08:08.840
+is a nice segue to the part of the talk
+
+00:08:08.840 --> 00:08:10.240
+that I'd really like to focus on,
+
+00:08:10.240 --> 00:08:13.520
+hopefully bringing me back to that thesis.
+
+NOTE Emacs Lisp
+
+00:08:13.520 --> 00:08:17.760
+So as we start to look at code, what we're looking for
+
+00:08:17.760 --> 00:08:21.640
+is really this Emacs Lisp that's getting generated here.
+
+00:08:21.640 --> 00:08:24.000
+And you'll notice that's the stuff
+
+00:08:24.000 --> 00:08:27.600
+I thought was important to produce as diagnostics
+
+00:08:27.600 --> 00:08:29.840
+for the programs running as well.
+
+00:08:29.840 --> 00:08:34.000
+So, spoiler, this Elisp is dynamically
+
+00:08:34.000 --> 00:08:35.400
+generated by the program.
+
+00:08:35.400 --> 00:08:38.160
+And that's really the core of the way
+
+00:08:38.160 --> 00:08:42.680
+orgvm or my orgvm works.
+
+00:08:42.680 --> 00:08:47.360
+So this should look pretty similar to the view of the code
+
+00:08:47.360 --> 00:08:48.880
+we had a moment ago.
+
+00:08:48.880 --> 00:08:51.840
+You can see I've got some bases.
+
+00:08:51.840 --> 00:08:53.680
+This is all hard-coded into the program,
+
+00:08:53.680 --> 00:08:56.720
+nothing fancy going on here.
+
+00:08:56.720 --> 00:09:00.280
+The debug is simply controlling that diagnostic output
+
+00:09:00.280 --> 00:09:01.560
+that we looked at.
+
+00:09:01.560 --> 00:09:04.240
+There's some other, hopefully fairly self-explanatory
+
+00:09:04.240 --> 00:09:09.160
+programs or properties, where to find Emacs and so forth.
+
+NOTE Variables
+
+00:09:09.160 --> 00:09:16.320
+And then finally, we come in to the meat of it,
+
+00:09:16.320 --> 00:09:16.336
+the variables that are used to control what Elisp
+
+00:09:16.337 --> 00:09:24.280
+we can generate dynamically.
+
+00:09:24.280 --> 00:09:27.400
+So here, we're controlling the extension
+
+00:09:27.400 --> 00:09:29.360
+that it should look for Org files.
+
+00:09:29.360 --> 00:09:31.560
+Hopefully not too many people out there
+
+00:09:31.560 --> 00:09:34.080
+with a weird extension for the Org files,
+
+00:09:34.080 --> 00:09:37.920
+but this should support that.
+
+00:09:37.920 --> 00:09:40.120
+I'm afraid that is something I've been known to do.
+
+00:09:40.120 --> 00:09:49.520
+Then we define a list of additional export types.
+
+00:09:49.520 --> 00:09:50.760
+Here's one that ought to work.
+
+00:09:50.760 --> 00:09:53.200
+Let's take a look at type=org.
+
+00:09:54.720 --> 00:09:59.320
+And, aha, it's giving us the file.
+
+00:09:59.320 --> 00:10:00.680
+So I'm not going to open that up,
+
+00:10:00.680 --> 00:10:02.420
+but now we can see that that's definitely working,
+
+00:10:02.421 --> 00:10:09.200
+for certain versions of working.
+
+00:10:09.200 --> 00:10:14.280
+So this list of type parameters is
+
+00:10:14.280 --> 00:10:15.720
+controlling the supported types.
+
+00:10:15.720 --> 00:10:18.550
+Hopefully it should be fairly easy to add in different ones.
+
+00:10:18.800 --> 00:10:21.480
+The fancy footwork here is just a list
+
+00:10:21.480 --> 00:10:23.480
+of the types that we're going to be using.
+
+00:10:23.480 --> 00:10:29.320
+The fancy footwork here involves, first of all,
+
+00:10:29.320 --> 00:10:32.240
+there's the extension and the MIME type.
+
+00:10:32.240 --> 00:10:32.253
+That's, as you might guess, used to control
+
+00:10:32.254 --> 00:10:38.720
+the response content type.
+
+NOTE Replace
+
+00:10:38.720 --> 00:10:40.920
+We also have this replace variable.
+
+00:10:40.920 --> 00:10:44.000
+This prevents-- there's an optimization
+
+00:10:44.000 --> 00:10:48.836
+to send an existing PDF or HTML file
+
+00:10:48.837 --> 00:10:50.463
+if that's already there,
+
+00:10:50.464 --> 00:10:51.003
+but only if the original source Org file
+
+00:10:51.004 --> 00:10:56.240
+hasn't been modified since.
+
+00:10:56.240 --> 00:10:59.920
+This `replace` effectively can turn that off.
+
+00:10:59.920 --> 00:11:03.040
+If I remove the `replace: true` attribute,
+
+00:11:03.040 --> 00:11:07.600
+then I'll be prevented from overwriting that.
+
+00:11:07.600 --> 00:11:10.320
+In other words, I'll always send a cached version.
+
+00:11:10.320 --> 00:11:13.878
+That might be helpful if, for example,
+
+00:11:13.879 --> 00:11:15.065
+you've got hand-tuned PDFs
+
+00:11:15.066 --> 00:11:17.200
+and you don't want to accidentally overwrite them.
+
+NOTE Getting into the code some more
+
+00:11:19.120 --> 00:11:23.480
+All right, let's get into the code a little bit more.
+
+00:11:23.480 --> 00:11:28.280
+I'm going to skip past the really good stuff
+
+00:11:28.280 --> 00:11:28.295
+and jump into the boring parts
+
+00:11:28.296 --> 00:11:34.240
+so that we have them as context.
+
+00:11:34.240 --> 00:11:37.160
+Here's the default path.
+
+00:11:37.160 --> 00:11:41.880
+And it is going to send me the readme from the project--
+
+00:11:41.880 --> 00:11:47.120
+from the project repo if I don't specify a path.
+
+00:11:47.120 --> 00:11:51.240
+And then we have a couple of different endpoints
+
+00:11:51.240 --> 00:11:52.480
+that we support.
+
+00:11:52.480 --> 00:11:55.560
+We'll come back to this first one.
+
+00:11:55.560 --> 00:11:55.586
+For now, let's start with the more normal one,
+
+00:11:55.587 --> 00:12:01.760
+which is just giving us a file name.
+
+00:12:01.760 --> 00:12:04.160
+So we can see we start by figuring out
+
+00:12:04.160 --> 00:12:08.520
+what the physical file name should be called.
+
+00:12:08.520 --> 00:12:10.280
+And assuming that that exists--
+
+00:12:15.600 --> 00:12:17.080
+sorry, I've confused myself.
+
+00:12:17.080 --> 00:12:23.000
+So this is the caching or the optimization
+
+00:12:23.000 --> 00:12:25.640
+that I mentioned, sending the existing file.
+
+00:12:25.640 --> 00:12:31.360
+This file exists is where the optimization is
+
+00:12:31.360 --> 00:12:38.680
+that regenerates the file if the source
+
+00:12:38.680 --> 00:12:41.840
+or document for the HTML generator has changed.
+
+00:12:45.080 --> 00:12:46.760
+Again, this is a short talk, so I'm not
+
+00:12:46.760 --> 00:12:49.320
+going to go into all the nuances of this JavaScript code.
+
+00:12:49.320 --> 00:12:52.800
+It's pretty far from an Emacs-related thing.
+
+00:12:52.800 --> 00:12:56.040
+So with that said, then, the rest of this program
+
+00:12:56.040 --> 00:12:59.360
+is really mostly just handling the different errors:
+
+00:12:59.360 --> 00:13:01.000
+"I didn't understand that type."
+
+00:13:01.000 --> 00:13:02.080
+"I don't know the document."
+
+00:13:02.080 --> 00:13:03.040
+"I failed."
+
+00:13:03.040 --> 00:13:06.480
+Otherwise, there's the caching.
+
+NOTE Generating Elisp
+
+00:13:06.480 --> 00:13:14.520
+And here's really where things get interesting,
+
+00:13:14.520 --> 00:13:19.200
+where we've generated some Elisp,
+
+00:13:19.200 --> 00:13:22.280
+and then we're calling Emacs with that Elisp.
+
+00:13:22.280 --> 00:13:24.760
+If everything works, we'll send the file.
+
+00:13:24.760 --> 00:13:27.800
+If it doesn't, we'll send the 500.
+
+00:13:27.800 --> 00:13:30.920
+And we've already seen the 500, so we know that works.
+
+00:13:30.920 --> 00:13:33.760
+All right, let's get to the interesting part.
+
+00:13:33.760 --> 00:13:37.320
+Sorry, one more footnote.
+
+NOTE Org blocks
+
+00:13:37.320 --> 00:13:39.320
+There is a capability built in that will
+
+00:13:39.320 --> 00:13:41.040
+allow us to execute an Org block.
+
+00:13:41.040 --> 00:13:42.840
+Let's see if that's working in our local.
+
+00:13:44.800 --> 00:13:47.200
+I'll remind myself how to do it.
+
+00:13:47.200 --> 00:13:49.560
+It's run.
+
+00:13:49.560 --> 00:13:53.320
+I think it's called test.
+
+00:13:53.320 --> 00:13:56.360
+And that's returning a 500.
+
+00:13:56.360 --> 00:13:58.400
+I'm suspecting that's running because I'm running
+
+00:13:58.400 --> 00:13:59.760
+in command instead of bash.
+
+00:13:59.760 --> 00:14:06.040
+Oh, yeah, so the failure is happening
+
+00:14:06.040 --> 00:14:07.720
+after I generate the Elisp.
+
+00:14:07.720 --> 00:14:10.280
+I'm pretty confident that is what the actual problem is.
+
+00:14:10.280 --> 00:14:12.760
+If we have time, I'll jump back over there
+
+00:14:12.760 --> 00:14:19.280
+and relaunch it in mingw bash.
+
+00:14:19.280 --> 00:14:21.440
+And we can see it actually work.
+
+00:14:21.440 --> 00:14:24.200
+But this works pretty well for me on my work laptop.
+
+00:14:24.200 --> 00:14:25.860
+I didn't have to make any changes to it.
+
+00:14:25.860 --> 00:14:28.120
+So I have a fairly high amount of confidence,
+
+00:14:28.120 --> 00:14:32.400
+at least in trivial cases, this works pretty well.
+
+NOTE Building some Lisp
+
+00:14:32.400 --> 00:14:37.800
+All right, so what I actually wanted to talk about today--
+
+00:14:37.800 --> 00:14:41.730
+and I'm going to be kind of hand-waving around
+
+00:14:41.731 --> 00:14:46.480
+this ES5 class that I've got and kind of the way that works.
+
+00:14:46.480 --> 00:14:49.840
+Hopefully, this will be pretty familiar to you
+
+00:14:49.840 --> 00:14:53.440
+if you are a JavaScript programmer.
+
+00:14:53.440 --> 00:14:58.660
+The interesting stuff comes when we want to build some Lisp.
+
+00:15:01.960 --> 00:15:01.961
+Here, you can see that I really don't have
+
+00:15:01.962 --> 00:15:11.280
+a whole lot of code around formatting LISP.
+
+00:15:11.280 --> 00:15:14.360
+You can see that I've special-cased
+
+00:15:14.360 --> 00:15:19.840
+whether the arguments that were passed
+
+00:15:19.840 --> 00:15:20.880
+happen to be a function.
+
+00:15:20.880 --> 00:15:25.480
+If they are, I'm going to call that function.
+
+00:15:25.480 --> 00:15:31.720
+And then the result will be formatted as Lisp.
+
+00:15:31.720 --> 00:15:35.040
+So this would be a recursive call here.
+
+00:15:35.040 --> 00:15:40.960
+Otherwise, I'm just going to return the arguments.
+
+00:15:40.960 --> 00:15:48.440
+Sorry, otherwise, I will slap a pair of parentheses
+
+00:15:48.440 --> 00:15:57.878
+around the result of walking that list if I get...
+
+00:15:57.879 --> 00:15:57.880
+formatting each element of the list of arguments
+
+00:15:57.880 --> 00:16:02.600
+that this `formatLisp` process calls
+
+00:16:02.600 --> 00:16:04.920
+and separating them with spaces.
+
+00:16:04.920 --> 00:16:10.880
+So in short form, this program walks through a list.
+
+00:16:10.880 --> 00:16:14.000
+If the list it receives is a function,
+
+00:16:14.000 --> 00:16:16.080
+it calls that function.
+
+00:16:16.080 --> 00:16:19.320
+Once that's handled or otherwise,
+
+00:16:19.320 --> 00:16:22.720
+we simply walk the list, taking the arguments,
+
+00:16:22.720 --> 00:16:26.000
+concatenating them on strings, and finally,
+
+00:16:26.000 --> 00:16:28.560
+wrap the results in parentheses.
+
+00:16:28.560 --> 00:16:31.760
+So what I didn't mention there but might be obvious
+
+00:16:31.760 --> 00:16:36.120
+is if I have a nested list, the inner list
+
+00:16:36.120 --> 00:16:38.600
+will be subjected to the same treatment.
+
+00:16:38.600 --> 00:16:43.000
+So this is a recursive sort of algorithm.
+
+NOTE How Elisp gets encoded
+
+00:16:43.000 --> 00:16:51.520
+All right, so now when I go to export,
+
+00:16:51.520 --> 00:16:53.520
+actually, in the interest of time,
+
+00:16:53.520 --> 00:16:55.800
+I'm going to avoid walking through that piece of code
+
+00:16:55.800 --> 00:16:58.840
+and let's focus instead on the more interesting part
+
+00:16:58.840 --> 00:17:02.360
+of how that Lisp gets encoded.
+
+00:17:02.360 --> 00:17:07.520
+So coming back to the PDF is a good example here,
+
+00:17:07.520 --> 00:17:10.320
+because it's got a special case.
+
+00:17:10.320 --> 00:17:10.336
+You can see I've specified this `exportFun`
+
+00:17:10.337 --> 00:17:15.320
+or export function.
+
+00:17:15.320 --> 00:17:19.560
+That's a property none of these other types have.
+
+00:17:22.400 --> 00:17:27.280
+And you can see it contains some Elisp telling us
+
+00:17:27.280 --> 00:17:29.760
+how to call the export for it.
+
+00:17:29.760 --> 00:17:32.680
+Let's go see how that's used.
+
+00:17:32.680 --> 00:17:35.720
+At the very end of what I just skipped over,
+
+00:17:35.720 --> 00:17:40.600
+the detailed "how the Org export process works,"
+
+00:17:40.600 --> 00:17:45.040
+you'll see that I am ending with a step
+
+00:17:45.040 --> 00:17:48.000
+to call the export function.
+
+00:17:48.000 --> 00:17:48.003
+Here, I look to see whether I have
+
+00:17:48.004 --> 00:17:55.400
+an export function property.
+
+00:17:55.400 --> 00:18:00.920
+If I do, I call that function.
+
+00:18:00.920 --> 00:18:00.920
+And if I don't, I build this list with the default
+
+00:18:00.921 --> 00:18:07.071
+`org-export-to-file` function
+
+00:18:07.072 --> 00:18:15.640
+using the filename and an output filename.
+
+00:18:15.640 --> 00:18:18.480
+So this, hopefully, is pretty familiar to anybody
+
+00:18:18.480 --> 00:18:18.503
+that's manually messed around
+
+00:18:18.504 --> 00:18:23.560
+with calling `org-export-to-file`.
+
+00:18:23.560 --> 00:18:25.800
+If it isn't, you can pretty well trust me for it.
+
+00:18:25.800 --> 00:18:28.280
+There's nothing very special going on.
+
+00:18:28.280 --> 00:18:30.760
+This looks rather like...
+
+00:18:30.760 --> 00:18:37.240
+Poor example there.
+
+00:18:37.240 --> 00:18:38.960
+Let's go back to our markdown.
+
+00:18:46.320 --> 00:18:47.720
+And there, we can see--
+
+00:18:47.720 --> 00:18:49.840
+[Leo]: I'm going to make a quick announcement.
+
+00:18:49.840 --> 00:18:50.760
+Can you hear me?
+
+00:18:50.760 --> 00:18:52.480
+[Corwin]: Yes, go for it.
+
+00:18:52.480 --> 00:18:54.280
+[Leo]: OK, let me just show my face.
+
+00:18:54.280 --> 00:18:55.400
+Oh, I'm not showing my face.
+
+00:18:55.400 --> 00:18:55.640
+Damn it.
+
+00:18:55.640 --> 00:18:57.000
+OK, I'll make the announcement.
+
+00:18:57.000 --> 00:18:58.600
+You won't see my face quite yet.
+
+00:18:58.600 --> 00:19:00.360
+We are about to get started.
+
+00:19:00.360 --> 00:19:02.440
+Well, we actually just got started on dev
+
+00:19:02.440 --> 00:19:06.040
+with the talk by RMS.
+
+00:19:06.040 --> 00:19:08.920
+So if you want to hop over to watch the talk by RMS,
+
+00:19:08.920 --> 00:19:09.760
+feel free to do so.
+
+00:19:09.760 --> 00:19:12.240
+Otherwise, we will be continuing on Gen with Corwin
+
+00:19:12.240 --> 00:19:12.253
+to finish his talk and have a Q&A.
+
+00:19:12.254 --> 00:19:16.080
+Corwin, you can feel free to go now.
+
+00:19:16.080 --> 00:19:18.560
+[Corwin]: Okay, bye, everybody.
+
+00:19:18.560 --> 00:19:22.795
+And for those sticking around,
+
+00:19:22.796 --> 00:19:25.040
+I'm just going to keep pressing on with this.
+
+NOTE How the export works
+
+00:19:25.040 --> 00:19:30.240
+In fact, I'm going to dive back into the part
+
+00:19:30.240 --> 00:19:35.400
+that I skipped here, which is the rest of how
+
+00:19:35.400 --> 00:19:37.400
+this export functionality works.
+
+00:19:37.400 --> 00:19:41.400
+So just to make sure the dot is tied together,
+
+00:19:41.400 --> 00:19:44.440
+the core of how this program works
+
+00:19:44.440 --> 00:19:49.320
+is generating some Elisp and then passing it
+
+00:19:49.320 --> 00:19:51.680
+to Emacs in batch mode.
+
+00:19:51.680 --> 00:19:53.280
+So if that wasn't perfectly clear,
+
+00:19:53.280 --> 00:19:57.240
+that's really what's going on with this program.
+
+00:19:57.240 --> 00:19:59.240
+The rest of the implementation is just
+
+00:19:59.240 --> 00:20:01.840
+a way to do that or certain features that
+
+00:20:01.840 --> 00:20:08.440
+are supported in that generated Elisp, if you will.
+
+00:20:08.440 --> 00:20:11.720
+So this is, you could say, the minimum implementation
+
+00:20:11.720 --> 00:20:11.753
+I could come up with to create a web server
+
+00:20:11.754 --> 00:20:17.320
+for my local Org documents.
+
+00:20:17.320 --> 00:20:24.440
+And I will also interrupt myself to just pull up
+
+00:20:24.440 --> 00:20:28.040
+the Etherpad real quick.
+
+00:20:28.040 --> 00:20:29.600
+Actually, if somebody is listening
+
+00:20:29.600 --> 00:20:34.720
+and can share a link to that, I closed my browser window
+
+00:20:34.720 --> 00:20:36.400
+with my links in it.
+
+00:20:36.400 --> 00:20:44.520
+But sure, I'm happy to take questions at any point, Leo,
+
+00:20:44.520 --> 00:20:48.480
+if there are any questions for me.
+
+00:20:48.480 --> 00:20:49.720
+Are you hanging out with me,
+
+00:20:49.720 --> 00:20:53.360
+instead of watching RMS? You can go.
+
+00:20:53.360 --> 00:20:54.600
+I'm teasing.
+
+00:20:54.600 --> 00:20:58.840
+[Leo]: No, I mean, we know that some people can
+
+00:20:58.840 --> 00:21:00.000
+have both streams open.
+
+00:21:00.000 --> 00:21:01.560
+It's fine.
+
+00:21:01.560 --> 00:21:03.320
+And right now, it's not the Q&A with RMS.
+
+00:21:03.320 --> 00:21:04.640
+It's just the presentation.
+
+00:21:04.640 --> 00:21:07.040
+So feel free to hang out a little longer
+
+00:21:07.040 --> 00:21:09.080
+if you just want the live stuff.
+
+00:21:09.080 --> 00:21:09.960
+Don't worry about it.
+
+00:21:09.960 --> 00:21:10.760
+You're fine.
+
+00:21:10.760 --> 00:21:13.720
+[Corwin]: Yeah, and forgive me, everybody,
+
+00:21:13.720 --> 00:21:16.280
+if you were hoping for a quick, succinct talk.
+
+00:21:16.280 --> 00:21:18.960
+I happen to know I was going to be opposite RMS,
+
+00:21:18.960 --> 00:21:23.240
+so I awarded myself the liberty of rambling.
+
+00:21:23.240 --> 00:21:26.840
+So if you do have a question, something that I alluded to
+
+00:21:26.840 --> 00:21:29.800
+and haven't come back to yet, you should, by all means,
+
+00:21:29.800 --> 00:21:30.320
+prompt me.
+
+00:21:30.320 --> 00:21:33.800
+[Leo]: Corwin, I might do--
+
+00:21:33.800 --> 00:21:35.400
+I'm just giving you a little heads up.
+
+00:21:35.400 --> 00:21:38.640
+I might need to go help at some point of dev.
+
+00:21:38.640 --> 00:21:43.120
+So if I need to do so, I will let you know right now
+
+00:21:43.120 --> 00:21:44.280
+inside the BBB room,
+
+00:21:44.280 --> 00:21:46.160
+and you'll be on your own to manage the chat.
+
+00:21:46.160 --> 00:21:47.960
+And you can just talk backstage to us
+
+00:21:47.960 --> 00:21:50.240
+to manage what we do with the stream, OK?
+
+00:21:50.240 --> 00:21:52.160
+[Corwin]: Yep, that should be no problem at all.
+
+00:21:52.160 --> 00:21:53.760
+I've got my pad up now.
+
+00:21:53.760 --> 00:21:55.160
+Thank you, ??.
+
+00:21:55.160 --> 00:21:58.040
+And I'm sorry about butchering your name there.
+
+00:21:58.040 --> 00:22:03.360
+And yep, I've got my chat open.
+
+00:22:03.360 --> 00:22:06.400
+And I think I'm pretty well set to self-manage.
+
+00:22:06.400 --> 00:22:07.640
+Oh, I don't have a camera on.
+
+00:22:07.640 --> 00:22:09.360
+So you can't see me giving you the thumbs up.
+
+00:22:09.360 --> 00:22:09.860
+[Leo]: Okay, good.
+
+NOTE Walking through the code
+
+00:22:09.860 --> 00:22:16.000
+All right, so let's just walk through,
+
+00:22:16.000 --> 00:22:18.400
+because it's sort of an interesting code.
+
+00:22:18.400 --> 00:22:20.560
+Let's just take a look real quick
+
+00:22:20.560 --> 00:22:24.720
+at how we generated our Elisp here,
+
+00:22:24.720 --> 00:22:26.520
+because it is--
+
+00:22:26.520 --> 00:22:27.640
+there we go.
+
+00:22:27.640 --> 00:22:29.240
+It is a little bit interesting.
+
+00:22:29.240 --> 00:22:32.040
+So here is the method.
+
+00:22:32.040 --> 00:22:34.080
+So I didn't get into detail on this.
+
+00:22:34.080 --> 00:22:34.086
+But there's an ES5 class that represents
+
+00:22:34.087 --> 00:22:38.920
+an Org mode document.
+
+00:22:38.920 --> 00:22:38.920
+It has the static debug property that,
+
+00:22:38.921 --> 00:22:42.400
+as you might imagine,
+
+00:22:42.400 --> 00:22:45.480
+can be overridden by that debug setting
+
+00:22:45.480 --> 00:22:48.440
+we looked at in the defaults.
+
+00:22:48.440 --> 00:22:51.440
+We also have a static variable that--
+
+00:22:51.440 --> 00:22:57.440
+a static property that does nothing more than getting
+
+00:22:57.440 --> 00:23:00.360
+the path to Emacs out of those defaults.
+
+00:23:00.360 --> 00:23:02.120
+Similarly, we have a class method
+
+00:23:02.120 --> 00:23:09.520
+to spawn out an Emacs, as I mentioned, in batch mode,
+
+00:23:09.520 --> 00:23:12.720
+eval-ing some arbitrary Lisp that's passed in.
+
+00:23:12.720 --> 00:23:20.480
+All right, so the type--
+
+00:23:20.480 --> 00:23:23.080
+this is where things start to get interesting.
+
+00:23:23.080 --> 00:23:26.480
+So this is an implementation detail,
+
+00:23:26.480 --> 00:23:30.040
+but-- that it's written as a static method.
+
+00:23:30.040 --> 00:23:32.160
+But essentially, what's going on here
+
+00:23:32.160 --> 00:23:34.840
+is looking up from that type list
+
+00:23:34.840 --> 00:23:37.480
+to try to find a type that's passed in,
+
+00:23:37.480 --> 00:23:41.240
+and that's returning one of these blocks.
+
+00:23:41.240 --> 00:23:44.800
+Let's say I requested HTML, which would be the default.
+
+00:23:44.800 --> 00:23:48.760
+Then I'm going to get this set of properties back.
+
+00:23:50.760 --> 00:23:51.260
+All right.
+
+00:23:51.260 --> 00:24:04.200
+Essentially, this program generates a program
+
+00:24:04.200 --> 00:24:10.840
+or a little block of executable elisp.
+
+00:24:10.840 --> 00:24:15.920
+However, in some cases, where if the `load-path` has
+
+00:24:15.920 --> 00:24:20.920
+been customized in that type block,
+
+00:24:20.920 --> 00:24:25.000
+or I think that's the only case I supported.
+
+00:24:25.000 --> 00:24:28.960
+There was another complexity I removed.
+
+00:24:28.960 --> 00:24:32.000
+So in that case, then I can simply
+
+00:24:32.000 --> 00:24:33.560
+replace that program with a let.
+
+00:24:33.560 --> 00:24:41.680
+Either way, I'm going to have everything I generate
+
+00:24:41.680 --> 00:24:45.840
+be encapsulated in a single block.
+
+00:24:45.840 --> 00:24:49.240
+The-- then I'm calling that formatLisp process
+
+00:24:49.240 --> 00:24:52.760
+that we talked about, appending to that--
+
+00:24:52.760 --> 00:25:01.680
+or inserting into, you could say, the outer scope.
+
+00:25:01.680 --> 00:25:05.000
+And we start by finding the file.
+
+00:25:05.000 --> 00:25:11.400
+We then load any libraries that might be needed.
+
+00:25:11.400 --> 00:25:13.520
+In some cases, the type might not
+
+00:25:13.520 --> 00:25:15.160
+have any external libraries.
+
+00:25:15.160 --> 00:25:18.440
+So we just-- so that's a no-op.
+
+00:25:18.440 --> 00:25:24.120
+And then finally, we're going to execute
+
+00:25:24.120 --> 00:25:27.160
+that logic I mentioned before about selecting
+
+00:25:27.160 --> 00:25:30.160
+either the default org-export-to-file,
+
+00:25:30.160 --> 00:25:36.200
+or else whatever Elisp we've staged for exporting
+
+00:25:36.200 --> 00:25:38.160
+that particular file type.
+
+00:25:38.160 --> 00:25:43.112
+And again, in the case of PDF, there's a special function
+
+00:25:43.113 --> 00:25:46.240
+that's used to trigger that export.
+
+00:25:46.240 --> 00:25:49.160
+Or you may be aware that that's a little more complicated.
+
+00:25:49.160 --> 00:25:50.840
+There's intermediate forms there.
+
+00:25:50.840 --> 00:25:56.760
+All right.
+
+00:25:56.760 --> 00:26:01.320
+So just reminding myself if there's anything else
+
+00:26:01.320 --> 00:26:03.760
+I have to cover on background.
+
+00:26:03.760 --> 00:26:07.440
+And I think that pretty well covers the basics.
+
+NOTE Executing the source block
+
+00:26:07.440 --> 00:26:09.880
+All right, let's look at that source block execute.
+
+00:26:09.880 --> 00:26:14.600
+This is the other use of the format list function.
+
+00:26:14.600 --> 00:26:16.800
+So here, rather than looking at the type
+
+00:26:16.800 --> 00:26:24.720
+and passing that through our Org export method,
+
+00:26:24.720 --> 00:26:29.080
+and then that type is used to get the list
+
+00:26:29.080 --> 00:26:30.840
+that we want to create.
+
+00:26:30.840 --> 00:26:37.600
+In the case of source block execute,
+
+00:26:37.600 --> 00:26:40.520
+we're kind of rolling it a lot more by hand.
+
+00:26:40.520 --> 00:26:43.920
+So this gives us a good chance to sort of unwind
+
+00:26:43.920 --> 00:26:49.600
+how that list looks when it's staged as JavaScript data.
+
+00:26:49.600 --> 00:26:52.760
+So here again, I wrap everything in a `progn`.
+
+00:26:52.760 --> 00:26:58.480
+I start by preventing an interactive prompt
+
+00:26:58.480 --> 00:27:01.240
+for the Babel execution.
+
+00:27:01.240 --> 00:27:04.960
+And then we load languages.
+
+00:27:04.960 --> 00:27:12.240
+This relates to another piece of our configuration
+
+00:27:12.240 --> 00:27:17.600
+where we've specified a set of languages
+
+00:27:17.600 --> 00:27:19.920
+that it's OK to execute.
+
+00:27:19.920 --> 00:27:24.120
+So if that type isn't in this list,
+
+00:27:24.120 --> 00:27:28.800
+then we won't be able to execute it in line
+
+00:27:28.800 --> 00:27:32.720
+through our trivial little web server.
+
+00:27:32.720 --> 00:27:33.640
+All right.
+
+00:27:33.640 --> 00:27:40.600
+With that done, then, loading the selected language,
+
+00:27:40.600 --> 00:27:43.960
+we then once again open the file.
+
+00:27:43.960 --> 00:27:46.360
+And we're-- whoops.
+
+00:27:46.360 --> 00:27:51.800
+Let-bind a return value, which is
+
+00:27:51.800 --> 00:27:55.166
+calculated by using Org source block execute [`org-sbe`]
+
+00:27:55.167 --> 00:27:58.040
+on the name of the block that's given.
+
+00:27:58.040 --> 00:28:05.160
+And then we use a temp buffer to write that out
+
+00:28:05.160 --> 00:28:06.640
+to a temporary file.
+
+00:28:06.640 --> 00:28:08.440
+This is actually a little clumsy,
+
+00:28:08.440 --> 00:28:12.720
+but I haven't put the effort in to have this written out
+
+00:28:12.720 --> 00:28:17.480
+to the standard output cleanly instead of using a temp file.
+
+00:28:17.840 --> 00:28:20.480
+So under-- this is another example of where it may not
+
+00:28:20.480 --> 00:28:22.520
+be production-- well, it definitely
+
+00:28:22.520 --> 00:28:27.680
+is not production-worthy code in that under heavy load,
+
+00:28:27.680 --> 00:28:30.166
+this would certainly break with collisions
+
+00:28:30.167 --> 00:28:32.040
+on the Babel file,
+
+00:28:32.040 --> 00:28:34.120
+the name of the Babel file.
+
+00:28:34.120 --> 00:28:37.480
+In any case, once we've staged up our Elisp, which is--
+
+00:28:37.480 --> 00:28:42.560
+this is basically variable interpolation,
+
+00:28:42.560 --> 00:28:47.680
+then we just call Emacs on that.
+
+00:28:47.680 --> 00:28:49.720
+And if we look down to where that's called,
+
+00:28:49.720 --> 00:28:54.640
+you can see that the Org Babel filename calculated here.
+
+00:29:12.795 --> 00:29:15.000
+[Leo]: Is there a problem?
+
+00:29:15.000 --> 00:29:15.760
+[Corwin]: No, I'm fine.
+
+00:29:15.760 --> 00:29:18.000
+I'm just lost in my code.
+
+00:29:18.000 --> 00:29:19.040
+[Leo]: OK, cool.
+
+00:29:19.040 --> 00:29:21.160
+Uh-oh means, oh, I need to intervene.
+
+00:29:21.160 --> 00:29:22.240
+What is going on?
+
+00:29:22.240 --> 00:29:23.200
+Carry on, please.
+
+00:29:23.200 --> 00:29:24.120
+[Corwin]: No, I'm fine, Leo.
+
+00:29:24.120 --> 00:29:25.480
+Thank you.
+
+00:29:25.480 --> 00:29:27.280
+All right, so then--
+
+00:29:27.280 --> 00:29:28.680
+so you can see we get--
+
+00:29:28.680 --> 00:29:35.537
+we send the Babel file here,
+
+00:29:35.538 --> 00:29:41.640
+which is calculated manually.
+
+00:29:41.640 --> 00:29:45.440
+A bit sloppy there, since I have essentially the same--
+
+00:29:45.440 --> 00:29:47.000
+I have two different places where
+
+00:29:47.000 --> 00:29:52.480
+I'm calculating the Org doc file in two different ways.
+
+00:29:52.480 --> 00:29:54.720
+Have I encouraged you to write your own yet?
+
+00:29:54.720 --> 00:29:56.440
+Or send patches.
+
+00:29:56.440 --> 00:30:01.240
+All right, so that's pretty much the nuts and bolts
+
+00:30:01.240 --> 00:30:02.400
+of this program.
+
+00:30:02.400 --> 00:30:06.720
+Let's go back to just seeing if we can't make it run.
+
+00:30:22.120 --> 00:30:22.620
+All right.
+
+00:30:22.620 --> 00:30:45.880
+All right, well, I apologize for not
+
+00:30:45.880 --> 00:30:49.560
+having taken the time to stage my demo this morning.
+
+00:30:49.560 --> 00:30:52.680
+I'm going to try to make it better for you.
+
+00:30:52.680 --> 00:30:59.920
+But apparently, it's going to be non-trivial
+
+00:30:59.920 --> 00:31:04.520
+to make the program work.
+
+00:31:04.520 --> 00:31:07.160
+Let's just-- before I completely give up,
+
+00:31:07.160 --> 00:31:13.320
+let's go ahead and try our Babel execute.
+
+00:31:13.320 --> 00:31:14.800
+And that, too, is failing.
+
+00:31:14.800 --> 00:31:18.040
+So there's something unhappy in my local world.
+
+00:31:18.040 --> 00:31:19.040
+There it goes.
+
+00:31:19.040 --> 00:31:26.600
+But in any case, let's go ahead and just take a look at
+
+00:31:26.600 --> 00:31:28.000
+that.
+
+00:31:28.000 --> 00:31:30.640
+Let's see.
+
+00:31:30.640 --> 00:31:31.600
+Control Enter.
+
+00:31:36.628 --> 00:31:40.200
+Let's take a look at that generated .el
+
+00:31:40.200 --> 00:31:42.840
+and compare it to-- whoa--
+
+00:31:42.840 --> 00:31:44.000
+and compare it to--
+
+00:31:44.000 --> 00:31:52.400
+I'm just going to format this manually,
+
+00:31:52.400 --> 00:31:56.000
+because I've forgotten my key bindings to auto-format it.
+
+00:31:56.000 --> 00:32:02.240
+There we go.
+
+00:32:02.240 --> 00:32:07.960
+All right.
+
+00:32:07.960 --> 00:32:13.120
+So now we can see, as promised, there's really
+
+00:32:13.120 --> 00:32:16.200
+nothing going on here other than the interpolation
+
+00:32:16.200 --> 00:32:18.640
+of the variables in.
+
+00:32:18.640 --> 00:32:24.360
+We're inserting-- we're using an insert and write file
+
+00:32:24.360 --> 00:32:27.800
+method, which is, again, rather sloppy,
+
+00:32:27.800 --> 00:32:32.040
+to generate the text file.
+
+00:32:32.040 --> 00:32:32.880
+All right.
+
+00:32:32.880 --> 00:32:34.760
+Let's come back to our documentation
+
+00:32:34.760 --> 00:32:39.760
+and see if we can put a bow on the project.
+
+NOTE Conclusion
+
+00:32:39.760 --> 00:32:43.760
+So I hope I've convinced you that this was actually
+
+00:32:43.760 --> 00:32:45.480
+rather easy to do.
+
+00:32:45.480 --> 00:32:52.440
+The entirety of my index.js file is 262 lines,
+
+00:32:52.440 --> 00:32:59.810
+and that includes a good 40 of whitespace and configuration.
+
+00:33:03.760 --> 00:33:06.505
+It has only one dependency, the Express,
+
+00:33:06.506 --> 00:33:08.240
+which really builds the web server.
+
+00:33:08.240 --> 00:33:11.520
+Any language you'd rather implement this in
+
+00:33:11.520 --> 00:33:14.120
+will have a similar capability for building
+
+00:33:14.120 --> 00:33:16.280
+some type of trivial web server.
+
+00:33:16.280 --> 00:33:18.400
+And I think you may find--
+
+00:33:18.400 --> 00:33:22.640
+I certainly found that a large portion of the code base
+
+00:33:22.640 --> 00:33:28.080
+is really making the errors meaningful,
+
+00:33:28.080 --> 00:33:32.420
+in that, in some cases, sending an appropriate HTTP status
+
+00:33:32.420 --> 00:33:34.360
+based on what happened.
+
+00:33:34.360 --> 00:33:38.002
+In other cases-- let's see if
+
+00:33:38.003 --> 00:33:42.640
+I've got an explicit `throw` left in here--
+
+00:33:42.640 --> 00:33:45.840
+in other cases, just trapping different types
+
+00:33:45.840 --> 00:33:47.440
+of failure conditions.
+
+00:33:47.440 --> 00:33:54.000
+I'm going to look at my pad, and I do see a question here.
+
+00:33:54.000 --> 00:33:55.120
+So let me jump in here.
+
+NOTE Questions and answers
+
+00:33:58.880 --> 00:34:00.640
+[Leo]: Corwin, just to make sure, are you switching to Q&A?
+
+00:34:00.640 --> 00:34:02.380
+Are you finished with your presentation?
+
+00:34:02.380 --> 00:34:05.260
+[Corwin]: Well, as I said, I'm happy to take Q&A throughout.
+
+00:34:05.260 --> 00:34:08.420
+But yes, let's say yes to that.
+
+00:34:08.420 --> 00:34:10.900
+[Leo]: Okay, so Corwin, what I'm going to need to do now--
+
+00:34:10.900 --> 00:34:12.140
+you are in charge of the room.
+
+00:34:12.140 --> 00:34:14.060
+We are going to open up the room so
+
+00:34:14.060 --> 00:34:17.220
+that if people have questions watching right now on Gen,
+
+00:34:17.220 --> 00:34:18.700
+feel free to come in.
+
+00:34:18.700 --> 00:34:22.780
+And there was something else I needed to say.
+
+00:34:22.780 --> 00:34:24.620
+Yes, Corwin, if there's any problem,
+
+00:34:24.620 --> 00:34:25.700
+whisper to us on Mumble.
+
+00:34:25.700 --> 00:34:27.500
+So you might want to unmute Mumble
+
+00:34:27.500 --> 00:34:29.620
+and be able to listen to us over there.
+
+00:34:29.620 --> 00:34:32.480
+[Corwin]: I can't do that, Leo.
+
+00:34:32.480 --> 00:34:36.440
+If I unmute, Mumble is going to bleed through.
+
+00:34:36.440 --> 00:34:36.960
+[Leo]: Okay, sure.
+
+00:34:36.960 --> 00:34:39.416
+Well, if you have any problem,
+
+00:34:39.417 --> 00:34:41.160
+type in #emacsconf-org channel,
+
+00:34:41.160 --> 00:34:42.520
+and we'll be with you, OK?
+
+00:34:42.520 --> 00:34:43.520
+[Corwin]: Or I'll PM somebody.
+
+00:34:43.520 --> 00:34:45.760
+But I don't anticipate having any problems.
+
+00:34:45.760 --> 00:34:49.040
+I'll put something in -org when I run out of steam here.
+
+00:34:49.040 --> 00:34:50.400
+How's that?
+
+00:34:50.400 --> 00:34:51.160
+[Leo]: Amazing, cool.
+
+00:34:51.160 --> 00:34:53.320
+So I will have to leave the room, though.
+
+00:34:53.320 --> 00:34:56.800
+I'm leaving the recording going so that we have your Q&A.
+
+00:34:56.800 --> 00:34:58.080
+And whenever you're available--
+
+00:34:58.080 --> 00:35:02.180
+[Corwin]: I'll shut off the recording when I close the room.
+
+00:35:02.180 --> 00:35:02.980
+[Leo]: Okay, great.
+
+00:35:02.980 --> 00:35:04.460
+Good luck, Corwin.
+
+00:35:04.460 --> 00:35:06.500
+[Corwin]: Thank you.
+
+00:35:06.500 --> 00:35:09.780
+All right, and if you're still with me, well, thanks.
+
+00:35:09.780 --> 00:35:13.620
+I appreciate that.
+
+00:35:13.620 --> 00:35:16.740
+I did offer to be opposite RMS.
+
+00:35:16.740 --> 00:35:20.060
+And I'm in no way offended if people do want to jump over,
+
+00:35:20.060 --> 00:35:23.540
+especially as that starts to shift over to Q&A.
+
+00:35:23.540 --> 00:35:26.980
+I'm taking Leo's leaving as a pretty good indication
+
+00:35:26.980 --> 00:35:28.780
+that that's happening now-ish.
+
+00:35:28.780 --> 00:35:31.385
+So I totally understand
+
+00:35:31.386 --> 00:35:35.020
+if folks are more excited to do that.
+
+00:35:35.020 --> 00:35:37.940
+Meanwhile, let me just jump over to the question
+
+00:35:37.940 --> 00:35:38.660
+that I received.
+
+00:35:38.660 --> 00:35:46.460
+I'll show the pad here so that I save myself
+
+00:35:46.460 --> 00:35:47.860
+reading the question out.
+
+00:35:47.860 --> 00:35:48.940
+But I'll paraphrase it.
+
+NOTE Why am I not running the web server in Emacs?
+
+00:35:48.940 --> 00:35:52.660
+Why am I not running the web server in Emacs?
+
+00:35:52.660 --> 00:35:54.380
+That would be a great way to do it.
+
+00:35:54.380 --> 00:35:56.340
+I chose to build it in Node.js
+
+00:35:56.341 --> 00:35:58.460
+because that was trivially easy for me.
+
+NOTE Is this using org-info-js?
+
+00:36:22.140 --> 00:36:24.780
+And then finally, am I using org-info-js?
+
+00:36:24.780 --> 00:36:27.540
+No, I learned about this essentially at this conference.
+
+00:36:27.540 --> 00:36:30.660
+So that's something I'll be learning more about.
+
+00:36:30.660 --> 00:36:32.460
+And it could well influence this project.
+
+00:36:34.900 --> 00:36:56.180
+All right, and thanks for the questions.
+
+00:36:59.020 --> 00:37:02.820
+All right, I'm going to slow my roll just a little bit here
+
+00:37:02.820 --> 00:37:06.980
+because I think I kind of have all the time in the world.
+
+00:37:06.980 --> 00:37:11.540
+I will be wrapping up within about 15 or 20 minutes
+
+00:37:11.540 --> 00:37:15.620
+at the latest just to avoid stressing out
+
+00:37:15.620 --> 00:37:18.827
+my fellow organizers, especially Leo and Sacha
+
+00:37:18.828 --> 00:37:22.260
+that have the bulk of the heavy lifting this year,
+
+00:37:22.260 --> 00:37:26.820
+and Amin, and really, thanks all to everybody.
+
+00:37:26.820 --> 00:37:29.540
+God, the nicest part of doing my own talk
+
+00:37:29.540 --> 00:37:31.980
+is that I get to say that.
+
+00:37:31.980 --> 00:37:35.460
+It's just so much fun to contribute to EmacsConf.
+
+NOTE EmacsConf
+
+00:37:35.460 --> 00:37:38.740
+And if you're at all interested, there's
+
+00:37:38.740 --> 00:37:43.100
+plenty of completely backstage, behind the curtain role.
+
+00:37:43.100 --> 00:37:45.340
+Behind the curtain roles doesn't mean
+
+00:37:45.340 --> 00:37:47.865
+you have to be somebody that likes
+
+00:37:47.866 --> 00:37:50.060
+talking or being on webcam.
+
+00:37:50.060 --> 00:37:52.300
+Sorry that my camera isn't working this year.
+
+00:37:52.300 --> 00:37:53.980
+I spent quite a while fussing with that
+
+00:37:53.980 --> 00:37:56.740
+and lost all my time to get my prerec working.
+
+00:37:56.740 --> 00:38:10.140
+All right, so trying to think where I can take us
+
+00:38:10.140 --> 00:38:11.540
+without my demo working.
+
+00:38:11.540 --> 00:38:14.540
+I was really hoping to show the Org Babel piece.
+
+00:38:14.540 --> 00:38:15.580
+That's really fun.
+
+NOTE How I'm using this at work
+
+00:38:15.580 --> 00:38:20.420
+So let me just mention briefly how I'm using this at work.
+
+00:38:20.420 --> 00:38:25.980
+So at work, I'll have some type of Org document.
+
+00:38:25.980 --> 00:38:27.700
+And usually, it's a project.
+
+00:38:27.700 --> 00:38:32.900
+So the title of the document is My Project.
+
+00:38:32.900 --> 00:38:37.820
+And then I'll have a requirements section.
+
+00:38:37.820 --> 00:38:43.540
+And I'll have a meeting notes section.
+
+00:38:43.540 --> 00:38:44.980
+That's probably the key thing.
+
+00:38:44.980 --> 00:38:49.540
+And then as the project goes on, I'll start having--
+
+00:38:49.540 --> 00:38:50.740
+I'm a solutions architect.
+
+00:38:50.740 --> 00:38:55.420
+So my job is formalizing design in large part.
+
+00:38:55.420 --> 00:39:01.740
+So then I'll have a design documents section.
+
+00:39:01.740 --> 00:39:05.020
+And this is where I'll be doing a lot of my work.
+
+00:39:05.020 --> 00:39:07.220
+So I'll start out saying--
+
+00:39:26.620 --> 00:39:29.340
+And maybe Bob is a subject matter expert
+
+00:39:29.340 --> 00:39:32.460
+whose buy-in I need to have on how we're going
+
+00:39:32.460 --> 00:39:34.820
+to do the high-level design.
+
+00:39:34.820 --> 00:39:37.296
+Maybe a lead engineer or a dev manager
+
+00:39:37.297 --> 00:39:39.460
+or something like that.
+
+00:39:39.460 --> 00:39:42.653
+All right, as my work goes on,
+
+00:39:42.654 --> 00:39:47.620
+then this will start getting into more detail.
+
+00:40:16.620 --> 00:40:18.660
+And things of this nature.
+
+00:40:18.660 --> 00:40:20.180
+As things get further and further,
+
+00:40:20.180 --> 00:40:21.740
+I'll actually have documentation
+
+00:40:21.740 --> 00:40:22.820
+that I'm adding in here.
+
+00:40:22.820 --> 00:40:28.900
+Oh, I see.
+
+00:40:28.900 --> 00:40:29.740
+It's a big mess.
+
+00:40:29.740 --> 00:40:32.140
+All right, well, we'll just reuse this.
+
+00:40:32.140 --> 00:40:40.380
+So I can insert those all in line.
+
+00:40:40.380 --> 00:40:42.157
+And now for the fun part,
+
+00:40:42.158 --> 00:40:44.460
+let's see if the most trivial case
+
+00:40:44.460 --> 00:40:45.460
+is working here.
+
+00:40:49.940 --> 00:40:51.180
+No.
+
+00:40:51.180 --> 00:40:52.900
+All right, completely broken.
+
+00:40:52.900 --> 00:40:57.260
+Let me drag.
+
+00:40:57.260 --> 00:41:05.180
+All right, well, apologies again for the poor quality
+
+00:41:05.180 --> 00:41:06.260
+of my demo today.
+
+00:41:06.260 --> 00:41:13.900
+And let me just look real quick at my Etherpad once more.
+
+00:41:13.900 --> 00:41:16.820
+And I'll glance at BBB to see if there's anybody
+
+00:41:16.820 --> 00:41:18.140
+jumping in with questions.
+
+00:41:18.140 --> 00:41:23.740
+And then I'll go back to IRC and look for questions there.
+
+00:41:23.740 --> 00:41:33.180
+OK, and I don't see any additional questions on the pad.
+
+00:41:33.180 --> 00:41:35.780
+I'm just going to scan IRC real quick.
+
+00:41:35.780 --> 00:41:42.460
+I suspect that the TreeSitter comment isn't for me.
+
+00:41:44.900 --> 00:41:56.620
+All right, and I'm not seeing a lot of questions there.
+
+00:41:56.620 --> 00:42:04.340
+So I'm just going to vamp for just a minute or two.
+
+NOTE Volunteering for EmacsConf
+
+00:42:04.340 --> 00:42:07.980
+As I mentioned, I'm a conference volunteer.
+
+00:42:07.980 --> 00:42:09.700
+This is my third year volunteering
+
+00:42:09.700 --> 00:42:11.940
+with the conference.
+
+00:42:11.940 --> 00:42:15.140
+And probably if you take one thing away from my talk,
+
+00:42:15.140 --> 00:42:17.740
+it should be I really like volunteering
+
+00:42:17.740 --> 00:42:18.500
+for the conference.
+
+00:42:18.500 --> 00:42:19.900
+It's fun.
+
+00:42:19.900 --> 00:42:23.500
+It makes me feel sort of close to the pulse.
+
+00:42:23.500 --> 00:42:27.296
+And it gives me a chance to just interact with people
+
+00:42:27.297 --> 00:42:30.106
+that have very different perspectives on Emacs,
+
+00:42:30.107 --> 00:42:32.740
+which is something that I really value a lot.
+
+00:42:32.740 --> 00:42:40.220
+Emacs, like anything else sort of in the internet world,
+
+00:42:40.220 --> 00:42:42.940
+has a real echo chamber factor.
+
+00:42:42.940 --> 00:42:46.504
+If you do or don't like use-package,
+
+00:42:46.505 --> 00:42:49.135
+you probably interact with a lot of people
+
+00:42:49.136 --> 00:42:53.500
+that feel the same way about that.
+
+00:42:53.500 --> 00:42:57.420
+And so I really recommend volunteering for EmacsConf
+
+00:42:57.420 --> 00:43:01.340
+as a way to sort of mix it up and get
+
+00:43:01.340 --> 00:43:03.858
+to know people that may not use Emacs
+
+00:43:03.859 --> 00:43:05.540
+the same way that you do.
+
+NOTE It's easy to build a program that uses Emacs in the pipeline
+
+00:43:08.380 --> 00:43:10.420
+Or perhaps more on topic, though,
+
+00:43:10.420 --> 00:43:14.300
+the log line for this talk is it's really quite easy
+
+00:43:14.300 --> 00:43:20.760
+to build a program that uses Emacs in a pipeline capability.
+
+00:43:20.980 --> 00:43:23.780
+I think there's a ton of opportunity in this space.
+
+00:43:23.780 --> 00:43:27.700
+This particular example is just a trivial web server
+
+00:43:27.700 --> 00:43:30.780
+written using Node.js.
+
+00:43:30.780 --> 00:43:31.545
+But as was pointed out, we could have used elnode
+
+00:43:31.546 --> 00:43:40.060
+as a web server
+
+00:43:40.060 --> 00:43:44.060
+and done the entire thing within Emacs Lisp.
+
+00:43:44.060 --> 00:43:48.765
+Or really, almost any technology
+
+00:43:48.766 --> 00:43:52.900
+would get us this capability.
+
+00:43:52.900 --> 00:43:54.660
+From an implementation standpoint,
+
+00:43:54.660 --> 00:43:56.847
+I had a lot of fun building
+
+00:43:56.848 --> 00:43:59.580
+this trivial little Elisp parser,
+
+00:43:59.580 --> 00:44:03.220
+and I'm rather pleased with the fact
+
+00:44:03.220 --> 00:44:07.340
+that the entirety of that--
+
+00:44:07.340 --> 00:44:14.180
+the entire algorithm for turning JavaScript or JSON data,
+
+00:44:14.180 --> 00:44:20.420
+we could say, into Elisp is really a one-liner,
+
+00:44:20.420 --> 00:44:25.820
+albeit a nasty one-liner. That was pretty cool
+
+00:44:25.820 --> 00:44:28.180
+to discover how simple that was.
+
+00:44:28.180 --> 00:44:31.220
+So in my mind, that opens up a lot of possibility.
+
+00:44:31.220 --> 00:44:32.889
+If it's this easy in JavaScript,
+
+00:44:32.890 --> 00:44:34.708
+I wouldn't expect it to be hard,
+
+00:44:34.709 --> 00:44:36.860
+any more difficult in your favorite language.
+
+00:44:36.860 --> 00:44:41.140
+Glance one more time to see if there
+
+00:44:41.140 --> 00:44:42.940
+happen to be any other questions.
+
+00:44:42.940 --> 00:44:47.300
+And not seeing any, I'm going to go ahead and start
+
+00:44:47.300 --> 00:44:49.500
+wrapping up my chat now.
+
+00:44:49.500 --> 00:44:51.620
+It will take me a couple of minutes to do that.
+
+00:44:51.620 --> 00:44:54.580
+So if you do have any other questions that you
+
+00:44:54.580 --> 00:44:56.460
+want to drop into the pad or any comments,
+
+00:44:56.460 --> 00:44:59.740
+you're more than welcome to hit me with those
+
+00:44:59.740 --> 00:45:03.820
+as I coordinate closing this chat, this talk,
+
+00:45:03.820 --> 00:45:06.100
+with the organizer team.
diff --git a/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main--chapters.vtt b/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main--chapters.vtt
new file mode 100644
index 00000000..6a5b2f48
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main--chapters.vtt
@@ -0,0 +1,71 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:32.079
+Introduction
+
+00:00:32.080 --> 00:01:08.799
+Project housekeeping
+
+00:01:08.800 --> 00:02:04.679
+Continuous integration
+
+00:02:04.680 --> 00:03:32.559
+Funding contributors
+
+00:03:32.560 --> 00:03:58.639
+New features
+
+00:03:58.640 --> 00:04:36.519
+An assortment of export improvements
+
+00:04:36.520 --> 00:05:12.279
+A collection of babel improvements
+
+00:05:12.280 --> 00:06:04.159
+A multitude of general org-mode improvements
+
+00:06:04.160 --> 00:07:31.599
+Citations
+
+00:07:31.600 --> 00:07:48.319
+Quality of life improvements
+
+00:07:48.320 --> 00:09:02.479
+Org fold
+
+00:09:02.480 --> 00:10:07.359
+Org element cache
+
+00:10:07.360 --> 00:11:02.719
+Org persist
+
+00:11:02.720 --> 00:11:40.199
+More careful resource downloading
+
+00:11:40.200 --> 00:12:15.799
+Bug fixes
+
+00:12:15.800 --> 00:12:42.799
+Asynchronous session evaluation
+
+00:12:42.800 --> 00:13:18.279
+Nicer tangle mode syntax
+
+00:13:18.280 --> 00:13:52.599
+A flourishing ecosystem
+
+00:13:52.600 --> 00:14:10.119
+Org-modern
+
+00:14:10.120 --> 00:15:44.039
+citeproc-org
+
+00:15:44.040 --> 00:17:06.319
+Continuing work on the Org format
+
+00:17:06.320 --> 00:17:41.919
+Mailing list management
+
+00:17:41.920 --> 00:19:51.880
+Further engraving
diff --git a/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main.vtt b/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main.vtt
new file mode 100644
index 00000000..32e3022e
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main.vtt
@@ -0,0 +1,1220 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:04.679
+Hello. If you're listening to this talk,
+
+00:00:04.680 --> 00:00:06.239
+then you should be at least a bit interested
+
+00:00:06.240 --> 00:00:09.199
+in Org mode, which is fantastic
+
+00:00:09.200 --> 00:00:11.252
+because there have been quite a few
+
+00:00:11.253 --> 00:00:14.599
+interesting developments over the past year or so.
+
+00:00:14.600 --> 00:00:19.399
+I'm Timothy, as you may have gathered from the last talk,
+
+00:00:19.400 --> 00:00:21.799
+and I'm also quite involved with the Org project,
+
+00:00:21.800 --> 00:00:23.999
+so I'd like to go through a few of those developments
+
+00:00:24.000 --> 00:00:27.439
+over the past year or so and give you a few hints as well
+
+00:00:27.440 --> 00:00:32.079
+as to what potentially lies around the corner with Org mode.
+
+NOTE Project housekeeping
+
+00:00:32.080 --> 00:00:35.879
+The starters, slightly on the more boring side
+
+00:00:35.880 --> 00:00:37.679
+but rather significant change to the project,
+
+00:00:37.680 --> 00:00:40.799
+occurred with the housekeeping or organisation.
+
+00:00:40.800 --> 00:00:43.519
+The codebase for the Org project has actually shifted over
+
+00:00:43.520 --> 00:00:46.799
+from a self-hosted Gogs instance over to Savannah,
+
+00:00:46.800 --> 00:00:49.719
+which means it's now living right alongside
+
+00:00:49.720 --> 00:00:51.519
+the Emacs codebase.
+
+00:00:51.520 --> 00:00:53.279
+This has been accompanied by the creation
+
+00:00:53.280 --> 00:00:58.219
+of a whole bunch of Org-related repos under
+
+00:00:58.220 --> 00:01:03.359
+Bastien's (Org's maintainer) personal sourceHut account.
+
+00:01:03.360 --> 00:01:06.759
+We've got the source of the website, the Org wiki Worg,
+
+00:01:06.760 --> 00:01:08.799
+as well as Org contrib.
+
+NOTE Continuous integration
+
+00:01:08.800 --> 00:01:13.119
+Another recent addition to this list of Org-related repos
+
+00:01:13.120 --> 00:01:17.799
+is the new Org mode tests--continuous integration.
+
+00:01:17.800 --> 00:01:22.039
+Now, this is rather important, because while we do recommend
+
+00:01:22.040 --> 00:01:25.879
+that all contributors actually run make tests
+
+00:01:25.880 --> 00:01:29.799
+before submitting patches to the Org project,
+
+00:01:29.800 --> 00:01:31.279
+this doesn't always happen.
+
+00:01:31.280 --> 00:01:34.559
+It can also actually be a bit harder than you expect
+
+00:01:34.560 --> 00:01:35.719
+to run the tests because there are a lot
+
+00:01:35.720 --> 00:01:37.759
+of trans-dependencies you get with Org;
+
+00:01:37.760 --> 00:01:40.199
+for instance, with all of the various Babel libraries
+
+00:01:40.200 --> 00:01:42.599
+which actually require other packages
+
+00:01:42.600 --> 00:01:46.079
+or programming language to be installed on the system.
+
+00:01:46.080 --> 00:01:50.079
+Having a single self-contained test system
+
+00:01:50.080 --> 00:01:53.319
+to actually make sure that Org can be regularly
+
+00:01:53.320 --> 00:01:57.519
+and thoroughly tested should be a great help for actually
+
+00:01:57.520 --> 00:02:04.679
+ensuring the quality of the contributions.
+
+NOTE Funding contributors
+
+00:02:04.680 --> 00:02:07.079
+The funding structure for Org has also undergone a bit
+
+00:02:07.080 --> 00:02:10.559
+of a shift. Historically, we've just directed everybody
+
+00:02:10.560 --> 00:02:14.199
+who's interested in financially supporting the Org project
+
+00:02:14.200 --> 00:02:18.639
+to the maintainer Bastien's personal GitHub sponsors
+
+00:02:18.640 --> 00:02:22.399
+and LibrePay accounts. Now, early this year,
+
+00:02:22.400 --> 00:02:27.519
+Bastion has created the Librepay Org mode team account,
+
+00:02:27.520 --> 00:02:29.039
+which means that you can actually now
+
+00:02:29.040 --> 00:02:33.159
+support the Org project as opposed to
+
+00:02:33.160 --> 00:02:34.479
+the person leading the Org project.
+
+00:02:34.480 --> 00:02:39.159
+Currently, this just distributes donations between Bastien,
+
+00:02:39.160 --> 00:02:42.079
+Ihor, and myself. However, the idea is that
+
+00:02:42.080 --> 00:02:45.039
+as the active contributors for the Org project
+
+00:02:45.040 --> 00:02:50.839
+come and go over time, the list of people on this team
+
+00:02:50.840 --> 00:02:56.999
+can be changed as seems sensible. The hope here is that
+
+00:02:57.000 --> 00:03:00.159
+it will simplify both how easy it is
+
+00:03:00.160 --> 00:03:02.559
+to actually financially support the Org project
+
+00:03:02.560 --> 00:03:04.359
+as well as how easily people contributing
+
+00:03:04.360 --> 00:03:09.599
+to the Org project can be supported.
+
+00:03:09.600 --> 00:03:13.479
+If you're interested in supporting the Org project,
+
+00:03:13.480 --> 00:03:15.439
+there's never been a better time than now
+
+00:03:15.440 --> 00:03:16.919
+to have a look at this
+
+00:03:16.920 --> 00:03:23.159
+and let anybody who might also might be interested know.
+
+00:03:23.160 --> 00:03:25.279
+Hopefully, this leads to a healthier funding structure
+
+00:03:25.280 --> 00:03:28.199
+that will scale better into the long term
+
+00:03:28.200 --> 00:03:32.559
+and thus better support the work that happens with Org.
+
+NOTE New features
+
+00:03:32.560 --> 00:03:37.079
+Now, the project itself has of course also seen quite a bit
+
+00:03:37.080 --> 00:03:38.519
+of development over the past year.
+
+00:03:38.520 --> 00:03:44.159
+We've had about 800 comments from 80 contributors.
+
+00:03:44.160 --> 00:03:46.519
+Within these comments, there's been a lot of polishing
+
+00:03:46.520 --> 00:03:48.759
+quality-of-life improvements,
+
+00:03:48.760 --> 00:03:50.519
+and also quite a few new features.
+
+00:03:50.520 --> 00:03:52.799
+Now, I haven't got nearly enough time
+
+00:03:52.800 --> 00:03:54.159
+to go through this exhaustively,
+
+00:03:54.160 --> 00:03:58.639
+so we're just going to go through a quick highlight reel.
+
+NOTE An assortment of export improvements
+
+00:03:58.640 --> 00:04:00.239
+There's a collection of export improvements
+
+00:04:00.240 --> 00:04:04.319
+from things which affect all export backends,
+
+00:04:04.320 --> 00:04:07.319
+like including remote content
+
+00:04:07.320 --> 00:04:09.599
+and adding new things like DOI links
+
+00:04:09.600 --> 00:04:11.519
+and support for encrypted Org files,
+
+00:04:11.520 --> 00:04:14.679
+as well as a whole lot of export-backend-specific changes.
+
+00:04:14.680 --> 00:04:17.159
+For example, quite a few backends--
+
+00:04:17.160 --> 00:04:18.519
+I've mentioned the LaTeX one here,
+
+00:04:18.520 --> 00:04:23.119
+but also others such as Texinfo--have now got
+
+00:04:23.120 --> 00:04:26.799
+rich support for various types of attributes and objects.
+
+00:04:26.800 --> 00:04:31.919
+The HTML backend has had a few things boosted up and well,
+
+00:04:31.920 --> 00:04:33.519
+if you want to see the full list,
+
+00:04:33.520 --> 00:04:36.519
+just take a look at the release notes.
+
+NOTE A collection of babel improvements
+
+00:04:36.520 --> 00:04:39.319
+We've also seen a similar collection of improvements
+
+00:04:39.320 --> 00:04:43.519
+with the Babel backends. Once again, this is scattered--
+
+00:04:43.520 --> 00:04:46.519
+or well, it can be split into two sets of changes.
+
+00:04:46.520 --> 00:04:49.599
+There's some which affect all of Babel, essentially.
+
+00:04:49.600 --> 00:04:52.599
+For instance, the new syntax of parsing
+
+00:04:52.600 --> 00:04:56.479
+the raw content of code blocks, or the changes with Noweb.
+
+00:04:56.480 --> 00:05:01.919
+For example, :noweb-prefix is a new option that can be used.
+
+00:05:01.920 --> 00:05:03.239
+And then there's also a collection
+
+00:05:03.240 --> 00:05:07.439
+of backend-specific changes. So ASCII graphics with PlantUML
+
+00:05:07.440 --> 00:05:12.279
+or enhanced return capabilities with the ob-python library.
+
+NOTE A multitude of general org-mode improvements
+
+00:05:12.280 --> 00:05:17.479
+And then of course, as before, a whole collection
+
+00:05:17.480 --> 00:05:19.839
+of more changes which you can find in the release notes.
+
+00:05:19.840 --> 00:05:22.839
+Last but by no means least,
+
+00:05:22.840 --> 00:05:26.239
+there have been quite a few changes within the rest of Org.
+
+00:05:26.240 --> 00:05:30.839
+So this is, once again, far too many things to list,
+
+00:05:30.840 --> 00:05:33.759
+but it's things like improved refiling,
+
+00:05:33.760 --> 00:05:36.639
+capture templates, image preview sizing,
+
+00:05:36.640 --> 00:05:38.159
+clocktable settings, agenda tweaks,
+
+00:05:38.160 --> 00:05:41.159
+and well, a whole lot more.
+
+00:05:41.160 --> 00:05:45.039
+Yes, basically, the essence of what's here
+
+00:05:45.040 --> 00:05:47.999
+is a lot of little changes
+
+00:05:48.000 --> 00:05:50.799
+which just address particular use cases in ways
+
+00:05:50.800 --> 00:05:55.052
+that I don't think anybody's going to be seeing
+
+00:05:55.053 --> 00:05:55.786
+the impact of all of them,
+
+00:05:55.787 --> 00:05:57.559
+but I think most people should at least
+
+00:05:57.560 --> 00:06:00.119
+find one or two things
+
+00:06:00.120 --> 00:06:04.159
+which actually improve their own usage.
+
+NOTE Citations
+
+00:06:04.160 --> 00:06:06.079
+Now these are the sort of assorted
+
+00:06:06.080 --> 00:06:07.399
+relatively minor improvements,
+
+00:06:07.400 --> 00:06:09.959
+but there are also some major ones.
+
+00:06:09.960 --> 00:06:12.159
+And one in particular, citations.
+
+00:06:12.160 --> 00:06:15.879
+So I think this has been, at this point,
+
+00:06:15.880 --> 00:06:17.079
+over a decade in the making,
+
+00:06:17.080 --> 00:06:21.919
+but Org finally has first-class support for citations.
+
+00:06:21.920 --> 00:06:23.759
+And I have to say, it is marvellous.
+
+00:06:23.760 --> 00:06:27.239
+You'd hope so, after the labour. I think it is.
+
+00:06:27.240 --> 00:06:30.119
+It can be said that it's actually worth the wait.
+
+00:06:30.120 --> 00:06:31.679
+I think out of the various options you've got now,
+
+00:06:31.680 --> 00:06:34.279
+(for example, the way that Pandoc
+
+00:06:34.280 --> 00:06:35.599
+and Markdown otherwise[??] do it)
+
+00:06:35.600 --> 00:06:40.519
+Org has a fantastically succinct and flexible
+
+00:06:40.520 --> 00:06:45.959
+syntax for citations, which scales really well for all sorts
+
+00:06:45.960 --> 00:06:47.199
+of different use cases.
+
+00:06:47.200 --> 00:06:51.159
+Additionally, on the backend side of things,
+
+00:06:51.160 --> 00:06:55.359
+we've now got a generalised way for handling citations
+
+00:06:55.360 --> 00:06:57.839
+which has been quite helpful for the--I think
+
+00:06:57.840 --> 00:07:00.359
+I could say rather rapid development
+
+00:07:00.360 --> 00:07:03.279
+of multiple citation backends for Org.
+
+00:07:03.280 --> 00:07:07.639
+And I think it's just fantastic, really, seeing
+
+00:07:07.640 --> 00:07:09.839
+how quickly Org has gone
+
+00:07:09.840 --> 00:07:12.239
+from having no support for citations
+
+00:07:12.240 --> 00:07:13.239
+at the start of this year
+
+00:07:13.240 --> 00:07:17.559
+to what can be described as
+
+00:07:17.560 --> 00:07:20.199
+a wonderfully rich and flexible support
+
+00:07:20.200 --> 00:07:23.559
+with, well, multiple backends for citations.
+
+00:07:23.560 --> 00:07:27.519
+I think that's something that we can really be proud of.
+
+00:07:27.520 --> 00:07:30.039
+And it's been a fantastic contribution
+
+00:07:30.040 --> 00:07:31.599
+for everybody involved in this process.
+
+NOTE Quality of life improvements
+
+00:07:31.600 --> 00:07:36.119
+Okay, so we've had features.
+
+00:07:36.120 --> 00:07:38.039
+There have also been a whole lot of
+
+00:07:38.040 --> 00:07:39.559
+quality of life improvements.
+
+00:07:39.560 --> 00:07:43.479
+Once again, many more than I can reasonably mention here.
+
+00:07:43.480 --> 00:07:46.079
+So I'm just going to flick it through
+
+00:07:46.080 --> 00:07:48.319
+a few of them. A few big ones though,
+
+NOTE Org fold
+
+00:07:48.320 --> 00:07:52.519
+Ihor is responsible for three lovely developments with Org,
+
+00:07:52.520 --> 00:07:55.119
+one of which is Org fold. So this is a generalisation
+
+00:07:55.120 --> 00:07:57.239
+of the way that content is folded in Org.
+
+00:07:57.240 --> 00:08:00.679
+And I think quite a few of you will actually underestimate
+
+00:08:00.680 --> 00:08:01.679
+how much can be folded in Org.
+
+00:08:01.680 --> 00:08:03.039
+It's not just a matter of headlines.
+
+00:08:03.040 --> 00:08:07.919
+It's headlines, code blocks, lists, environments,
+
+00:08:07.920 --> 00:08:10.519
+all sorts of things can actually be folded in Org.
+
+00:08:10.520 --> 00:08:14.679
+And the introduction of Org fold is important
+
+00:08:14.680 --> 00:08:18.919
+for two reasons. One is that it has allowed for
+
+00:08:18.920 --> 00:08:21.479
+text-property-based folding,
+
+00:08:21.480 --> 00:08:24.479
+which in Emacs versions less than 29
+
+00:08:24.480 --> 00:08:27.719
+has a huge difference in performance,
+
+00:08:27.720 --> 00:08:29.959
+which is particularly apparent with larger files.
+
+00:08:29.960 --> 00:08:32.639
+The second significant thing about this is that
+
+00:08:32.640 --> 00:08:36.479
+it now actually provides a more general way
+
+00:08:36.480 --> 00:08:39.879
+to actually describe changes to the folding structure.
+
+00:08:39.880 --> 00:08:42.559
+So before there was direct modification of
+
+00:08:42.560 --> 00:08:45.959
+messing with overlays scattered around the Org code base.
+
+00:08:45.960 --> 00:08:49.399
+Now we have a much more well organised system
+
+00:08:49.400 --> 00:08:53.319
+where we use Org fold to say what is and isn't folded
+
+00:08:53.320 --> 00:08:54.799
+and to manage the state of all of that,
+
+00:08:54.800 --> 00:08:59.239
+which is, I think, just from a sort of design,
+
+00:08:59.240 --> 00:09:02.479
+sort of project design approach, a much better system.
+
+NOTE Org element cache
+
+00:09:02.480 --> 00:09:06.599
+We've also got the Org element cache by Ihor.
+
+00:09:06.600 --> 00:09:09.239
+This is actually something which was discussed
+
+00:09:09.240 --> 00:09:12.039
+quite a while ago, but has somewhat stalled
+
+00:09:12.040 --> 00:09:14.679
+due to the difficulty of cache invalidation.
+
+00:09:14.680 --> 00:09:17.279
+Ihor has sunk a tremendous amount of effort into this
+
+00:09:17.280 --> 00:09:19.759
+and has improved it to the point
+
+00:09:19.760 --> 00:09:21.799
+where we've now actually been able to
+
+00:09:21.800 --> 00:09:25.639
+enable this by default. So what this basically does is
+
+00:09:25.640 --> 00:09:27.999
+it records lots of information
+
+00:09:28.000 --> 00:09:30.159
+about the structure of the Org document
+
+00:09:30.160 --> 00:09:34.119
+and allows for, well, with the appropriate modifications
+
+00:09:34.120 --> 00:09:37.359
+that Ihor has also made throughout the Org element library
+
+00:09:37.360 --> 00:09:41.559
+to use this information to speed up various operations
+
+00:09:41.560 --> 00:09:44.879
+based on the Org document syntax tree.
+
+00:09:44.880 --> 00:09:48.279
+And so this has been quite--
+
+00:09:48.280 --> 00:09:49.839
+the improvements have been scattered all over the place,
+
+00:09:49.840 --> 00:09:52.719
+but for a good example for libraries
+
+00:09:52.720 --> 00:09:57.719
+or anybody who's wanting to quickly map over Org elements
+
+00:09:57.720 --> 00:10:00.639
+is `org-element-cache-map', which now provides
+
+00:10:00.640 --> 00:10:04.559
+a much, much faster way to map over
+
+00:10:04.560 --> 00:10:07.359
+all of the Org elements in a document.
+
+NOTE Org persist
+
+00:10:07.360 --> 00:10:10.799
+This also ties into the third major feature from Ihor
+
+00:10:10.800 --> 00:10:13.919
+which I'd like to mention, which is Org persist.
+
+00:10:13.920 --> 00:10:17.959
+So this provides a method of persisting values
+
+00:10:17.960 --> 00:10:20.279
+across Emacs sessions, basically saving them
+
+00:10:20.280 --> 00:10:21.799
+to a file somewhere and loading them.
+
+00:10:21.800 --> 00:10:25.719
+Now this works for Elisp values and it also works for files,
+
+00:10:25.720 --> 00:10:29.679
+which we made use of with the improved capabilities
+
+00:10:29.680 --> 00:10:32.479
+for remote files and exports.
+
+00:10:32.480 --> 00:10:35.799
+This has also been used with the `org-element-cache' data.
+
+00:10:35.800 --> 00:10:37.479
+So now, if you've got a massive Org file
+
+00:10:37.480 --> 00:10:41.159
+and you open it once, that data can be saved to
+
+00:10:41.160 --> 00:10:44.319
+with the Org element cache to Org persist,
+
+00:10:44.320 --> 00:10:46.679
+and the next time you load this file
+
+00:10:46.680 --> 00:10:47.919
+in another Emacs session,
+
+00:10:47.920 --> 00:10:50.959
+we can just start with the cached data
+
+00:10:50.960 --> 00:10:53.119
+instead of having to construct everything from scratch,
+
+00:10:53.120 --> 00:10:56.439
+which is quite nice. Once again, a change which
+
+00:10:56.440 --> 00:10:57.719
+much like the other ones,
+
+00:10:57.720 --> 00:11:00.359
+we will see more of an impact in larger files,
+
+00:11:00.360 --> 00:11:02.719
+but a very welcome one everywhere.
+
+NOTE More careful resource downloading
+
+00:11:02.720 --> 00:11:06.799
+Now with remote files, there's also been the beginnings
+
+00:11:06.800 --> 00:11:09.239
+of a bit of an effort with Org
+
+00:11:09.240 --> 00:11:13.119
+to improve the approach we have to safety.
+
+00:11:13.120 --> 00:11:14.999
+So in this case previously,
+
+00:11:15.000 --> 00:11:17.639
+Org would unconditionally download
+
+00:11:17.640 --> 00:11:19.559
+all the remotes of files that's all referenced.
+
+00:11:19.560 --> 00:11:23.759
+And now, it's actually going to maintain a list of
+
+00:11:23.760 --> 00:11:25.519
+sort of safe resources and prompt you
+
+00:11:25.520 --> 00:11:26.639
+when it's surprised by something,
+
+00:11:26.640 --> 00:11:29.886
+to work out whether it should
+
+00:11:29.887 --> 00:11:31.839
+just download this one resource,
+
+00:11:31.840 --> 00:11:35.279
+mark the whole domain as safe, and a few other options.
+
+00:11:35.280 --> 00:11:36.759
+We're also going to probably see
+
+00:11:36.760 --> 00:11:39.079
+a similar approach extend to, for instance,
+
+00:11:39.080 --> 00:11:40.199
+bits of Babel execution in the future.
+
+NOTE Bug fixes
+
+00:11:40.200 --> 00:11:45.359
+Okay bug fixes. It will be remiss of me not to mention that
+
+00:11:45.360 --> 00:11:46.919
+along with all of the features
+
+00:11:46.920 --> 00:11:49.359
+and quality of life improvements,
+
+00:11:49.360 --> 00:11:51.879
+there has been a huge pile of bug fixes.
+
+00:11:51.880 --> 00:11:57.319
+I think the best way to actually get a look at this
+
+00:11:57.320 --> 00:11:59.039
+would be to look at the release notes
+
+00:11:59.040 --> 00:12:00.599
+or maybe even the actual commit log,
+
+00:12:00.600 --> 00:12:04.119
+but you could also just take my word and say that
+
+00:12:04.120 --> 00:12:05.639
+there have been a whole load of them
+
+00:12:05.640 --> 00:12:11.599
+over the past year. So just yes, the code base, I think,
+
+00:12:11.600 --> 00:12:15.799
+is just gradually getting into better and better shape.
+
+NOTE Asynchronous session evaluation
+
+00:12:15.800 --> 00:12:18.199
+Asynchronous session evaluation is I think possibly
+
+00:12:18.200 --> 00:12:19.679
+the final quality-of-life improvement
+
+00:12:19.680 --> 00:12:22.119
+I want to mention. This came early in the year,
+
+00:12:22.120 --> 00:12:24.639
+just with ob-python, and it's been delayed
+
+00:12:24.640 --> 00:12:26.479
+because in order to actually make it work,
+
+00:12:26.480 --> 00:12:29.399
+they've required some fundamental changes to the way
+
+00:12:29.400 --> 00:12:31.079
+that ob-comint works.
+
+00:12:31.080 --> 00:12:33.599
+Now that's been implemented,
+
+00:12:33.600 --> 00:12:36.679
+we've since seen support extended to ob-R,
+
+00:12:36.680 --> 00:12:38.719
+and hopefully, we'll see more languages join this list
+
+00:12:38.720 --> 00:12:42.799
+in the not-too-distant future.
+
+NOTE Nicer tangle mode syntax
+
+00:12:42.800 --> 00:12:45.799
+Now I guess one bonus which I tacked on just for fun is
+
+00:12:45.800 --> 00:12:47.639
+it's now more convenient than ever
+
+00:12:47.640 --> 00:12:52.039
+to actually specify the permissions for tangled files.
+
+00:12:52.040 --> 00:12:54.999
+Previously you had to give a list expression
+
+00:12:55.000 --> 00:12:55.839
+which should be evaluated.
+
+00:12:55.840 --> 00:12:58.319
+Now you can give it directly in octal form
+
+00:12:58.320 --> 00:12:59.719
+instead of being a list expression
+
+00:12:59.720 --> 00:13:01.959
+that produces an integer representation
+
+00:13:01.960 --> 00:13:03.639
+of the octal permissions.
+
+00:13:03.640 --> 00:13:08.439
+Or you can use ls style: rwx and dashes.
+
+00:13:08.440 --> 00:13:13.079
+Or even just chmod. I want to be able to execute this
+
+00:13:13.080 --> 00:13:16.386
+as a user, which will basically modify
+
+00:13:16.387 --> 00:13:18.279
+the default permission to add that capability.
+
+NOTE A flourishing ecosystem
+
+00:13:18.280 --> 00:13:22.679
+Alrighty. So that's the Org project itself,
+
+00:13:22.680 --> 00:13:24.799
+but there's also a whole ecosystem.
+
+00:13:24.800 --> 00:13:27.439
+So what have we got here?
+
+00:13:27.440 --> 00:13:30.319
+Well a whole bunch of Zettelkasten
+
+00:13:30.320 --> 00:13:32.599
+or personal-knowledge-base-type projects.
+
+00:13:32.600 --> 00:13:36.239
+One of which is logseq, so that's an online open source
+
+00:13:36.240 --> 00:13:39.639
+Zettelkasten which supports both Markdown
+
+00:13:39.640 --> 00:13:41.799
+and also Org mode as a first-class format.
+
+00:13:41.800 --> 00:13:45.599
+Then of course we have Org Roam, which provides
+
+00:13:45.600 --> 00:13:48.879
+a Zettelkasten built directly on top of Org within Emacs.
+
+00:13:48.880 --> 00:13:51.639
+Both of these are seen considerably interesting
+
+00:13:51.640 --> 00:13:52.599
+over the past year.
+
+NOTE Org-modern
+
+00:13:52.600 --> 00:13:56.799
+Moving on to visuals, minad has produced
+
+00:13:56.800 --> 00:14:00.439
+another lovely minad package in the form of org-modern
+
+00:14:00.440 --> 00:14:04.559
+which just spruces up the visuals of all documents
+
+00:14:04.560 --> 00:14:09.519
+and seems to have been quite well received recently
+
+00:14:09.520 --> 00:14:10.119
+since its release.
+
+NOTE citeproc-org
+
+00:14:10.120 --> 00:14:13.159
+Building on top of the citations from earlier,
+
+00:14:13.160 --> 00:14:14.559
+Andras Simonyi has produced
+
+00:14:14.560 --> 00:14:16.559
+the wonderful citeproc-org library,
+
+00:14:16.560 --> 00:14:20.799
+which, if you're not familiar,
+
+00:14:20.800 --> 00:14:24.999
+allows the capabilities of the citation style language
+
+00:14:25.000 --> 00:14:26.639
+which has now become something
+
+00:14:26.640 --> 00:14:27.999
+which is quite widely supported
+
+00:14:28.000 --> 00:14:31.079
+to be used for Org citation exports.
+
+00:14:31.080 --> 00:14:33.799
+This means that you've got access to I think at this point
+
+00:14:33.800 --> 00:14:35.799
+is it thousands or tens of thousands
+
+00:14:35.800 --> 00:14:39.879
+of different bibliography and citation formats
+
+00:14:39.880 --> 00:14:42.919
+which is obviously a huge boon to org citations.
+
+00:14:42.920 --> 00:14:46.559
+Lastly, just to be slightly critical,
+
+00:14:46.560 --> 00:14:49.519
+I'm actually going to mention the Neovim Org mode project,
+
+00:14:49.520 --> 00:14:52.079
+because I think this really shows the interest
+
+00:14:52.080 --> 00:14:55.359
+in Org as the format, beyond just Emacs.
+
+00:14:55.360 --> 00:14:58.239
+I think I haven't gone into it much here,
+
+00:14:58.240 --> 00:15:00.919
+but there's been quite a lot of development
+
+00:15:00.920 --> 00:15:04.559
+with external tools making use of the Org format.
+
+00:15:04.560 --> 00:15:07.519
+Clearly, we've done quite a few things right,
+
+00:15:07.520 --> 00:15:11.599
+and so I think it's interesting to see the interest
+
+00:15:11.600 --> 00:15:13.319
+that exists outside of Emacs,
+
+00:15:13.320 --> 00:15:15.239
+even without all the lovely tooling we've built,
+
+00:15:15.240 --> 00:15:18.599
+just out of appreciation of the formatting, its potential.
+
+00:15:18.600 --> 00:15:21.079
+Speaking of the format, though,
+
+00:15:21.080 --> 00:15:24.159
+we've also seen three new parsers on the scene this year.
+
+00:15:24.160 --> 00:15:27.359
+We've got one in Julia, Haskell
+
+00:15:27.360 --> 00:15:28.599
+and another one for Tree sitter.
+
+00:15:28.600 --> 00:15:30.999
+The last one, I think, is currently the least capable,
+
+00:15:31.000 --> 00:15:32.479
+but also potentially the most interesting
+
+00:15:32.480 --> 00:15:36.959
+in terms of what possibilities it allows for.
+
+00:15:36.960 --> 00:15:42.079
+Okay. So that's a quick speed run through
+
+00:15:42.080 --> 00:15:44.039
+some of the developments over the past year.
+
+NOTE Continuing work on the Org format
+
+00:15:44.040 --> 00:15:47.959
+What's coming next? So there's been
+
+00:15:47.960 --> 00:15:50.999
+quite a lot of work done with the Org syntax document.
+
+00:15:51.000 --> 00:15:54.199
+In fact, I've completely written it,
+
+00:15:54.200 --> 00:15:57.239
+and we've now taken it up to spec
+
+00:15:57.240 --> 00:15:59.799
+to actually accurately describe the way
+
+00:15:59.800 --> 00:16:03.199
+that the Org format is, as of Org 9.6.
+
+00:16:03.200 --> 00:16:08.079
+Now, I think this is quite an important document
+
+00:16:08.080 --> 00:16:09.799
+for the growth in parsing tools
+
+00:16:09.800 --> 00:16:11.279
+to help actually ensure
+
+00:16:11.280 --> 00:16:16.439
+that the way that external tools process Org
+
+00:16:16.440 --> 00:16:20.079
+is actually in sync with the way that Org mode does.
+
+00:16:20.080 --> 00:16:22.559
+I think it's worth doing everything we can, really,
+
+00:16:22.560 --> 00:16:24.839
+to avoid the sort of implementation drift
+
+00:16:24.840 --> 00:16:27.719
+that we've seen with Markdown.
+
+00:16:27.720 --> 00:16:29.839
+I don't want anything near that.
+
+00:16:29.840 --> 00:16:32.486
+This is also quite good for the Org format itself because,
+
+00:16:32.487 --> 00:16:34.479
+in the process of going through this sort of effort,
+
+00:16:34.480 --> 00:16:38.199
+it brings attention to irregularities in the syntax
+
+00:16:38.200 --> 00:16:41.519
+which you might want to resolve, and as well as
+
+00:16:41.520 --> 00:16:43.919
+helping the robustness of org mode itself.
+
+00:16:43.920 --> 00:16:46.279
+So ultimately, this is to everybody's benefit, really.
+
+00:16:46.280 --> 00:16:51.799
+It's also my personal hope that this might actually
+
+00:16:51.800 --> 00:16:54.879
+get to the point where we consider submitting this
+
+00:16:54.880 --> 00:16:59.039
+as a text format to the Internet Engineering Task Force
+
+00:16:59.040 --> 00:17:06.319
+as a new text format. So that would be quite nice.
+
+NOTE Mailing list management
+
+00:17:06.320 --> 00:17:09.639
+The Org project itself has a layer on top
+
+00:17:09.640 --> 00:17:13.679
+of the mailing list called Woof developed by Bastien,
+
+00:17:13.680 --> 00:17:16.119
+and that's about to have another major release.
+
+00:17:16.120 --> 00:17:21.359
+So what this is going to do is improve the ease of which
+
+00:17:21.360 --> 00:17:23.319
+we can actually monitor what's going on
+
+00:17:23.320 --> 00:17:27.079
+with the mailing list. So this is when people have patches,
+
+00:17:27.080 --> 00:17:29.599
+bug reports, or other types of things
+
+00:17:29.600 --> 00:17:30.519
+raised on the mailing list.
+
+00:17:30.520 --> 00:17:34.039
+It's a nice way to collect the status of those
+
+00:17:34.040 --> 00:17:35.039
+and put them all in one place.
+
+00:17:35.040 --> 00:17:37.879
+So improvements to this improve the ease of which
+
+00:17:37.880 --> 00:17:40.399
+the Org mode project can be managed,
+
+00:17:40.400 --> 00:17:41.919
+which is always quite nice to see.
+
+NOTE Further engraving
+
+00:17:41.920 --> 00:17:46.319
+There's also been--jumping back to the export
+
+00:17:46.320 --> 00:17:48.359
+which is mentioned right at the start of this presentation--
+
+00:17:48.360 --> 00:17:51.839
+we've got the introduction of engraved faces
+
+00:17:51.840 --> 00:17:54.479
+to LaTeX export. Now what's quite interesting about this
+
+00:17:54.480 --> 00:17:57.599
+is that it's actually used as Emacs' native font lock
+
+00:17:57.600 --> 00:18:01.239
+and allows for processing that in a generalized way
+
+00:18:01.240 --> 00:18:03.839
+to different output formats. So at the moment,
+
+00:18:03.840 --> 00:18:06.919
+this is just integrated with ox-latex,
+
+00:18:06.920 --> 00:18:11.199
+but it contains the functionality needed for HTML and ASCII,
+
+00:18:11.200 --> 00:18:13.719
+and it could also be extended to other formats like ODT.
+
+00:18:13.720 --> 00:18:18.279
+So we could potentially have full syntax highlighting
+
+00:18:18.280 --> 00:18:20.959
+based on Emacs exported to, well,
+
+00:18:20.960 --> 00:18:24.199
+really all of the Org mode backends,
+
+00:18:24.200 --> 00:18:27.359
+except, I suppose, the plain text ones like Markdown.
+
+00:18:27.360 --> 00:18:29.759
+And I think from both the capabilities perspective--
+
+00:18:29.760 --> 00:18:33.039
+because I think, really, font lock in Emacs
+
+00:18:33.040 --> 00:18:34.199
+from Emacs major modes
+
+00:18:34.200 --> 00:18:37.159
+tends to blow basically everything else vaguely used
+
+00:18:37.160 --> 00:18:39.239
+out of the water, whether it be listings, minted
+
+00:18:39.240 --> 00:18:44.999
+or other efforts--and also from a consistency point of view,
+
+00:18:45.000 --> 00:18:49.719
+this could be quite a nice development.
+
+00:18:49.720 --> 00:18:51.119
+Alrighty. Now this talk is "This Year in Org,"
+
+00:18:51.120 --> 00:18:52.599
+and I think you all may have guessed
+
+00:18:52.600 --> 00:18:57.759
+this is very much tied into my work with This Month in Org
+
+00:18:57.760 --> 00:19:00.119
+which started, I think, a bit over a year ago.
+
+00:19:00.120 --> 00:19:04.919
+And so, as you're all avid readers,
+
+00:19:04.920 --> 00:19:05.919
+I'm sure you've noticed
+
+00:19:05.920 --> 00:19:08.519
+that there haven't been as many posts as of late.
+
+00:19:08.520 --> 00:19:11.879
+Now this isn't because my interest in This Month in Org
+
+00:19:11.880 --> 00:19:15.879
+has been diminishing. Simply, it's the consequence
+
+00:19:15.880 --> 00:19:18.759
+of an evaporation of my free time.
+
+00:19:18.760 --> 00:19:22.359
+However, This Month in Org is still going to stick around.
+
+00:19:22.360 --> 00:19:26.159
+The only change really is that the title is going to be--
+
+00:19:26.160 --> 00:19:27.999
+probably continue to be
+
+00:19:28.000 --> 00:19:30.039
+a bit more aspirational than descriptive
+
+00:19:30.040 --> 00:19:32.959
+in the near future. We'll see how this goes.
+
+00:19:32.960 --> 00:19:36.719
+Well, thanks for listening to this overview
+
+00:19:36.720 --> 00:19:38.599
+of the state of Org at the moment,
+
+00:19:38.600 --> 00:19:51.880
+and hopefully, I'll see you next year.
diff --git a/2022/captions/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.vtt b/2022/captions/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.vtt
new file mode 100644
index 00000000..21f8c560
--- /dev/null
+++ b/2022/captions/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.vtt
@@ -0,0 +1,852 @@
+WEBVTT captioned by eduardo
+Kind: captions:
+Language: en-GB
+
+00:00:00.000 --> 00:00:04.000
+Hi! My name is Eduardo Ochs. I'm the author
+
+00:00:04.000 --> 00:00:06.000
+of an Emacs package called eev...
+
+00:00:06.000 --> 00:00:10.000
+and eev is about taking executable notes
+
+00:00:10.000 --> 00:00:13.000
+of everything that you do, and this
+
+00:00:13.000 --> 00:00:16.000
+presentation is about how I use this...
+
+00:00:16.000 --> 00:00:18.000
+how I finally found a way to take
+
+00:00:18.000 --> 00:00:22.000
+executable notes of what the python docs
+
+00:00:22.000 --> 00:00:23.000
+say.
+
+00:00:23.000 --> 00:00:28.000
+Let me explain that in another way. I've
+
+00:00:28.000 --> 00:00:31.000
+try to Learn Python many times, but
+
+00:00:31.000 --> 00:00:34.000
+hm, my brain is wired in a weird way, so
+
+00:00:34.000 --> 00:00:37.000
+it didn't work... and finally a few
+
+00:00:37.000 --> 00:00:40.000
+months ago I found a way of studying
+
+00:00:40.000 --> 00:00:44.000
+Python that finally clicked for me.
+
+00:00:44.000 --> 00:00:47.000
+The idea is that... well, it's here in
+
+00:00:47.000 --> 00:00:50.000
+the title - is a way to create short
+
+00:00:50.000 --> 00:00:52.000
+hyperlinks to the
+
+00:00:52.000 --> 00:00:54.000
+documentation of python.
+
+00:00:54.000 --> 00:00:56.000
+Here's an example.
+
+00:00:56.000 --> 00:01:00.000
+This file contains some some chunks
+
+00:01:00.000 --> 00:01:03.000
+of code from the Python tutorial and
+
+00:01:03.000 --> 00:01:05.000
+some links to the places in which
+
+00:01:05.000 --> 00:01:07.000
+I found these chunks of code.
+
+00:01:07.000 --> 00:01:12.000
+for example, if I run this link here
+
+00:01:12.000 --> 00:01:14.000
+it opens a certain page of the Python
+
+00:01:14.000 --> 00:01:18.000
+tutorial in my browser - note that it
+
+00:01:18.000 --> 00:01:19.000
+opens the local copy of the
+
+00:01:19.000 --> 00:01:22.000
+documentation -
+
+00:01:22.000 --> 00:01:25.000
+and if I
+
+00:01:25.000 --> 00:01:29.000
+run this link here it opens the source
+
+00:01:29.000 --> 00:01:30.000
+in .rst
+
+00:01:30.000 --> 00:01:34.000
+of the same page. So the first link opens
+
+00:01:34.000 --> 00:01:37.000
+the HTML and this one opens the
+
+00:01:37.000 --> 00:01:39.000
+RST. This is useful because in the
+
+00:01:39.000 --> 00:01:40.000
+beginning
+
+00:01:40.000 --> 00:01:44.000
+I was copying these chunks of code in
+
+00:01:44.000 --> 00:01:46.000
+the obvious way - I would simply
+
+00:01:46.000 --> 00:01:50.000
+visit the the documentation in HTML and
+
+00:01:50.000 --> 00:01:51.000
+I would mark
+
+00:01:51.000 --> 00:01:54.000
+a chunk... a snippet of code here and I
+
+00:01:54.000 --> 00:01:58.000
+would copy it to my notes.
+
+00:01:58.000 --> 00:02:01.000
+And then after a while I
+
+00:02:01.000 --> 00:02:03.000
+realized that it was much easier to
+
+00:02:03.000 --> 00:02:07.000
+simply go to the RST sources and to copy
+
+00:02:07.000 --> 00:02:10.000
+the chunks of code from there... and
+
+00:02:10.000 --> 00:02:14.000
+note that these links look quite similar.
+
+00:02:14.000 --> 00:02:17.000
+There's one difference here, that is
+
+00:02:17.000 --> 00:02:20.000
+this `r` that is prepended to the name
+
+00:02:20.000 --> 00:02:23.000
+of the function... the `r` means
+
+00:02:23.000 --> 00:02:26.000
+"open the RST"...
+
+00:02:26.000 --> 00:02:30.000
+and if I use the suffix `w` it means
+
+00:02:30.000 --> 00:02:32.000
+use the documentation on the web instead
+
+00:02:32.000 --> 00:02:34.000
+of using the local copy.
+
+00:02:34.000 --> 00:02:36.000
+So this one
+
+00:02:36.000 --> 00:02:38.000
+opens a local copy
+
+00:02:38.000 --> 00:02:42.000
+and this one
+
+00:02:42.000 --> 00:02:46.000
+takes a while
+
+00:02:46.000 --> 00:02:49.000
+and opens the
+
+00:02:49.000 --> 00:02:52.000
+the page of the documentation in the
+
+00:02:52.000 --> 00:02:56.000
+site of Python blah blah...
+
+00:02:56.000 --> 00:02:58.000
+and this thing here is
+
+00:02:58.000 --> 00:03:02.000
+executable in the usual eev sense, that
+
+00:03:02.000 --> 00:03:05.000
+we ca... if we type f8 several times here
+
+00:03:05.000 --> 00:03:08.000
+the f8s on the lines that start
+
+00:03:08.000 --> 00:03:12.000
+with red stars create a target buffer
+
+00:03:12.000 --> 00:03:14.000
+here... and in this case it creates a
+
+00:03:14.000 --> 00:03:17.000
+target buffer running Python, and if I
+
+00:03:17.000 --> 00:03:20.000
+type f8 on these other lines these are
+
+00:03:20.000 --> 00:03:23.000
+the lines are sent
+
+00:03:23.000 --> 00:03:25.000
+to that REPL.
+
+00:03:25.000 --> 00:03:30.000
+But anyway, let me go back.
+
+00:03:30.000 --> 00:03:32.000
+Most of the things that I'm going to
+
+00:03:32.000 --> 00:03:35.000
+present here are in the tutorial of this...
+
+00:03:35.000 --> 00:03:37.000
+package...
+
+00:03:37.000 --> 00:03:41.000
+we can go to the source code
+
+00:03:41.000 --> 00:03:44.000
+here in the eev directory - it's a file
+
+00:03:44.000 --> 00:03:50.000
+called eev-rstdoc.el but the best
+
+00:03:50.000 --> 00:03:53.000
+docs are in the tutorial, here...
+
+00:03:53.000 --> 00:03:56.000
+and the tutorial also has some
+
+00:03:56.000 --> 00:03:58.000
+executable
+
+00:03:58.000 --> 00:04:02.000
+chunks... some snippets of python
+
+00:04:02.000 --> 00:04:05.000
+code that are executable, but they
+
+00:04:05.000 --> 00:04:07.000
+don't have those nice colors... so
+
+00:04:07.000 --> 00:04:11.000
+apologies for that.
+
+00:04:11.000 --> 00:04:13.000
+We need to run this thing here to make
+
+00:04:13.000 --> 00:04:15.000
+everything work.
+
+00:04:15.000 --> 00:04:17.000
+This thing will define some functions
+
+00:04:17.000 --> 00:04:19.000
+with funny names that I will
+
+00:04:19.000 --> 00:04:26.000
+explain later.
+
+00:04:26.000 --> 00:04:30.000
+Let me explain something new.
+
+00:04:30.000 --> 00:04:35.000
+let's compare all these
+
+00:04:35.000 --> 00:04:38.000
+links here. They take this argument
+
+00:04:38.000 --> 00:04:41.000
+here and they expand the the argument in
+
+00:04:41.000 --> 00:04:44.000
+a certain way. For example this string is
+
+00:04:44.000 --> 00:04:49.000
+expanded to this long URL here... note that
+
+00:04:49.000 --> 00:04:52.000
+it got a prefix here,
+
+00:04:52.000 --> 00:04:56.000
+that's quite long... it got the .html here,
+
+00:04:56.000 --> 00:04:59.000
+and then the hash and the anchor here...
+
+00:04:59.000 --> 00:05:03.000
+and each one of the functions in the
+
+00:05:03.000 --> 00:05:06.000
+pydoc family expands this
+
+00:05:06.000 --> 00:05:09.000
+argument in a different way.
+
+00:05:09.000 --> 00:05:12.000
+The one that that opens the doc in the
+
+00:05:12.000 --> 00:05:16.000
+web uses another prefix -
+
+00:05:16.000 --> 00:05:20.000
+this one - and the one that opens the rst
+
+00:05:20.000 --> 00:05:24.000
+file ignores the part after the hash
+
+00:05:24.000 --> 00:05:28.000
+for technical reasons... I was never
+
+00:05:28.000 --> 00:05:30.000
+able to to find a good way to convert
+
+00:05:30.000 --> 00:05:33.000
+this hash into a string to search for,
+
+00:05:33.000 --> 00:05:35.000
+so to make something that goes to
+
+00:05:35.000 --> 00:05:38.000
+the right section in the link to the rst
+
+00:05:38.000 --> 00:05:42.000
+doc I have to convert by hand, and by
+
+00:05:42.000 --> 00:05:46.000
+trial and error, this thing here into a
+
+00:05:46.000 --> 00:05:48.000
+pointer to that section, like
+
+00:05:48.000 --> 00:05:50.000
+this one...
+
+00:05:50.000 --> 00:05:55.000
+in which the "_numeric-types:"
+
+00:05:55.000 --> 00:05:58.000
+is here.
+
+00:05:58.000 --> 00:06:02.000
+So all these links here are based on
+
+00:06:02.000 --> 00:06:04.000
+expansion, and this is easy to
+
+00:06:04.000 --> 00:06:05.000
+understand...
+
+00:06:05.000 --> 00:06:08.000
+but suppose that I want to
+
+00:06:08.000 --> 00:06:11.000
+create a link like this, or suppose that
+
+00:06:11.000 --> 00:06:16.000
+I'm browsing the docs here
+
+00:06:16.000 --> 00:06:21.000
+and I just I follow some some links...
+
+00:06:21.000 --> 00:06:31.000
+let me do something random here...
+
+00:06:31.000 --> 00:06:34.000
+suppose that I decide that this
+
+00:06:34.000 --> 00:06:35.000
+section is very interesting. How can I
+
+00:06:35.000 --> 00:06:39.000
+create a link to that? I can
+
+00:06:39.000 --> 00:06:44.000
+use this pilcrow symbol and the
+
+00:06:44.000 --> 00:06:45.000
+"Copy link address",
+
+00:06:45.000 --> 00:06:49.000
+and copy the link to
+
+00:06:49.000 --> 00:06:51.000
+my notes...
+
+00:06:51.000 --> 00:06:55.000
+and then the Python family...
+
+00:06:55.000 --> 00:06:58.000
+well, we saw the the functions in the
+
+00:06:58.000 --> 00:07:00.000
+Python family have a certain way - have
+
+00:07:00.000 --> 00:07:03.000
+several ways of expanding these
+
+00:07:03.000 --> 00:07:06.000
+short arguments... and they also have a
+
+00:07:06.000 --> 00:07:07.000
+certain way of
+
+00:07:07.000 --> 00:07:11.000
+shortening URLs like this one. If I type
+
+00:07:11.000 --> 00:07:12.000
+`M-x pdk` the message is this one.
+
+00:07:12.000 --> 00:07:17.000
+`pdk` is a mnemonic for
+
+00:07:17.000 --> 00:07:20.000
+"Python doc kill", and this
+
+00:07:20.000 --> 00:07:23.000
+"kill" means "copy to the kill ring"
+
+00:07:23.000 --> 00:07:27.000
+so if I type `M-x pdk` here it
+
+00:07:27.000 --> 00:07:31.000
+considers that this thing is a link
+
+00:07:31.000 --> 00:07:34.000
+to the python Docs, and it
+
+00:07:34.000 --> 00:07:36.000
+shortens this link in a certain way, and
+
+00:07:36.000 --> 00:07:42.000
+it kills a short link.
+
+00:07:42.000 --> 00:07:45.000
+I can insert the short link with C-y
+
+00:07:45.000 --> 00:07:46.000
+(yank)
+
+00:07:46.000 --> 00:07:49.000
+and then I can test this link to be sure
+
+00:07:49.000 --> 00:07:52.000
+that it points to where I want, and
+
+00:07:52.000 --> 00:07:55.000
+then I can delete this thing, and ta-da,
+
+00:07:55.000 --> 00:07:57.000
+now I have a short link, and of course I
+
+00:07:57.000 --> 00:08:00.000
+can modify this link by adding a suffix
+
+00:08:00.000 --> 00:08:02.000
+here...
+
+00:08:02.000 --> 00:08:06.000
+and in this case here
+
+00:08:06.000 --> 00:08:09.000
+I will have to change the identifier
+
+00:08:09.000 --> 00:08:12.000
+to something else...
+
+00:08:12.000 --> 00:08:18.000
+but I'm not going to do that now.
+
+00:08:18.000 --> 00:08:20.000
+This module of eev comes with three
+
+00:08:20.000 --> 00:08:24.000
+families predefined. One is a family that
+
+00:08:24.000 --> 00:08:26.000
+points to the the documentation of
+
+00:08:26.000 --> 00:08:28.000
+Python itself, another one points the
+
+00:08:28.000 --> 00:08:30.000
+documentation of SymPy, that is a program
+
+00:08:30.000 --> 00:08:34.000
+for symbolic computation, like for doing
+
+00:08:34.000 --> 00:08:37.000
+mathematics equations...
+
+00:08:37.000 --> 00:08:40.000
+and the other one points to the
+
+00:08:40.000 --> 00:08:43.000
+documentation of MatPlotLib.
+
+00:08:43.000 --> 00:08:47.000
+How do these families work?
+
+00:08:47.000 --> 00:08:51.000
+Each family has to be defined in two
+
+00:08:51.000 --> 00:08:53.000
+parts.
+
+00:08:53.000 --> 00:08:55.000
+Remember that
+
+00:08:55.000 --> 00:08:58.000
+eev has lots of functions
+
+00:08:58.000 --> 00:09:03.000
+like this one... this one
+
+00:09:03.000 --> 00:09:06.000
+is the most basic, and it is explained
+
+00:09:06.000 --> 00:09:08.000
+here, in this section of the main
+
+00:09:08.000 --> 00:09:13.000
+tutorial. This section explains that
+
+00:09:13.000 --> 00:09:16.000
+a sexp like this one produces lots of
+
+00:09:16.000 --> 00:09:19.000
+functions - produces a family of
+
+00:09:19.000 --> 00:09:23.000
+functions - and it does that by producing
+
+00:09:23.000 --> 00:09:25.000
+a certain chunk of code and then
+
+00:09:25.000 --> 00:09:28.000
+executing this chunk of code... and if we
+
+00:09:28.000 --> 00:09:31.000
+add a certain prefix here... `find-` and we
+
+00:09:31.000 --> 00:09:35.000
+execute this we can... instead of executing
+
+00:09:35.000 --> 00:09:37.000
+that chunk of code we can see what is
+
+00:09:37.000 --> 00:09:39.000
+that chunk of code. In the case of `code-c-d`
+
+00:09:39.000 --> 00:09:43.000
+it is this. It is a `setq`, several
+
+00:09:43.000 --> 00:09:47.000
+`defun`s, and some comments here, with
+
+00:09:47.000 --> 00:09:49.000
+links to the documentation.
+
+00:09:49.000 --> 00:09:52.000
+In the case of rstdoc it's the same.
+
+00:09:52.000 --> 00:09:54.000
+We have this function here that defines
+
+00:09:54.000 --> 00:09:56.000
+the function in the python family...
+
+00:09:56.000 --> 00:09:59.000
+and we can run this to understand what
+
+00:09:59.000 --> 00:10:03.000
+this `code-rstdoc` does.
+
+00:10:03.000 --> 00:10:05.000
+It creates this temporary buffer here...
+
+00:10:05.000 --> 00:10:09.000
+with lots of `defun`s, a `code-c-d` here,
+
+00:10:09.000 --> 00:10:10.000
+and lots of comments here... and the
+
+00:10:10.000 --> 00:10:13.000
+comments include some tests. For example
+
+00:10:13.000 --> 00:10:16.000
+we can use these functions here to test
+
+00:10:16.000 --> 00:10:21.000
+how the expansion works.
+
+00:10:21.000 --> 00:10:23.000
+And
+
+00:10:23.000 --> 00:10:26.000
+note that in this buffer here we don't
+
+00:10:26.000 --> 00:10:28.000
+have the paths that that this family
+
+00:10:28.000 --> 00:10:31.000
+uses. We don't have for example
+
+00:10:31.000 --> 00:10:33.000
+the URL that points to the site of
+
+00:10:33.000 --> 00:10:36.000
+Python, to the directory that contains
+
+00:10:36.000 --> 00:10:40.000
+the reference manual, or whatever... all
+
+00:10:40.000 --> 00:10:42.000
+these things are in another part of the
+
+00:10:42.000 --> 00:10:44.000
+definition of that family - that is a
+
+00:10:44.000 --> 00:10:45.000
+variable.
+
+00:10:45.000 --> 00:10:48.000
+If we execute this we go to the
+
+00:10:48.000 --> 00:10:50.000
+source code of eev-rstdoc,
+
+00:10:50.000 --> 00:10:54.000
+to the parts in which
+
+00:10:54.000 --> 00:10:57.000
+this variable is defined...
+
+00:10:57.000 --> 00:10:59.000
+and
+
+00:10:59.000 --> 00:11:01.000
+for each family we have a variable like
+
+00:11:01.000 --> 00:11:02.000
+this,
+
+00:11:02.000 --> 00:11:05.000
+whose value is a property
+
+00:11:05.000 --> 00:11:07.000
+list with several fields...
+
+00:11:07.000 --> 00:11:09.000
+these first fields are very easy to
+
+00:11:09.000 --> 00:11:10.000
+understand - they are used in the
+
+00:11:10.000 --> 00:11:16.000
+expansion... this one too. And these
+
+00:11:16.000 --> 00:11:19.000
+two fields are used in the shrinking -
+
+00:11:19.000 --> 00:11:21.000
+in the shortening - and
+
+00:11:21.000 --> 00:11:25.000
+this field here
+
+00:11:25.000 --> 00:11:28.000
+tells what is the name of the
+
+00:11:28.000 --> 00:11:30.000
+killing function
+
+00:11:30.000 --> 00:11:33.000
+so the fields of this thing here are
+
+00:11:33.000 --> 00:11:34.000
+used
+
+00:11:34.000 --> 00:11:36.000
+to generate...
+
+00:11:36.000 --> 00:11:39.000
+some fields are used to generate the
+
+00:11:39.000 --> 00:11:41.000
+code that appears here, and some fields
+
+00:11:41.000 --> 00:11:44.000
+are simply
+
+00:11:44.000 --> 00:11:47.000
+read by functions like this one, that
+
+00:11:47.000 --> 00:11:51.000
+consults the variable.
+
+00:11:51.000 --> 00:11:53.000
+Now the natural question is: how can we
+
+00:11:53.000 --> 00:11:57.000
+define new families? Or: how can we change
+
+00:11:57.000 --> 00:11:59.000
+a family like this one to point to
+
+00:11:59.000 --> 00:12:03.000
+another version of Python?
+
+00:12:03.000 --> 00:12:06.000
+There are some template-based functions
+
+00:12:06.000 --> 00:12:09.000
+for doing that. They are explained in
+
+00:12:09.000 --> 00:12:10.000
+this section of the tutorial...
+
+00:12:10.000 --> 00:12:14.000
+where is that?...
+
+00:12:14.000 --> 00:12:17.000
+oh God, it's far away...
+
+00:12:17.000 --> 00:12:20.000
+here.
+
+00:12:20.000 --> 00:12:23.000
+Suppose that we have a package foo, that
+
+00:12:23.000 --> 00:12:25.000
+we want to create a family that points
+
+00:12:25.000 --> 00:12:27.000
+to the docs
+
+00:12:27.000 --> 00:12:31.000
+of that package foo... so, we
+
+00:12:31.000 --> 00:12:32.000
+can execute this thing here, and it
+
+00:12:32.000 --> 00:12:34.000
+generates this
+
+00:12:34.000 --> 00:12:37.000
+this thing from a template.
+
+00:12:37.000 --> 00:12:40.000
+If we just want to modify a current
+
+00:12:40.000 --> 00:12:42.000
+definition we can run something like
+
+00:12:42.000 --> 00:12:44.000
+this - note that the family `:py`
+
+00:12:44.000 --> 00:12:47.000
+already exists, and instead of using
+
+00:12:47.000 --> 00:12:51.000
+placeholders in some of these
+
+00:12:51.000 --> 00:12:53.000
+URLs it will use the current values of
+
+00:12:53.000 --> 00:12:55.000
+the fields...
+
+00:12:55.000 --> 00:12:59.000
+so we can also use this modify
+
+00:12:59.000 --> 00:13:01.000
+existing families.
+
+00:13:01.000 --> 00:13:05.000
+Well these are the technical details.
+
+00:13:05.000 --> 00:13:08.000
+Now the natural question is: why do I
+
+00:13:08.000 --> 00:13:12.000
+want this? This doesn't
+
+00:13:12.000 --> 00:13:14.000
+any sense to me! Why should I
+
+00:13:14.000 --> 00:13:15.000
+try this?
+
+00:13:15.000 --> 00:13:18.000
+And the best answer: is for most people
+
+00:13:18.000 --> 00:13:21.000
+this way of using
+
+00:13:21.000 --> 00:13:24.000
+executable notes do not make any sense
+
+00:13:24.000 --> 00:13:27.000
+at all at first sight...
+
+00:13:27.000 --> 00:13:30.000
+so what I'm trying to do is: I'm trying
+
+00:13:30.000 --> 00:13:33.000
+to write to these tutorials with
+
+00:13:33.000 --> 00:13:35.000
+many examples that are very easy to run,
+
+00:13:35.000 --> 00:13:38.000
+and that examine data structures,
+
+00:13:38.000 --> 00:13:40.000
+and functions, and test things,
+
+00:13:40.000 --> 00:13:46.000
+and so on... so my main argument
+
+00:13:46.000 --> 00:13:48.000
+for convincing people to
+
+00:13:48.000 --> 00:13:52.000
+test this is: this is trivial to test -
+
+00:13:52.000 --> 00:13:54.000
+simply install eev and run this thing
+
+00:13:54.000 --> 00:13:56.000
+here, and run the examples, and probably
+
+00:13:56.000 --> 00:13:58.000
+you're going to find that this
+
+00:13:58.000 --> 00:14:01.000
+tutorial is fun to follow.
+
+00:14:01.000 --> 00:14:03.000
+So that's it! =)
diff --git a/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.vtt b/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.vtt
new file mode 100644
index 00000000..7365f8e9
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.vtt
@@ -0,0 +1,1133 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:02.160
+ We'll hit start recording.
+
+00:00:02.160 --> 00:00:03.400
+ All right, everyone.
+
+00:00:03.400 --> 00:00:05.840
+ Thanks, Andrew, for the great talk.
+
+00:00:05.840 --> 00:00:06.840
+ Super cool.
+
+00:00:06.840 --> 00:00:09.240
+ So now we have the live Q&A with Andrew.
+
+00:00:09.240 --> 00:00:12.440
+ Folks, you can start by asking your questions on the pad.
+
+00:00:12.440 --> 00:00:14.680
+ And we will also open up this big blue button
+
+00:00:14.680 --> 00:00:17.160
+ room in a few minutes for folks who
+
+00:00:17.160 --> 00:00:19.920
+ want to join here and ask questions here directly
+
+00:00:19.920 --> 00:00:21.320
+ to Andrew.
+
+00:00:21.320 --> 00:00:24.080
+ Thanks again, and take it away, Andrew.
+
+00:00:24.080 --> 00:00:26.400
+ OK, thank you.
+
+00:00:26.400 --> 00:00:29.720
+ Let's start from pod questions.
+
+00:00:29.720 --> 00:00:35.560
+ The first one, do I use this to have multiple configs
+
+00:00:35.560 --> 00:00:35.880
+ running
+
+00:00:35.880 --> 00:00:39.560
+ side by side for deep comparison?
+
+00:00:39.560 --> 00:00:43.920
+ Actually, I have two configurations primary here.
+
+00:00:43.920 --> 00:00:46.640
+ The first one is my main configuration
+
+00:00:46.640 --> 00:00:51.600
+ for the whole environment, which manages all the dot files.
+
+00:00:51.600 --> 00:00:55.080
+ And the second one is virtualenv-like.
+
+00:00:55.080 --> 00:00:59.600
+ It creates a new shell with some environment variables.
+
+00:00:59.600 --> 00:01:01.000
+ It's set inside it.
+
+00:01:01.000 --> 00:01:05.920
+ And it includes Emacs load path and other things
+
+00:01:05.920 --> 00:01:10.240
+ to make Emacs able to explore packages
+
+00:01:10.240 --> 00:01:13.040
+ inside this small environment.
+
+00:01:13.040 --> 00:01:18.120
+ And it removes all unnecessary environment variables,
+
+00:01:18.120 --> 00:01:20.160
+ which pollutes the environment.
+
+00:01:20.160 --> 00:01:25.800
+ So we have quite a small scope on which only Emacs
+
+00:01:25.800 --> 00:01:28.480
+ and a few other packages are available.
+
+00:01:28.480 --> 00:01:31.280
+ And as you saw at the end of the talk,
+
+00:01:31.280 --> 00:01:33.880
+ it was the example of such small environment
+
+00:01:33.880 --> 00:01:38.500
+ where I set up Emacs and all the dependencies from ground
+
+00:01:38.500 --> 00:01:38.920
+ up.
+
+00:01:38.920 --> 00:01:40.760
+ And actually, the similar thing I
+
+00:01:40.760 --> 00:01:43.760
+ use for development of my projects,
+
+00:01:43.760 --> 00:01:45.440
+ I have their project environments
+
+00:01:45.440 --> 00:01:47.640
+ made in the same way.
+
+00:01:47.640 --> 00:01:52.400
+ But usually, I use my primary Emacs instance.
+
+00:01:52.400 --> 00:01:55.880
+ But sometimes, it can be kind of mixed.
+
+00:01:55.880 --> 00:01:59.080
+ I have a few talks on my YouTube channel.
+
+00:01:59.080 --> 00:02:03.630
+ And you can check them out to get more information about it
+
+00:02:03.630 --> 00:02:04.000
+.
+
+00:02:04.000 --> 00:02:04.560
+ The second--
+
+00:02:04.560 --> 00:02:05.060
+ Sorry.
+
+00:02:05.060 --> 00:02:06.320
+ One quick request, Andrew.
+
+00:02:06.320 --> 00:02:08.780
+ People are saying if you could maybe speak up a little bit
+
+00:02:08.780 --> 00:02:11.170
+ more so that they could hear you better, that would be
+
+00:02:11.170 --> 00:02:11.760
+ great.
+
+00:02:11.760 --> 00:02:12.840
+ OK, sure.
+
+00:02:12.840 --> 00:02:14.560
+ Thank you.
+
+00:02:14.560 --> 00:02:16.760
+ The second question.
+
+00:02:16.760 --> 00:02:20.080
+ Are you using Gix system or Gix on top of another distro?
+
+00:02:20.080 --> 00:02:22.480
+ If system, any tips?
+
+00:02:22.480 --> 00:02:24.920
+ I tried Gix system, but found getting started
+
+00:02:24.920 --> 00:02:27.760
+ was very difficult due to lack of Wi-Fi firmware
+
+00:02:27.760 --> 00:02:31.640
+ and incomplete documentation.
+
+00:02:31.640 --> 00:02:35.280
+ Personally, I use Gix system, Gix home,
+
+00:02:35.280 --> 00:02:38.200
+ Gix as a package manager, and also as a deployment tool
+
+00:02:38.200 --> 00:02:40.880
+ for a few services.
+
+00:02:40.880 --> 00:02:44.700
+ I started from very basic setup where I didn't have
+
+00:02:44.700 --> 00:02:45.360
+ anything
+
+00:02:45.360 --> 00:02:49.080
+ and build it piece by piece, including
+
+00:02:49.080 --> 00:02:52.400
+ building Gix home project.
+
+00:02:52.400 --> 00:02:56.680
+ So yeah, I use Gix system and all the things.
+
+00:02:56.680 --> 00:03:02.040
+ And talking about Wi-Fi, first option
+
+00:03:02.040 --> 00:03:04.680
+ is to buy a Wi-Fi adapter, which doesn't
+
+00:03:04.680 --> 00:03:07.080
+ require proprietary firmware.
+
+00:03:07.080 --> 00:03:11.040
+ And another option is finding the firmware and installing
+
+00:03:11.040 --> 00:03:12.000
+ it.
+
+00:03:12.000 --> 00:03:13.760
+ So it's up to you.
+
+00:03:13.760 --> 00:03:17.840
+ Everything actually is relatively easy,
+
+00:03:17.840 --> 00:03:23.600
+ and you can relatively easy find the way to do it.
+
+00:03:23.600 --> 00:03:25.560
+ The third question.
+
+00:03:25.560 --> 00:03:29.360
+ One of the issues I have had managing Emacs packages
+
+00:03:29.360 --> 00:03:32.360
+ with Gix is a conflict between Gix package
+
+00:03:32.360 --> 00:03:35.160
+ attest read-only and the Emacs package
+
+00:03:35.160 --> 00:03:37.840
+ attest hackable in real time.
+
+00:03:37.840 --> 00:03:40.680
+ Any suggestions to resolve this?
+
+00:03:40.680 --> 00:03:45.600
+ Yes, I have suggestions to resolve this.
+
+00:03:45.600 --> 00:03:46.600
+ Actually, it's true.
+
+00:03:46.600 --> 00:03:50.560
+ Everything which is in GNU store is read-only.
+
+00:03:50.560 --> 00:03:55.680
+ Everything which is built with Gix is almost set in stone,
+
+00:03:55.680 --> 00:04:00.720
+ and you can't edit it in real time.
+
+00:04:00.720 --> 00:04:02.720
+ But what I do--
+
+00:04:02.720 --> 00:04:03.760
+ can I share my screen?
+
+00:04:03.760 --> 00:04:09.160
+ One second.
+
+00:04:09.160 --> 00:04:14.140
+ I will press a few buttons, and I hope you will see it soon
+
+00:04:14.140 --> 00:04:14.360
+.
+
+00:04:16.360 --> 00:04:16.360
+
+
+00:04:16.360 --> 00:04:18.080
+ Or maybe not so soon.
+
+00:04:18.080 --> 00:04:26.600
+ What I basically do, I take parts of the ELISP,
+
+00:04:26.600 --> 00:04:30.240
+ and I have them inside my scheme file
+
+00:04:30.240 --> 00:04:36.640
+ that I use to define my home environment and other things.
+
+00:04:36.640 --> 00:04:38.560
+ I don't know-- oh, OK.
+
+00:04:38.560 --> 00:04:39.640
+ That's it.
+
+00:04:39.640 --> 00:04:43.560
+ For example, here, this part is a scheme code.
+
+00:04:43.560 --> 00:04:46.640
+ But this part is pure ELISP code.
+
+00:04:46.640 --> 00:04:56.400
+ And I can use a direct region and use Emacs ELISP mode here
+
+00:04:56.400 --> 00:04:56.440
+.
+
+00:04:56.440 --> 00:05:01.160
+ I will need parts, edit those parts, and select.
+
+00:05:01.160 --> 00:05:05.520
+ And when I'm fine with all the edits I did here--
+
+00:05:05.520 --> 00:05:08.400
+ for example, I can evaluate this form using
+
+00:05:08.400 --> 00:05:10.760
+ Control-X, Control-E, and so on.
+
+00:05:10.760 --> 00:05:13.300
+ And when I'm good with the results,
+
+00:05:13.300 --> 00:05:16.920
+ I can just save it and rebuild my whole home environment
+
+00:05:16.920 --> 00:05:21.360
+ and see it on a fresh Emacs instance load
+
+00:05:21.360 --> 00:05:26.760
+ from the new configuration and see if everything
+
+00:05:26.760 --> 00:05:28.880
+ works here as well.
+
+00:05:28.880 --> 00:05:32.760
+ So it's a little less interactive
+
+00:05:32.760 --> 00:05:35.000
+ than the usual Emacs configuration,
+
+00:05:35.000 --> 00:05:36.480
+ but still works quite well.
+
+00:05:40.800 --> 00:05:43.540
+ A question-- what is next for RD?
+
+00:05:43.540 --> 00:05:48.420
+ Actually, I have short-term plans and a little more
+
+00:05:48.420 --> 00:05:49.660
+ long-term plans.
+
+00:05:49.660 --> 00:05:52.580
+ Short-term plan is to make a first release
+
+00:05:52.580 --> 00:05:54.740
+ by the end of this year.
+
+00:05:54.740 --> 00:05:58.860
+ And this release-- actually, RD is quite usable currently,
+
+00:05:58.860 --> 00:06:02.220
+ but there is not much documentation and not
+
+00:06:02.220 --> 00:06:04.620
+ so many examples.
+
+00:06:04.620 --> 00:06:09.060
+ So I would like to prepare a documentation
+
+00:06:09.060 --> 00:06:15.500
+ getting started guide, live CD that you can use
+
+00:06:15.500 --> 00:06:23.020
+ for exploration purpose and for installation.
+
+00:06:23.020 --> 00:06:31.380
+ And also, I would like to find one or two maintainers which
+
+00:06:31.380 --> 00:06:37.260
+ will help with upcoming patches, because it's already
+
+00:06:37.260 --> 00:06:40.300
+ at least a few people who use it on a daily basis,
+
+00:06:40.300 --> 00:06:42.860
+ and they send a lot of patches.
+
+00:06:42.860 --> 00:06:46.860
+ And sometimes I have a hard time keeping up
+
+00:06:46.860 --> 00:06:49.660
+ with the speed of creating patches.
+
+00:06:49.660 --> 00:06:53.540
+ So the short-term plans is to make a first release
+
+00:06:53.540 --> 00:06:54.860
+ by the end of the year.
+
+00:06:54.860 --> 00:07:00.140
+ The long-term plans we can discuss later, I think.
+
+00:07:00.140 --> 00:07:03.580
+ And I will share them in RD announced mailing list.
+
+00:07:06.220 --> 00:07:12.980
+ OK, I think that's it for patterns.
+
+00:07:12.980 --> 00:07:14.580
+ Let me check RC.
+
+00:07:14.580 --> 00:07:30.060
+ I have-- OK, it seems that I answered all questions
+
+00:07:30.060 --> 00:07:31.540
+ that I found.
+
+00:07:31.540 --> 00:07:33.180
+ Let me know if something appears.
+
+00:07:33.180 --> 00:07:39.580
+ [AUDIO OUT]
+
+00:07:39.580 --> 00:07:40.580
+ Cool, thanks, Andrew.
+
+00:07:40.580 --> 00:07:44.820
+ And yeah, I think we still have over 10 minutes, maybe
+
+00:07:44.820 --> 00:07:49.460
+ 12 minutes or so of live Q&A time on the stream.
+
+00:07:49.460 --> 00:07:51.180
+ So if people still have more questions,
+
+00:07:51.180 --> 00:07:53.180
+ please feel free to either add them on the pad,
+
+00:07:53.180 --> 00:07:54.540
+ or I think you should now also be
+
+00:07:54.540 --> 00:08:00.020
+ able to join this big blue button room to ask directly.
+
+00:08:00.020 --> 00:08:04.100
+ OK, I see one more question.
+
+00:08:04.100 --> 00:08:08.100
+ But I'm not sure what does it mean.
+
+00:08:08.100 --> 00:08:10.380
+ Do you use Emacs without this?
+
+00:08:10.380 --> 00:08:13.940
+ If so, for what purpose?
+
+00:08:13.940 --> 00:08:17.780
+ And how does it feel compared to RD?
+
+00:08:17.780 --> 00:08:20.980
+ OK, it's a question in general.
+
+00:08:20.980 --> 00:08:24.020
+ No, I don't use Emacs without RD.
+
+00:08:24.020 --> 00:08:28.700
+ Actually, all the Emacs configurations I use
+
+00:08:28.700 --> 00:08:33.340
+ is based on RD and built from that.
+
+00:08:33.340 --> 00:08:43.580
+ There is a way to add almost everything
+
+00:08:43.580 --> 00:08:45.940
+ you have in your basic Emacs configuration
+
+00:08:45.940 --> 00:08:52.540
+ to your RD Emacs configuration by creating a file
+
+00:08:52.540 --> 00:08:56.780
+ in your usual .config/emacsd directory
+
+00:08:56.780 --> 00:09:01.740
+ and loading it from your .init/el directory.
+
+00:09:01.740 --> 00:09:07.940
+ So you actually can have a very usual Emacs configuration
+
+00:09:07.940 --> 00:09:12.420
+ workflow in addition to RD.
+
+00:09:12.420 --> 00:09:16.500
+ But I don't use it because it's not a reproducible way
+
+00:09:16.500 --> 00:09:20.940
+ to do things because such workflow means
+
+00:09:20.940 --> 00:09:25.220
+ that I need to install packages separately somehow,
+
+00:09:25.220 --> 00:09:31.740
+ either with gix install or maybe some other package manager
+
+00:09:31.740 --> 00:09:31.740
+,
+
+00:09:31.740 --> 00:09:37.610
+ or maybe this package manager, like package.al or straight.
+
+00:09:37.610 --> 00:09:37.860
+al.
+
+00:09:37.860 --> 00:09:44.060
+ And it doesn't work well in the long term
+
+00:09:44.060 --> 00:09:46.620
+ because if I move such configuration, which
+
+00:09:46.620 --> 00:09:52.700
+ partially RD and partially usual Emacs configuration,
+
+00:09:52.700 --> 00:09:58.980
+ it will break on the new machine or maybe somewhere else
+
+00:09:58.980 --> 00:10:03.700
+ where I would like to move this configuration later.
+
+00:10:03.700 --> 00:10:23.700
+ OK.
+
+00:10:23.700 --> 00:10:27.700
+ We have a last slot for Q and A in the pad.
+
+00:10:27.700 --> 00:10:39.380
+ [LAUGHS]
+
+00:10:39.380 --> 00:10:43.940
+ Thank you, everyone, for joining this talk.
+
+00:10:43.940 --> 00:10:46.820
+ It was a pleasure to interview you.
+
+00:10:46.820 --> 00:10:52.780
+ I will be here for at least an hour or so
+
+00:10:52.780 --> 00:10:56.340
+ before I will go preparing to sleep.
+
+00:10:56.340 --> 00:11:02.740
+ So you can reach me by email, RC, here in big blue button
+
+00:11:02.740 --> 00:11:07.220
+ or some other way, probably.
+
+00:11:07.220 --> 00:11:09.660
+ Are there any plans to push things
+
+00:11:09.660 --> 00:11:12.660
+ from RD to gix main channel?
+
+00:11:12.660 --> 00:11:16.420
+ Actually, I have a commit access to gix,
+
+00:11:16.420 --> 00:11:20.300
+ and I try to upstream everything that
+
+00:11:20.300 --> 00:11:25.060
+ can be beneficial for both RD and gix to gix
+
+00:11:25.060 --> 00:11:30.740
+ and use it from the upstream.
+
+00:11:30.740 --> 00:11:35.320
+ But sometimes on some question, we didn't reach an
+
+00:11:35.320 --> 00:11:35.900
+ agreement,
+
+00:11:35.900 --> 00:11:40.660
+ or sometimes it's much easier to implement it
+
+00:11:40.660 --> 00:11:46.500
+ in a more rapid way, which probably I
+
+00:11:46.500 --> 00:11:52.380
+ wouldn't like to add to gix because it will require
+
+00:11:52.380 --> 00:11:56.340
+ too much time trying to fit to some gix.
+
+00:11:56.340 --> 00:11:59.140
+ So I keep it only in RD.
+
+00:11:59.140 --> 00:12:04.020
+ But the things that I see beneficial for both projects,
+
+00:12:04.020 --> 00:12:07.460
+ I try to share and to move them to gix.
+
+00:12:21.500 --> 00:12:22.220
+ Sounds great.
+
+00:12:22.220 --> 00:12:23.780
+ And another reminder for the folks
+
+00:12:23.780 --> 00:12:26.460
+ that you can join big blue button also directly.
+
+00:12:26.460 --> 00:12:29.340
+ If you want to type your questions into chat here
+
+00:12:29.340 --> 00:12:32.580
+ or just ask them over mic or with a microphone,
+
+00:12:32.580 --> 00:12:33.540
+ you can do that as well.
+
+00:12:33.540 --> 00:12:46.260
+ I think we still have about actually 10 or 12 more minutes.
+
+00:12:46.260 --> 00:12:48.100
+ I think I underestimated what we had.
+
+00:12:48.100 --> 00:12:50.100
+ So we still have plenty of time for questions.
+
+00:12:50.100 --> 00:12:56.500
+ [AUDIO OUT]
+
+00:12:56.500 --> 00:13:01.540
+ Added one more slot for Gondi in case someone
+
+00:13:01.540 --> 00:13:05.180
+ would like to fill it.
+
+00:13:05.180 --> 00:13:06.740
+ Thanks.
+
+00:13:06.740 --> 00:13:34.220
+ [AUDIO OUT]
+
+00:13:34.220 --> 00:13:39.260
+ How difficult is to add support for new packages to gix?
+
+00:13:39.260 --> 00:13:44.020
+ Have you found that's burdensome versus package L
+
+00:13:44.020 --> 00:13:48.540
+ or other in Emacs package management approach?
+
+00:13:48.540 --> 00:13:53.940
+ Actually, I find it quite easy to create packages for gix.
+
+00:13:53.940 --> 00:13:59.460
+ Maybe because I'm quite familiar with gix source code.
+
+00:13:59.460 --> 00:14:03.580
+ But maybe because it's not that difficult,
+
+00:14:03.580 --> 00:14:11.660
+ you just open a respective model like rd packages or gnu
+
+00:14:11.660 --> 00:14:13.540
+ packages in gix repository.
+
+00:14:13.540 --> 00:14:15.660
+ And you define the package you want.
+
+00:14:15.660 --> 00:14:19.100
+ And you define the dependencies you want.
+
+00:14:19.100 --> 00:14:25.540
+ Actually, a lot of packages already here in gix.
+
+00:14:25.540 --> 00:14:29.580
+ And some of the packages I package in rd
+
+00:14:29.580 --> 00:14:31.660
+ and later move to the gix.
+
+00:14:31.660 --> 00:14:37.300
+ So it's not hard to reference the dependencies
+
+00:14:37.300 --> 00:14:40.780
+ and find the dependencies already declared for you.
+
+00:14:40.780 --> 00:14:46.420
+ But what's more important, you can use dependencies not
+
+00:14:46.420 --> 00:14:46.780
+ only
+
+00:14:46.780 --> 00:14:49.660
+ on Emacs packages, but also on system packages.
+
+00:14:49.660 --> 00:14:53.300
+ For example, in my git package, you
+
+00:14:53.300 --> 00:14:55.700
+ can use a reference to git binary
+
+00:14:55.700 --> 00:14:58.820
+ and predefine the path to the git binary
+
+00:14:58.820 --> 00:15:03.540
+ inside a package configuration by fetching the source code
+
+00:15:03.540 --> 00:15:04.860
+ or something like that.
+
+00:15:04.860 --> 00:15:11.220
+ So any package that requires some system package to work
+
+00:15:11.220 --> 00:15:14.180
+ can use the system package as a dependency.
+
+00:15:14.180 --> 00:15:18.780
+ And it is a big benefit comparing
+
+00:15:18.780 --> 00:15:21.500
+ to other packaging solutions, which
+
+00:15:21.500 --> 00:15:25.460
+ can depend only on Elisp packages.
+
+00:15:25.460 --> 00:15:36.340
+ [AUDIO OUT]
+
+00:15:36.340 --> 00:15:40.060
+ Do you reckon rd is currently opinionated,
+
+00:15:40.060 --> 00:15:44.180
+ or is it a one-size-fits-all framework?
+
+00:15:44.180 --> 00:15:49.020
+ I would say it's quite opinionated.
+
+00:15:49.020 --> 00:15:52.620
+ I started from really bare-bone Emacs.
+
+00:15:52.620 --> 00:15:55.100
+ And I suffered for a while.
+
+00:15:55.100 --> 00:15:58.620
+ And I did features one by one very carefully,
+
+00:15:58.620 --> 00:16:02.500
+ crafting the current state of rd-emacs.
+
+00:16:02.500 --> 00:16:08.180
+ And it's, as I already said, vanilla flavored.
+
+00:16:08.180 --> 00:16:12.180
+ I try to stick with Emacs key bindings
+
+00:16:12.180 --> 00:16:15.700
+ to use built-in packages over external packages,
+
+00:16:15.700 --> 00:16:21.460
+ or use packages which are in the same way,
+
+00:16:21.460 --> 00:16:26.100
+ work in a similar manner to built-in packages.
+
+00:16:26.100 --> 00:16:29.740
+ So it's not usual.
+
+00:16:29.740 --> 00:16:37.060
+ It's not that user-friendly as Doom Emacs or Space Emacs.
+
+00:16:37.060 --> 00:16:45.580
+ It's more like a Prelude, or even more vanilla flavored
+
+00:16:45.580 --> 00:16:47.380
+ than Prelude.
+
+00:16:47.380 --> 00:16:50.420
+ But the good thing is that you can declare a feature
+
+00:16:50.420 --> 00:16:51.340
+ yourself.
+
+00:16:51.340 --> 00:16:55.260
+ And if you don't like something about rd-emacs provided
+
+00:16:55.260 --> 00:16:59.860
+ by features created by me or other contributors,
+
+00:16:59.860 --> 00:17:03.500
+ you can use the features declared by yourself
+
+00:17:03.500 --> 00:17:06.060
+ or by other people.
+
+00:17:06.060 --> 00:17:11.140
+ And one of the plans that I have according to rd,
+
+00:17:11.140 --> 00:17:13.940
+ which we are discussing on mailing list right now,
+
+00:17:13.940 --> 00:17:20.140
+ is contrib directory, which can include features provided
+
+00:17:20.140 --> 00:17:21.660
+ by different people.
+
+00:17:21.660 --> 00:17:28.500
+ For example, it's quite often asked to add evils support.
+
+00:17:28.500 --> 00:17:31.540
+ But I don't use evils.
+
+00:17:31.540 --> 00:17:35.460
+ And I don't want to maintain this package.
+
+00:17:35.460 --> 00:17:38.140
+ But I understand that many people
+
+00:17:38.140 --> 00:17:43.140
+ use such a way of interacting with text editor.
+
+00:17:43.140 --> 00:17:45.660
+ So it would be cool if someone who actually
+
+00:17:45.660 --> 00:17:48.420
+ using this feature will be maintaining it
+
+00:17:48.420 --> 00:17:51.020
+ in contrib directory.
+
+00:17:51.020 --> 00:17:55.180
+ And this feature will be sound with all other features
+
+00:17:55.180 --> 00:17:55.460
+ which
+
+00:17:55.460 --> 00:17:58.340
+ provided by rd itself.
+
+00:17:58.340 --> 00:18:05.100
+ And I think this way, it can cover more people needs
+
+00:18:05.100 --> 00:18:07.940
+ that it can cover right now.
+
+00:18:07.940 --> 00:18:11.260
+ So it will fit more people.
+
+00:18:11.260 --> 00:18:17.820
+ But the core rd won't be expanding its scope.
+
+00:18:17.820 --> 00:18:19.020
+ It will be quite focused.
+
+00:18:19.020 --> 00:18:27.940
+ How to get into rd is already documentation
+
+00:18:27.940 --> 00:18:31.060
+ and getting started guide.
+
+00:18:31.060 --> 00:18:34.740
+ There is a repository on source hut,
+
+00:18:34.740 --> 00:18:42.700
+ github.com/github/sourcehut/abcdw/rd.
+
+00:18:42.700 --> 00:18:47.620
+ And here you can see a very small readme,
+
+00:18:47.620 --> 00:18:52.540
+ which probably doesn't give you too much understanding of
+
+00:18:52.540 --> 00:18:52.780
+ what
+
+00:18:52.780 --> 00:18:53.580
+ is going on.
+
+00:18:53.580 --> 00:18:56.860
+ But it has all the necessary links.
+
+00:18:56.860 --> 00:18:58.740
+ It has a link to manual.
+
+00:18:58.740 --> 00:19:02.860
+ It has information of mailing lists,
+
+00:19:02.860 --> 00:19:05.940
+ which you can use to get help.
+
+00:19:05.940 --> 00:19:14.620
+ It has information about IRC channel in manual.
+
+00:19:14.620 --> 00:19:18.540
+ And you can join this channel and ask questions here.
+
+00:19:18.540 --> 00:19:22.060
+ And of course, you can take the source code
+
+00:19:22.060 --> 00:19:23.860
+ and take a look at it.
+
+00:19:23.860 --> 00:19:29.500
+ And currently, we have examples.
+
+00:19:29.500 --> 00:19:37.380
+ And here in examples, my whole configuration of my team
+
+00:19:37.380 --> 00:19:38.340
+ is present.
+
+00:19:38.340 --> 00:19:43.580
+ It's a little bit drafty.
+
+00:19:43.580 --> 00:19:47.380
+ I would like to reorganize this a little
+
+00:19:47.380 --> 00:19:50.340
+ to make it easier to follow.
+
+00:19:50.340 --> 00:19:55.140
+ And before first release, I hope I will do so.
+
+00:19:55.140 --> 00:20:04.140
+ But you can use it as an example, build on [INAUDIBLE]
+
+00:20:04.140 --> 00:20:09.700
+ Unfortunately, the documentation
+
+00:20:09.700 --> 00:20:12.180
+ is not very extensive.
+
+00:20:12.180 --> 00:20:17.740
+ So you can find it a little hard to follow.
+
+00:20:17.740 --> 00:20:24.140
+ Or maybe you can find it missing some important things.
+
+00:20:24.140 --> 00:20:29.140
+ But before first release, I hope the situation
+
+00:20:29.140 --> 00:20:30.900
+ will become a little better.
+
+00:20:30.900 --> 00:20:33.860
+ But anyway, you can always ask questions
+
+00:20:33.860 --> 00:20:35.420
+ until the documentation is ready.
+
+00:20:35.420 --> 00:20:44.060
+ Can you mix RD with custom Emacs init file?
+
+00:20:44.060 --> 00:20:45.220
+ Yes, you can.
+
+00:20:45.220 --> 00:20:47.780
+ I already mentioned it.
+
+00:20:47.780 --> 00:20:53.220
+ You can just define in your init.el
+
+00:20:53.220 --> 00:20:57.100
+ the statement that you load some other file
+
+00:20:57.100 --> 00:21:02.860
+ and use this file as your usual init.el file.
+
+00:21:02.860 --> 00:21:06.460
+ It will work completely OK.
+
+00:21:06.460 --> 00:21:13.780
+ And you can partially migrate to RD by using such approach.
+
+00:21:13.780 --> 00:21:17.540
+ But I don't recommend this approach in long term.
+
+00:21:17.540 --> 00:21:19.020
+ I already mentioned it.
+
+00:21:19.020 --> 00:21:24.140
+ But having usual init.el file and managing your
+
+00:21:24.140 --> 00:21:25.340
+ dependencies
+
+00:21:25.340 --> 00:21:29.580
+ using package.el or straight.el doesn't
+
+00:21:29.580 --> 00:21:33.140
+ cover system dependencies and other stuff, which
+
+00:21:33.140 --> 00:21:38.900
+ will lead to maybe irreproducible configurations.
+
+00:21:38.900 --> 00:21:49.780
+ [AUDIO OUT]
+
+00:21:49.780 --> 00:21:51.700
+ It's the heads up that we have about two more
+
+00:21:51.700 --> 00:21:53.180
+ minutes of live Q&A time.
+
+00:21:53.180 --> 00:21:55.100
+ And then after that, the stream will move on.
+
+00:21:55.100 --> 00:21:58.300
+ But people are welcome to continue asking questions,
+
+00:21:58.300 --> 00:22:01.460
+ either on the pad or IRC or by joining the Speakable button
+
+00:22:01.460 --> 00:22:02.380
+ room directly.
+
+00:22:02.380 --> 00:22:04.380
+ Thanks again, Andrew.
+
+00:22:04.380 --> 00:22:23.700
+ [AUDIO OUT]
+
+00:22:23.700 --> 00:22:27.660
+ Actually, I didn't expect so much questions.
+
+00:22:27.660 --> 00:22:33.340
+ And when I first took a look at the pad
+
+00:22:33.340 --> 00:22:38.700
+ and thought, OK, those six slots for Q&A will be enough.
+
+00:22:38.700 --> 00:22:45.100
+ Yeah, it's always a nice surprise, I guess.
+
+00:22:45.100 --> 00:23:04.140
+ [AUDIO OUT]
+
+00:23:04.140 --> 00:23:07.780
+ I hope everyone will be OK with jumping windows around,
+
+00:23:07.780 --> 00:23:10.420
+ because I switch between workspaces.
+
+00:23:10.420 --> 00:23:12.660
+ And it may be a little too noisy.
+
+00:23:12.660 --> 00:23:16.780
+ [AUDIO OUT]
+
+00:23:16.780 --> 00:23:18.660
+ Yeah, I think it's fine for the most part.
+
+00:23:18.660 --> 00:23:20.380
+ It was a bit of an interesting thing
+
+00:23:20.380 --> 00:23:23.500
+ trying to keep up the stream with it, because by default,
+
+00:23:23.500 --> 00:23:26.020
+ we maximize the speaker's webcam.
+
+00:23:26.020 --> 00:23:27.900
+ But then you're also sharing your screen
+
+00:23:27.900 --> 00:23:29.180
+ and sharing important details.
+
+00:23:29.180 --> 00:23:32.780
+ So we were also trying to get that on the stream as well.
+
+00:23:32.780 --> 00:23:33.660
+ But yeah, it was fine.
+
+00:23:33.660 --> 00:23:41.260
+ [AUDIO OUT]
+
+00:23:41.260 --> 00:23:46.780
+ OK, I think that there's no more questions.
+
+00:23:46.780 --> 00:23:53.980
+ And we can finish in this section.
+
+00:23:53.980 --> 00:23:55.580
+ All right, sounds good.
+
+00:23:55.580 --> 00:23:58.020
+ Thanks again, Andrew, for the great talk.
+
+00:23:58.020 --> 00:24:02.780
+ As a fellow Tiling Window Manager user and GNU gigs--
+
+00:24:02.780 --> 00:24:06.180
+ well, former committer, but still very much enthusiast,
+
+00:24:06.180 --> 00:24:07.540
+ I'm very much interested in this.
+
+00:24:07.540 --> 00:24:09.820
+ So I know I'll definitely be checking your work out.
+
+00:24:09.820 --> 00:24:11.660
+ So thanks again.
+
+00:24:11.660 --> 00:24:13.860
+ Thank you very much for organization
+
+00:24:13.860 --> 00:24:15.820
+ and all your contributions.
+
+00:24:15.820 --> 00:24:17.540
+ Very much appreciated.
+
+00:24:17.540 --> 00:24:18.100
+ Thank you.
+
+00:24:18.100 --> 00:24:18.600
+ Thank you.
+
+00:24:18.600 --> 00:24:19.340
+ Appreciate it.
+
+00:24:19.340 --> 00:24:20.140
+ All right, take care.
+
+00:24:20.140 --> 00:24:22.580
+ And we'll see you around.
+
+00:24:22.580 --> 00:24:23.580
+ Bye-bye.
+
+00:24:23.580 --> 00:24:25.140
+ Bye.
+
+00:24:25.140 --> 00:24:28.500
+ [AUDIO OUT]
+
+00:24:30.500 --> 00:24:30.500
+
+
diff --git a/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main--chapters.vtt b/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main--chapters.vtt
new file mode 100644
index 00000000..dc0c9307
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main--chapters.vtt
@@ -0,0 +1,38 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:52.040
+Introduction
+
+00:00:52.040 --> 00:03:34.840
+The challenge
+
+00:03:34.840 --> 00:05:04.920
+Functional package managers
+
+00:05:04.920 --> 00:07:20.360
+Guix Home
+
+00:07:20.360 --> 00:08:15.520
+rde
+
+00:08:15.520 --> 00:11:37.440
+Vanilla-flavoured
+
+00:11:37.440 --> 00:13:52.520
+Removing features
+
+00:13:52.520 --> 00:15:14.080
+Another example
+
+00:15:14.080 --> 00:16:54.400
+Multiple steps
+
+00:16:54.400 --> 00:18:07.480
+A small Emacs configuration
+
+00:18:07.480 --> 00:22:19.000
+Enabling features
+
+00:22:19.000 --> 00:23:33.760
+Summary
diff --git a/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.vtt b/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.vtt
new file mode 100644
index 00000000..99a9e201
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.vtt
@@ -0,0 +1,1129 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:11.480
+Hello and welcome everyone at EmacsConf 2022.
+
+00:00:11.480 --> 00:00:13.400
+I'm Andrew Tropin, and today
+
+00:00:13.400 --> 00:00:16.280
+we will talk about my Emacs setup.
+
+00:00:16.280 --> 00:00:19.360
+I will tell you the story behind it.
+
+00:00:19.360 --> 00:00:23.960
+We will discuss what rde and rde Emacs are,
+
+00:00:23.960 --> 00:00:28.760
+and we'll make a small Emacs configuration.
+
+00:00:28.760 --> 00:00:30.920
+My original motivation was to have
+
+00:00:30.920 --> 00:00:34.000
+a ready for work development environment
+
+00:00:34.000 --> 00:00:36.640
+which is reliable and guaranteed to work
+
+00:00:36.640 --> 00:00:37.840
+every time I need it,
+
+00:00:37.840 --> 00:00:42.680
+preferably performant and consistent.
+
+00:00:42.680 --> 00:00:44.160
+I say development environment,
+
+00:00:44.160 --> 00:00:45.720
+but it actually applies to
+
+00:00:45.720 --> 00:00:47.600
+many other working environment,
+
+00:00:47.600 --> 00:00:52.040
+especially text-heavy.
+
+00:00:52.040 --> 00:00:54.040
+An easy and obvious solution is to
+
+00:00:54.040 --> 00:00:57.640
+pick one of existing configuration frameworks
+
+00:00:57.640 --> 00:01:00.760
+like Spacemacs, Doom Emacs, Prelude,
+
+00:01:00.760 --> 00:01:02.520
+or something else,
+
+00:01:02.520 --> 00:01:05.040
+and to get a pre-configured Emacs
+
+00:01:05.040 --> 00:01:09.040
+in a minute with all bells and whistles.
+
+00:01:09.040 --> 00:01:12.480
+But the problem is: only Emacs.
+
+00:01:12.480 --> 00:01:16.400
+In reality, your working environment consists
+
+00:01:16.400 --> 00:01:18.680
+not only from elisp packages,
+
+00:01:18.680 --> 00:01:21.360
+but also from system packages
+
+00:01:21.360 --> 00:01:23.320
+and their configurations, project libraries,
+
+00:01:23.320 --> 00:01:27.080
+compilers, building tools, etc.,
+
+00:01:27.080 --> 00:01:31.600
+and thus you already have at least
+
+00:01:31.600 --> 00:01:34.880
+three, or more likely, five things
+
+00:01:34.880 --> 00:01:37.120
+for managing your environment:
+
+00:01:37.120 --> 00:01:39.640
+configuration, Emacs configuration framework,
+
+00:01:39.640 --> 00:01:42.880
+Emacs package manager, system package manager,
+
+00:01:42.880 --> 00:01:46.600
+system/dot files configuration manager,
+
+00:01:46.600 --> 00:01:49.080
+project/language package manager
+
+00:01:49.080 --> 00:01:51.800
+and maybe something else.
+
+00:01:51.800 --> 00:01:56.360
+Even having our Emacs configuration
+
+00:01:56.360 --> 00:01:59.800
+and package manager covered by framework
+
+00:01:59.800 --> 00:02:02.080
+we still have a lot of things
+
+00:02:02.080 --> 00:02:04.240
+which we have to interact with,
+
+00:02:04.240 --> 00:02:08.640
+keep in sync, and more importantly,
+
+00:02:08.640 --> 00:02:12.480
+each of them can break.
+
+00:02:12.480 --> 00:02:17.320
+But by "works every time," I mean
+
+00:02:17.320 --> 00:02:19.560
+even if I updated my system packages,
+
+00:02:19.560 --> 00:02:23.880
+configurations, I migrated to a different machine,
+
+00:02:23.880 --> 00:02:29.120
+someone on my team updated project dependencies,
+
+00:02:29.120 --> 00:02:31.960
+I can get back to work in a matter of seconds,
+
+00:02:31.960 --> 00:02:39.040
+or maybe in some cases, minutes.
+
+00:02:39.040 --> 00:02:40.400
+If I have multiple tools
+
+00:02:40.400 --> 00:02:43.720
+for managing my environment
+
+00:02:43.720 --> 00:02:45.720
+and even one of them is broken,
+
+00:02:45.720 --> 00:02:48.360
+the whole setup is broken.
+
+00:02:48.360 --> 00:02:51.080
+Also, if one of them doesn't support
+
+00:02:51.080 --> 00:02:53.560
+deterministic rollback,
+
+00:02:53.560 --> 00:02:58.200
+I can't guarantee the reliability
+
+00:02:58.200 --> 00:02:59.200
+of my working environment.
+
+00:02:59.200 --> 00:03:01.360
+I can't be sure that I will be able to
+
+00:03:01.360 --> 00:03:02.800
+rescue or revive it.
+
+00:03:02.800 --> 00:03:06.760
+The less points of failure we have,
+
+00:03:06.760 --> 00:03:09.720
+the easier to stay sane.
+
+00:03:09.720 --> 00:03:13.080
+Imagine some late breakage notice
+
+00:03:13.080 --> 00:03:17.880
+when you did update a few hours or days ago
+
+00:03:17.880 --> 00:03:20.920
+and found it later, and you have
+
+00:03:20.920 --> 00:03:25.320
+a few different tools involved.
+
+00:03:25.320 --> 00:03:28.280
+It will be really hard to find the cause
+
+00:03:28.280 --> 00:03:34.840
+and to make everything work again.
+
+00:03:34.840 --> 00:03:37.880
+Is it possible to have one tool
+
+00:03:37.880 --> 00:03:44.360
+to cover all the needs I described above?
+
+00:03:44.360 --> 00:03:48.520
+Yes, almost. With this tool,
+
+00:03:48.520 --> 00:03:50.320
+you can get a reliable setup.
+
+00:03:50.320 --> 00:03:57.400
+Now, I talk about functional package managers.
+
+00:03:57.400 --> 00:04:00.680
+Functional package managers allow us to
+
+00:04:00.680 --> 00:04:03.720
+manage systems, users, Emacs, project/
+
+00:04:03.720 --> 00:04:07.560
+language packages, and their configurations.
+
+00:04:07.560 --> 00:04:10.880
+But more importantly, it allows to do it
+
+00:04:10.880 --> 00:04:13.200
+in a declarative and reproducible manner.
+
+00:04:13.200 --> 00:04:16.840
+That means you just define what you need,
+
+00:04:16.840 --> 00:04:19.680
+and those tools build it for you.
+
+00:04:19.680 --> 00:04:24.320
+No matter what was before, you get what you asked for.
+
+00:04:24.320 --> 00:04:26.200
+It doesn't matter what time of day,
+
+00:04:26.200 --> 00:04:29.640
+what you did before, what other packages
+
+00:04:29.640 --> 00:04:31.680
+you have installed previously.
+
+00:04:31.680 --> 00:04:34.440
+You just ask for something, and you get it.
+
+00:04:34.440 --> 00:04:41.440
+Two years ago, I did a talk at EmacsConf 2020
+
+00:04:41.440 --> 00:04:43.840
+where I demonstrated a prototype of
+
+00:04:43.840 --> 00:04:47.480
+Emacs configuration managed by Nix.
+
+00:04:47.480 --> 00:04:50.480
+Originally, I wanted to base my work on
+
+00:04:50.480 --> 00:04:56.160
+an already existing Emacs configuration framework.
+
+00:04:56.160 --> 00:05:01.360
+But later, I decided that it will be easier
+
+00:05:01.360 --> 00:05:02.440
+and a little more flexible
+
+00:05:02.440 --> 00:05:04.920
+to start from ground up.
+
+00:05:04.920 --> 00:05:06.960
+After the first prototype in Nix,
+
+00:05:06.960 --> 00:05:12.120
+I decided to switch to Guix. To make it short,
+
+00:05:12.120 --> 00:05:14.600
+Guix is another functional package manager,
+
+00:05:14.600 --> 00:05:21.840
+but more freedom- and reproducibility-oriented,
+
+00:05:21.840 --> 00:05:24.200
+and written in only one language (Guile Scheme)
+
+00:05:24.200 --> 00:05:29.880
+instead of few custom-made Nix DSL, Bash, and C++.
+
+00:05:29.880 --> 00:05:34.240
+So now I can write Lisp code, while this code
+
+00:05:34.240 --> 00:05:37.040
+writes another Lisp code. Very neat indeed.
+
+00:05:37.040 --> 00:05:42.760
+Unfortunately, at the moment, there was no tool
+
+00:05:42.760 --> 00:05:45.400
+to manage user configurations,
+
+00:05:45.400 --> 00:05:48.400
+also known as dotfiles, with Guix.
+
+00:05:48.400 --> 00:05:52.680
+So I wrote one. And now it's a part of GNU Guix
+
+00:05:52.680 --> 00:05:54.160
+and called Guix Home.
+
+00:05:54.160 --> 00:05:58.840
+What do we get from this one tool?
+
+00:05:58.840 --> 00:06:05.240
+We can use one language to describe the whole system,
+
+00:06:05.240 --> 00:06:09.080
+the home environment, the project environment,
+
+00:06:09.080 --> 00:06:10.240
+and everything else.
+
+00:06:10.240 --> 00:06:13.000
+We don't need to worry about
+
+00:06:13.000 --> 00:06:17.000
+to keep different tools in sync
+
+00:06:17.000 --> 00:06:19.760
+and to integrate them between each other.
+
+00:06:19.760 --> 00:06:23.080
+Also, using one language to describe
+
+00:06:23.080 --> 00:06:25.440
+the whole configuration makes it possible
+
+00:06:25.440 --> 00:06:28.640
+to share values between different parts of the system.
+
+00:06:28.640 --> 00:06:32.920
+For example, color scheme, fonts, and much more.
+
+00:06:32.920 --> 00:06:39.440
+To sum up the first part of the talk:
+
+00:06:39.440 --> 00:06:43.320
+I want a working environment which is ready for work,
+
+00:06:43.320 --> 00:06:47.960
+configured in minutes to almost what I want.
+
+00:06:47.960 --> 00:06:50.800
+That means it should have some batteries included.
+
+00:06:50.800 --> 00:06:52.000
+It should be reliable.
+
+00:06:52.000 --> 00:06:54.840
+I want to get back to work in seconds
+
+00:06:54.840 --> 00:06:56.160
+even if I broke something
+
+00:06:56.160 --> 00:06:58.200
+or someone else broke something.
+
+00:06:58.200 --> 00:07:03.560
+For example, using rollbacks.
+
+00:07:03.560 --> 00:07:07.320
+It would be nice if it will be performant.
+
+00:07:07.320 --> 00:07:08.640
+It's a little subjective thing,
+
+00:07:08.640 --> 00:07:12.360
+but it's nice when things are snappy.
+
+00:07:12.360 --> 00:07:16.160
+And it's cool when things are consistent.
+
+00:07:16.160 --> 00:07:17.800
+Different interfaces have
+
+00:07:17.800 --> 00:07:20.360
+the same way of interactions with them.
+
+00:07:20.360 --> 00:07:25.920
+Let's get to the next part,
+
+00:07:25.920 --> 00:07:29.120
+and let's discuss what rde is.
+
+00:07:29.120 --> 00:07:33.360
+Originally it was my dotfiles repo,
+
+00:07:33.360 --> 00:07:35.720
+but it grew into something bigger.
+
+00:07:35.720 --> 00:07:39.320
+Now, it's a set of tools on top of
+
+00:07:39.320 --> 00:07:41.680
+GNU Guix, Guix System, and Guix Home.
+
+00:07:41.680 --> 00:07:45.800
+You can treat it as a GNU/Linux distribution,
+
+00:07:45.800 --> 00:07:48.720
+system and home environment manager
+
+00:07:48.720 --> 00:07:50.880
+or configuration framework,
+
+00:07:50.880 --> 00:07:52.920
+project environment manager
+
+00:07:52.920 --> 00:07:55.160
+(like virtualenv, but on steroids),
+
+00:07:55.160 --> 00:07:58.200
+and Emacs distribution.
+
+00:07:58.200 --> 00:08:02.840
+Usually, you just pick a few features,
+
+00:08:02.840 --> 00:08:05.654
+parameterize them and ask the tool
+
+00:08:05.655 --> 00:08:08.120
+to create an operating system for you,
+
+00:08:08.120 --> 00:08:10.280
+a home environment, project environment,
+
+00:08:10.280 --> 00:08:11.560
+or Emacs configuration.
+
+00:08:11.560 --> 00:08:15.520
+That's it. That's simple.
+
+00:08:15.520 --> 00:08:22.080
+And what rde Emacs is and how it tastes...
+
+00:08:22.080 --> 00:08:26.360
+It's like an ice cream, vanilla-flavored.
+
+00:08:26.360 --> 00:08:30.880
+No fancy macros for configuration, just plain Elisp.
+
+00:08:30.880 --> 00:08:34.954
+You can find in almost every
+
+00:08:34.955 --> 00:08:36.480
+personal Emacs configuration,
+
+00:08:36.480 --> 00:08:42.640
+built-in or vanilla-flavored packages
+
+00:08:42.640 --> 00:08:45.588
+are in priority over external
+
+00:08:45.589 --> 00:08:46.760
+or very fancy packages.
+
+00:08:46.760 --> 00:08:52.200
+There is practical reason for this.
+
+00:08:52.200 --> 00:08:55.454
+Maybe sometimes you don't get the things
+
+00:08:55.455 --> 00:08:57.720
+you're used to in other text editors,
+
+00:08:57.720 --> 00:09:01.920
+or maybe even in other Emacs frameworks,
+
+00:09:01.920 --> 00:09:05.880
+but we want to keep the final result consistent,
+
+00:09:05.880 --> 00:09:08.720
+so you can apply the same interaction patterns
+
+00:09:08.720 --> 00:09:13.480
+in different situations and extend your expectations
+
+00:09:13.480 --> 00:09:15.000
+from one tool to another,
+
+00:09:15.000 --> 00:09:16.560
+from one package to another.
+
+00:09:16.560 --> 00:09:19.400
+For example, we encourage people
+
+00:09:19.400 --> 00:09:22.600
+to use the minibuffer completion
+
+00:09:22.600 --> 00:09:26.720
+with orderless and vertico for many tasks:
+
+00:09:26.720 --> 00:09:30.680
+code navigation, file navigation,
+
+00:09:30.680 --> 00:09:32.120
+looking through your emails,
+
+00:09:32.120 --> 00:09:35.160
+or just for jumping around.
+
+00:09:35.160 --> 00:09:36.320
+Let's see.
+
+00:09:36.320 --> 00:09:39.480
+First, create a new Emacs instance
+
+00:09:39.480 --> 00:09:45.280
+and open a repository with my configuration.
+
+00:09:45.280 --> 00:09:54.040
+You can see the source code.
+
+00:09:54.040 --> 00:09:58.760
+Let's open another file which contains
+
+00:09:58.760 --> 00:09:59.960
+Emacs-related features.
+
+00:09:59.960 --> 00:10:02.280
+You can see I use imenu,
+
+00:10:02.280 --> 00:10:08.360
+and I can filter the list using minibuffer.
+
+00:10:08.360 --> 00:10:16.600
+Now let's open the Magit interface,
+
+00:10:16.600 --> 00:10:18.920
+and now I want to navigate through
+
+00:10:18.920 --> 00:10:22.240
+this long list of things here.
+
+00:10:22.240 --> 00:10:25.560
+Some of them staged. Some of them are recent commits.
+
+00:10:25.560 --> 00:10:28.400
+Some of them are untracked at all.
+
+00:10:28.400 --> 00:10:31.040
+I can open imenu: the same interface,
+
+00:10:31.040 --> 00:10:34.640
+but for now, I can navigate around
+
+00:10:34.640 --> 00:10:41.320
+the Magit sections and files which are present here.
+
+00:10:41.320 --> 00:10:45.120
+If I want to navigate project files,
+
+00:10:45.120 --> 00:10:47.520
+I use almost the same interface.
+
+00:10:47.520 --> 00:10:51.720
+I can use the same patterns to filter out
+
+00:10:51.720 --> 00:11:00.400
+files in my project or items in magit-imenu.
+
+00:11:00.400 --> 00:11:07.720
+Very similar and very consistent.
+
+00:11:07.720 --> 00:11:11.920
+Also, we try to have hotkeys consistent
+
+00:11:11.920 --> 00:11:16.680
+across different packages and parts of Emacs.
+
+00:11:16.680 --> 00:11:21.720
+We usually don't provide alternatives on what to use.
+
+00:11:21.720 --> 00:11:25.520
+We provide only one package for one task.
+
+00:11:25.520 --> 00:11:28.154
+But of course this is
+
+00:11:28.155 --> 00:11:29.880
+a configuration framework after all.
+
+00:11:29.880 --> 00:11:32.800
+You can declare your own features,
+
+00:11:32.800 --> 00:11:35.788
+implement them yourself,
+
+00:11:35.789 --> 00:11:37.440
+and use whatever you want.
+
+00:11:37.440 --> 00:11:45.240
+Let's get to some real-world examples.
+
+00:11:45.240 --> 00:11:48.221
+It's always easy to show
+
+00:11:48.222 --> 00:11:50.200
+how things get appended,
+
+00:11:50.200 --> 00:11:51.760
+how things get installed,
+
+00:11:51.760 --> 00:11:55.288
+but usually people don't show
+
+00:11:55.289 --> 00:11:56.360
+how they remove things,
+
+00:11:56.360 --> 00:11:58.800
+because it's usually painful.
+
+00:11:58.800 --> 00:12:02.120
+But in our case, it's not.
+
+00:12:02.120 --> 00:12:10.840
+Let's take my configuration,
+
+00:12:10.840 --> 00:12:12.960
+let's find feature-emacs-vertico.
+
+00:12:12.960 --> 00:12:19.821
+Vertico's just used to show
+
+00:12:19.822 --> 00:12:25.880
+this fancy completion UI
+
+00:12:25.880 --> 00:12:27.400
+that you can see here.
+
+00:12:27.400 --> 00:12:30.960
+If I disable this feature
+
+00:12:30.960 --> 00:12:43.080
+and rebuild my home environment,
+
+00:12:43.080 --> 00:12:46.360
+Emacs will lack this feature.
+
+00:12:46.360 --> 00:12:55.400
+It may take some time. It was quite fast,
+
+00:12:55.400 --> 00:13:00.400
+I didn't expect it.
+
+00:13:00.400 --> 00:13:02.880
+I have Emacs. As you can see here,
+
+00:13:02.880 --> 00:13:06.280
+now it doesn't have this completion UI anymore.
+
+00:13:06.280 --> 00:13:09.280
+I just commented it out,
+
+00:13:09.280 --> 00:13:13.320
+rebuilt my home environment,
+
+00:13:13.320 --> 00:13:15.600
+and this thing disappeared from Emacs.
+
+00:13:15.600 --> 00:13:19.960
+But what if I broke something?
+
+00:13:19.960 --> 00:13:28.440
+I just call guix home roll-back command
+
+00:13:28.440 --> 00:13:31.200
+and launch Emacs again, and you see
+
+00:13:31.200 --> 00:13:32.800
+now we have vertico back.
+
+00:13:32.800 --> 00:13:36.080
+Very good.
+
+00:13:36.080 --> 00:13:41.280
+Reliability is one of the most important qualities
+
+00:13:41.280 --> 00:13:43.920
+of working environment.
+
+00:13:43.920 --> 00:13:46.400
+We can always get back to
+
+00:13:46.400 --> 00:13:48.440
+the working state of our environment
+
+00:13:48.440 --> 00:13:52.520
+and be sure that we do the things we want.
+
+00:13:52.520 --> 00:13:57.720
+Now let's see another example.
+
+00:13:57.720 --> 00:13:59.960
+Here I have a mastodon,
+
+00:13:59.960 --> 00:14:03.600
+a post which contains a gemini link.
+
+00:14:03.600 --> 00:14:11.560
+I can click it, and you see it opens emacsclient,
+
+00:14:11.560 --> 00:14:14.480
+it renders this gemini capsule,
+
+00:14:14.480 --> 00:14:17.800
+and we can read all the posts of this guy.
+
+00:14:17.800 --> 00:14:21.000
+Very cool.
+
+00:14:21.000 --> 00:14:26.760
+But what if I go back to my configuration,
+
+00:14:26.760 --> 00:14:32.400
+we'll find a feature related to elpher,
+
+00:14:32.400 --> 00:14:36.080
+the application which handles gemini links,
+
+00:14:36.080 --> 00:14:38.320
+we'll comment it out,
+
+00:14:38.320 --> 00:14:41.720
+and we'll rebuild my home environment.
+
+00:14:41.720 --> 00:14:47.120
+What I expect here is that
+
+00:14:47.120 --> 00:14:48.440
+when I will be clicking the link,
+
+00:14:48.440 --> 00:15:02.320
+emacsclient won't pop up anymore.
+
+00:15:02.320 --> 00:15:02.720
+Cool.
+
+00:15:02.720 --> 00:15:06.600
+We rebuilt it and let's click the link.
+
+00:15:06.600 --> 00:15:08.360
+Now you see, it just opens another tab
+
+00:15:08.360 --> 00:15:10.760
+which doesn't do anything useful.
+
+00:15:10.760 --> 00:15:14.080
+Cool.
+
+00:15:14.080 --> 00:15:15.520
+Why it is important?
+
+00:15:15.520 --> 00:15:19.640
+It is important because every time
+
+00:15:19.640 --> 00:15:24.640
+you install something and you want to remove it,
+
+00:15:24.640 --> 00:15:29.320
+some parts depending on it can be broken.
+
+00:15:29.320 --> 00:15:31.840
+And also important in the other way around.
+
+00:15:31.840 --> 00:15:34.920
+Sometimes you want to install something,
+
+00:15:34.920 --> 00:15:36.640
+and it requires a few steps.
+
+00:15:36.640 --> 00:15:40.600
+For example, if you want to have
+
+00:15:40.600 --> 00:15:43.160
+a docker.el in your Emacs,
+
+00:15:43.160 --> 00:15:49.080
+you need not only docker.el itself
+
+00:15:49.080 --> 00:15:51.360
+and configuration for it,
+
+00:15:51.360 --> 00:15:55.240
+you also need to add your user to the docker group.
+
+00:15:55.240 --> 00:15:59.000
+But before it, you need to create this group,
+
+00:15:59.000 --> 00:16:00.454
+and you also need to
+
+00:16:00.455 --> 00:16:02.800
+define a system service and run it.
+
+00:16:02.800 --> 00:16:05.800
+Also you need to install docker package,
+
+00:16:05.800 --> 00:16:11.640
+docker-cli package, and containerd package.
+
+00:16:11.640 --> 00:16:15.440
+You can forget every of this small step,
+
+00:16:15.440 --> 00:16:20.480
+but if it in your declarative configuration
+
+00:16:20.480 --> 00:16:23.588
+in one place, and you just ask
+
+00:16:23.589 --> 00:16:27.821
+to enable this feature, each of those steps
+
+00:16:27.822 --> 00:16:30.880
+will be performed automatically.
+
+00:16:30.880 --> 00:16:33.200
+If you don't need docker anymore,
+
+00:16:33.200 --> 00:16:34.840
+you just disable the feature,
+
+00:16:34.840 --> 00:16:38.480
+and all the effect of all those steps
+
+00:16:38.480 --> 00:16:42.840
+will be removed from your system.
+
+00:16:42.840 --> 00:16:46.640
+I won't be showing it because it probably will
+
+00:16:46.640 --> 00:16:48.920
+take more time for reconfiguring,
+
+00:16:48.920 --> 00:16:54.400
+but you can experiment with it on your own.
+
+00:16:54.400 --> 00:17:00.840
+Let's do another interesting thing.
+
+00:17:00.840 --> 00:17:05.921
+Let's construct a small
+
+00:17:05.922 --> 00:17:07.720
+Emacs configuration from scratch.
+
+00:17:07.720 --> 00:17:10.920
+Who's this?
+
+00:17:10.920 --> 00:17:14.240
+I will open a file which contains only
+
+00:17:14.240 --> 00:17:18.720
+emacs-portable feature and feature-user-info.
+
+00:17:18.720 --> 00:17:21.120
+Now I will build an environment,
+
+00:17:21.120 --> 00:17:24.480
+and inside this environment,
+
+00:17:24.480 --> 00:17:26.640
+I will launch a new Emacs instance.
+
+00:17:26.640 --> 00:17:28.800
+As you see, it's very different
+
+00:17:28.800 --> 00:17:30.440
+from what you saw previously.
+
+00:17:30.440 --> 00:17:32.120
+And it's almost barebones.
+
+00:17:32.120 --> 00:17:39.520
+It doesn't contain anything
+
+00:17:39.520 --> 00:17:41.760
+except user-mail-address
+
+00:17:41.760 --> 00:17:45.080
+which is set to my mail address,
+
+00:17:45.080 --> 00:17:46.880
+and user-full-name.
+
+00:17:46.880 --> 00:17:50.760
+How it works:
+
+00:17:50.760 --> 00:17:54.000
+In feature-user-info, I define a few values.
+
+00:17:54.000 --> 00:18:01.120
+Those values are obtained by Emacs
+
+00:18:01.120 --> 00:18:03.280
+feature-emacs-portable
+
+00:18:03.280 --> 00:18:07.480
+and set inside Emacs configuration.
+
+00:18:07.480 --> 00:18:12.840
+But let's enable a few more features.
+
+00:18:12.840 --> 00:18:15.400
+I will do it in one go
+
+00:18:15.400 --> 00:18:22.120
+because we already saw how it works overall.
+
+00:18:22.120 --> 00:18:30.160
+Let's build another Emacs with Emacs configuration.
+
+00:18:30.160 --> 00:18:39.280
+The interesting thing about this Emacs instance
+
+00:18:39.280 --> 00:18:44.560
+is that it doesn't contain anything
+
+00:18:44.560 --> 00:18:46.520
+that I have in my usual Emacs.
+
+00:18:46.520 --> 00:18:49.360
+For example, I don't have much here.
+
+00:18:49.360 --> 00:18:55.040
+I don't have make installed, and so on.
+
+00:18:55.040 --> 00:19:06.640
+But we have feature-loader-portable package
+
+00:19:06.640 --> 00:19:09.960
+which just requires a few configure packages.
+
+00:19:09.960 --> 00:19:13.320
+Let's move it to a separate workspace.
+
+00:19:13.320 --> 00:19:21.680
+First of all, configure-rde-emacs-portable
+
+00:19:21.680 --> 00:19:23.720
+which just sets a few variables.
+
+00:19:23.720 --> 00:19:27.280
+rde configure-keycast which just shows
+
+00:19:27.280 --> 00:19:31.200
+something on the modeline
+
+00:19:31.200 --> 00:19:34.440
+which demonstrates the last hotkey pressed
+
+00:19:34.440 --> 00:19:40.080
+and the command which was invoked.
+
+00:19:40.080 --> 00:19:41.640
+We can enable which-key,
+
+00:19:41.640 --> 00:19:45.040
+and now when I type a prefix,
+
+00:19:45.040 --> 00:19:48.600
+I can see all the possible continuations
+
+00:19:48.600 --> 00:19:49.360
+for this prefix.
+
+00:19:49.360 --> 00:19:51.880
+I can enable vertico,
+
+00:19:51.880 --> 00:19:58.160
+and you can see, now we have nice completion UI.
+
+00:19:58.160 --> 00:20:03.560
+We can enable completion-related improvements
+
+00:20:03.560 --> 00:20:07.560
+and now I have not only UI itself, but also
+
+00:20:07.560 --> 00:20:15.320
+some notes here near each command,
+
+00:20:15.320 --> 00:20:17.800
+and ability to use regular expressions
+
+00:20:17.800 --> 00:20:21.480
+or some orderless matching.
+
+00:20:21.480 --> 00:20:26.400
+We can enable eshell,
+
+00:20:26.400 --> 00:20:31.320
+and now I have a hotkey for invoking Emacs shell.
+
+00:20:31.320 --> 00:20:35.920
+I don't have hotkey for vterm yet,
+
+00:20:35.920 --> 00:20:37.360
+but I can enable it,
+
+00:20:37.360 --> 00:20:40.800
+and now I have a terminal inside my Emacs.
+
+00:20:40.800 --> 00:20:43.240
+As you can see my usual shell is Zsh,
+
+00:20:43.240 --> 00:20:46.040
+but here I have a plain bash.
+
+00:20:46.040 --> 00:20:52.280
+Let's enable feature-git,
+
+00:20:52.280 --> 00:21:04.720
+and now I will be able to open my project.
+
+00:21:04.720 --> 00:21:11.488
+And inside this project,
+
+00:21:11.489 --> 00:21:14.640
+I will be able to open Magit
+
+00:21:14.640 --> 00:21:19.880
+and navigate around using imenu.
+
+00:21:19.880 --> 00:21:26.160
+Let's do few more things.
+
+00:21:26.160 --> 00:21:29.640
+Let's enable Org Roam
+
+00:21:29.640 --> 00:21:43.840
+so I will be able to open my EmacsConf notes.
+
+00:21:43.840 --> 00:21:48.240
+Let's enable configure-emacs.
+
+00:21:48.240 --> 00:21:53.320
+As you can see, the way it displayed updated.
+
+00:21:53.320 --> 00:21:59.520
+Let's enable configure-appearance,
+
+00:21:59.520 --> 00:22:03.880
+and you see the appearance of Emacs changed radically.
+
+00:22:03.880 --> 00:22:06.560
+And also, let's change the faces.
+
+00:22:06.560 --> 00:22:13.040
+And now you see almost my setup
+
+00:22:13.040 --> 00:22:14.800
+that you saw previously,
+
+00:22:14.800 --> 00:22:19.000
+but we build it from small tiny pieces.
+
+00:22:19.000 --> 00:22:27.520
+A little summary:
+
+00:22:27.520 --> 00:22:32.280
+rde is the one tool that you can use
+
+00:22:32.280 --> 00:22:34.440
+to manage the whole computing experience.
+
+00:22:34.440 --> 00:22:38.080
+It consists of composable components,
+
+00:22:38.080 --> 00:22:41.720
+and actually, it provides
+
+00:22:41.720 --> 00:22:43.240
+a reliable configuration framework.
+
+00:22:43.240 --> 00:22:46.360
+You always have a rollback.
+
+00:22:46.360 --> 00:22:49.320
+You always can switch to a generation
+
+00:22:49.320 --> 00:22:50.560
+you used a week ago.
+
+00:22:50.560 --> 00:22:57.520
+And of course, it's reproducible and declarative
+
+00:22:57.520 --> 00:22:58.680
+which is also very cool.
+
+00:22:58.680 --> 00:23:05.788
+rde Emacs is a part of rde
+
+00:23:05.789 --> 00:23:06.920
+but it can be used separately.
+
+00:23:06.920 --> 00:23:11.280
+You can think of it as an Emacs distribution
+
+00:23:11.280 --> 00:23:14.040
+which is vanilla-flavored, consistent,
+
+00:23:14.040 --> 00:23:15.960
+well-integrated, and self-contained.
+
+00:23:15.960 --> 00:23:19.560
+That's it for today.
+
+00:23:19.560 --> 00:23:22.054
+Don't hesitate to contact me
+
+00:23:22.055 --> 00:23:23.840
+via email or any other way.
+
+00:23:23.840 --> 00:23:28.154
+Thank you everyone for your attention
+
+00:23:28.155 --> 00:23:33.760
+and see you in a bit.
diff --git a/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main--chapters.vtt b/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main--chapters.vtt
new file mode 100644
index 00000000..713879c1
--- /dev/null
+++ b/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main--chapters.vtt
@@ -0,0 +1,56 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:20.479
+Introduction
+
+00:00:20.480 --> 00:00:51.799
+The end goal
+
+00:00:51.800 --> 00:02:11.519
+Constants and variables
+
+00:02:11.520 --> 00:02:40.039
+ROI
+
+00:02:40.040 --> 00:03:32.239
+Demo
+
+00:03:32.240 --> 00:04:02.239
+Detecting input
+
+00:04:02.240 --> 00:04:26.399
+Creating a table
+
+00:04:26.400 --> 00:05:17.959
+C-c C-c
+
+00:05:17.960 --> 00:07:12.999
+Our first formula
+
+00:07:13.000 --> 00:08:11.719
+Basic arithmetic
+
+00:08:11.720 --> 00:09:53.599
+Debugging
+
+00:09:53.600 --> 00:12:07.039
+Flags
+
+00:12:07.040 --> 00:12:50.039
+Recalculating
+
+00:12:50.040 --> 00:14:56.776
+Multiple formulas
+
+00:14:56.777 --> 00:16:36.201
+Formatting
+
+00:16:36.202 --> 00:18:12.202
+Conditional prompts
+
+00:18:12.203 --> 00:21:57.856
+Custom formulas
+
+00:21:57.857 --> 00:24:44.280
+Automatically updating
diff --git a/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.vtt b/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.vtt
new file mode 100644
index 00000000..5747aac9
--- /dev/null
+++ b/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.vtt
@@ -0,0 +1,1736 @@
+WEBVTT captioned by tom
+
+
+00:00:00.000 --> 00:00:05.453
+Hey, I'm Gopar and this is the
+
+00:00:05.454 --> 00:00:07.639
+Real Estate and Org Mode Table Formulas talk.
+
+00:00:07.640 --> 00:00:09.879
+Not very creative, but it is what it is.
+
+00:00:09.880 --> 00:00:13.051
+Now I just want to say that everything I talk about here
+
+00:00:13.052 --> 00:00:15.902
+is in the Org Mode in the Emacs manual.
+
+00:00:15.903 --> 00:00:17.909
+I posted a link to the web version,
+
+00:00:17.910 --> 00:00:20.479
+but it should be inside of Emacs as well.
+
+00:00:20.480 --> 00:00:25.096
+Now before I start, I want to showcase the end goal.
+
+00:00:25.097 --> 00:00:26.806
+That way you know if you guys want to
+
+00:00:26.807 --> 00:00:28.739
+actually see the talk or not.
+
+00:00:28.740 --> 00:00:30.491
+So I always think that's pretty cool to see
+
+00:00:30.492 --> 00:00:31.517
+what you're actually going to build
+
+00:00:31.518 --> 00:00:32.679
+before you start building it.
+
+00:00:32.680 --> 00:00:34.285
+Alright. So let me start off with the goal,
+
+00:00:34.286 --> 00:00:38.762
+the end goal. Here we have a simple table formula
+
+00:00:38.763 --> 00:00:42.613
+and we have some constants, some values inside the list--
+
+00:00:42.614 --> 00:00:44.639
+inside the table, I'm sorry,
+
+00:00:44.640 --> 00:00:47.672
+and some other stuff that we will get to,
+
+00:00:47.673 --> 00:00:49.279
+but for now... I don't want to spoil too much.
+
+00:00:49.280 --> 00:00:50.327
+I just want to give you a demo
+
+00:00:50.328 --> 00:00:51.799
+of how it actually works.
+
+00:00:51.800 --> 00:00:56.094
+We have a few values. Let me first go over the constants.
+
+00:00:56.095 --> 00:00:57.581
+We have PMI, which stands for
+
+00:00:57.582 --> 00:00:57.590
+private mortgage insurance,
+
+00:00:57.591 --> 00:01:00.536
+so it's insurance that you'll have to pay
+
+00:01:00.537 --> 00:01:03.639
+depending on how much money you put into the deal.
+
+00:01:03.640 --> 00:01:06.067
+The property tax, which is self-explanatory,
+
+00:01:06.068 --> 00:01:09.316
+the tax that you owe for owning the property,
+
+00:01:09.317 --> 00:01:11.106
+and then home insurance,
+
+00:01:11.107 --> 00:01:13.439
+and the interest rate at the loan that you get.
+
+00:01:13.440 --> 00:01:15.666
+So, here we have a few columns.
+
+00:01:15.667 --> 00:01:17.411
+The first one is called House,
+
+00:01:17.412 --> 00:01:20.623
+which I usually just put a description of the house
+
+00:01:20.624 --> 00:01:21.126
+with the link of the posting,
+
+00:01:21.127 --> 00:01:22.493
+the price of the house,
+
+00:01:22.494 --> 00:01:26.189
+the percentage down payment (this I play around with
+
+00:01:26.190 --> 00:01:27.473
+to see how much the deal will be structured),
+
+00:01:27.474 --> 00:01:30.528
+the down payment (which is calculated from
+
+00:01:30.529 --> 00:01:31.754
+the previous two columns),
+
+00:01:31.755 --> 00:01:34.144
+the monthly mortgage (which is calculated as well),
+
+00:01:34.145 --> 00:01:37.995
+and then the tenant income (which is what I suppose
+
+00:01:37.996 --> 00:01:41.005
+would be an example of the tenant income
+
+00:01:41.006 --> 00:01:42.752
+that I can potentially make off the property,
+
+00:01:42.753 --> 00:01:45.539
+the 1% rule and the ROI.
+
+00:01:45.540 --> 00:01:47.707
+I'll quickly go over the last two columns.
+
+00:01:47.708 --> 00:01:49.200
+So first is the 1% rule.
+
+00:01:49.300 --> 00:01:50.879
+The 1% rule is essentially
+
+00:01:50.880 --> 00:01:53.588
+a "rule," in quotes, that says that
+
+00:01:53.589 --> 00:01:56.277
+if a property matches this specific formula,
+
+00:01:56.278 --> 00:01:58.319
+it is a good deal to look into.
+
+00:01:58.320 --> 00:02:00.889
+So for example, the first two pass,
+
+00:02:00.890 --> 00:02:02.676
+and the last one does not pass.
+
+00:02:02.677 --> 00:02:04.104
+The last one, at a quick glance,
+
+00:02:04.105 --> 00:02:05.471
+we can just ignore it and say,
+
+00:02:05.472 --> 00:02:06.476
+"hey, that's not going to fly,"
+
+00:02:06.477 --> 00:02:07.999
+we'll just ignore it.
+
+00:02:08.000 --> 00:02:09.890
+I won't go too much into details.
+
+00:02:09.891 --> 00:02:11.519
+That's just a brief summary.
+
+00:02:11.520 --> 00:02:14.148
+So now the ROI is the return on investment.
+
+00:02:14.149 --> 00:02:17.599
+So it says "how much of a return am I getting
+
+00:02:17.600 --> 00:02:18.959
+on the amount that I invested?"
+
+00:02:18.960 --> 00:02:21.167
+So let's say you put in $12,000,
+
+00:02:21.168 --> 00:02:23.455
+and at the end of the year, you cashflow $6,000.
+
+00:02:23.456 --> 00:02:26.126
+So if you calculate the ROI off of that,
+
+00:02:26.127 --> 00:02:28.476
+you get a 50% return on investment.
+
+00:02:28.477 --> 00:02:30.085
+In two years, you'll make your money back,
+
+00:02:30.086 --> 00:02:31.733
+which is pretty good.
+
+00:02:31.734 --> 00:02:32.718
+Then all the rest of the years,
+
+00:02:32.719 --> 00:02:34.347
+you'll just slowly be reaping in all that,
+
+00:02:34.348 --> 00:02:36.639
+all the excess cash flow.
+
+00:02:36.640 --> 00:02:40.039
+But yeah, that's it in a nutshell.
+
+00:02:40.040 --> 00:02:42.269
+So let me demo it real quick.
+
+00:02:42.270 --> 00:02:44.258
+So for example, I'm going to change the down payment,
+
+00:02:44.259 --> 00:02:45.744
+but I want you to pay attention
+
+00:02:45.745 --> 00:02:48.213
+to this column [down payment]
+
+00:02:48.214 --> 00:02:49.839
+and the monthly mortgage column.
+
+00:02:49.840 --> 00:02:51.726
+So right here [down payment] is $25,000,
+
+00:02:51.727 --> 00:02:53.472
+and here [monthly mortgage] is around $1,200,
+
+00:02:53.473 --> 00:02:55.179
+a little under $1,300.
+
+00:02:55.180 --> 00:02:57.349
+So what happens if I say, you know,
+
+00:02:57.350 --> 00:02:58.795
+what I'm going to change the down payment
+
+00:02:58.796 --> 00:03:00.948
+to 5% instead, because I just
+
+00:03:00.949 --> 00:03:02.559
+don't want to put 10.
+
+00:03:02.560 --> 00:03:04.125
+So let's just put say 5.
+
+00:03:04.126 --> 00:03:06.274
+Then I tab out of here, and voila -
+
+00:03:06.275 --> 00:03:08.522
+you see it updated to half of $25,000.
+
+00:03:08.523 --> 00:03:09.946
+So now it's $12,000,
+
+00:03:09.947 --> 00:03:10.689
+and this [monthly mortgage] went up
+
+00:03:10.690 --> 00:03:12.233
+over actually $1,300,
+
+00:03:12.234 --> 00:03:14.783
+and then this [1% rule] hasn't changed at all
+
+00:03:14.784 --> 00:03:17.679
+and the ROI is there.
+
+00:03:17.680 --> 00:03:19.147
+So one thing that I should mention is
+
+00:03:19.148 --> 00:03:20.193
+everything that I'm putting here
+
+00:03:20.194 --> 00:03:21.279
+is just example numbers,
+
+00:03:21.280 --> 00:03:25.634
+should not be taken into literal real estate advice.
+
+00:03:25.635 --> 00:03:26.859
+I just want to put that out there.
+
+00:03:26.860 --> 00:03:28.367
+These are just examples to show you
+
+00:03:28.368 --> 00:03:30.519
+how you can potentially make it on your own,
+
+00:03:30.520 --> 00:03:32.239
+do the formulas on your own.
+
+00:03:32.240 --> 00:03:35.650
+Alright, so another cool thing that I did was
+
+00:03:35.651 --> 00:03:37.737
+if there is no tenant income and I tab,
+
+00:03:37.738 --> 00:03:40.048
+it says "Enter Tenant Income".
+
+00:03:40.049 --> 00:03:41.032
+So if I don't put anything,
+
+00:03:41.033 --> 00:03:42.399
+it will automatically tell me, hey,
+
+00:03:42.400 --> 00:03:44.919
+I can't calculate without the tenant income.
+
+00:03:44.920 --> 00:03:46.607
+I can also do this right here [ROI field],
+
+00:03:46.608 --> 00:03:48.475
+say the same thing, Enter Tenant Income,
+
+00:03:48.476 --> 00:03:50.563
+but I just didn't put it for whatever reason, but
+
+00:03:50.564 --> 00:03:53.812
+after this video, you should be easily able to
+
+00:03:53.813 --> 00:03:57.399
+put it without much struggle.
+
+00:03:57.400 --> 00:04:00.130
+Alright, so if that's something you're interested in,
+
+00:04:00.131 --> 00:04:02.239
+then keep watching.
+
+00:04:02.240 --> 00:04:05.239
+So let's go over the basics first.
+
+00:04:05.240 --> 00:04:07.399
+So, how do we create a table?
+
+00:04:07.400 --> 00:04:10.368
+Well, we can do M-x org-table-create.
+
+00:04:10.369 --> 00:04:14.301
+If we run that it, will prompt us in a minibuffer.
+
+00:04:14.302 --> 00:04:16.892
+It says table size, columns times row.
+
+00:04:16.893 --> 00:04:18.177
+Usually it's rows times columns,
+
+00:04:18.178 --> 00:04:19.502
+but it is what it is.
+
+00:04:19.602 --> 00:04:20.465
+So let's just leave
+
+00:04:20.466 --> 00:04:24.959
+the default of 5 times 2, and voila, we get this.
+
+00:04:24.960 --> 00:04:26.399
+Beautiful. Awesome.
+
+00:04:26.400 --> 00:04:29.510
+So the other way is using the magical C-c C-c
+
+00:04:29.511 --> 00:04:32.401
+in Org Mode, which basically is context-aware
+
+00:04:32.402 --> 00:04:36.053
+and does anything, does the right thing like,
+
+00:04:36.054 --> 00:04:38.599
+almost 100% of the time, which is pretty amazing.
+
+00:04:38.600 --> 00:04:42.431
+Alright, let's just say I write a pipe, some words,
+
+00:04:42.432 --> 00:04:44.679
+and then another pipe, Gopar, and then
+
+00:04:44.680 --> 00:04:47.268
+another pipe. Let's just say we're trying to
+
+00:04:47.269 --> 00:04:50.599
+write it out via text, because in Org mode
+
+00:04:50.600 --> 00:04:51.546
+everything has text.
+
+00:04:51.547 --> 00:04:53.379
+There's nothing fancy about it.
+
+00:04:53.380 --> 00:04:57.672
+If I do C-c C-c, Org mode should automatically be
+
+00:04:57.673 --> 00:04:59.839
+context-aware that this area is a table.
+
+00:04:59.840 --> 00:05:04.294
+So, C-c C-c, boom. So if I press enter, another column.
+
+00:05:04.295 --> 00:05:06.963
+If I press tab, it should automatically move me.
+
+00:05:06.964 --> 00:05:09.391
+So yeah, so that's pretty much it.
+
+00:05:09.392 --> 00:05:11.919
+That's how you get started into the column.
+
+00:05:11.920 --> 00:05:15.591
+So, I'm assuming most of the people here already know that.
+
+00:05:15.592 --> 00:05:17.959
+This is just the primary basic review.
+
+00:05:17.960 --> 00:05:19.807
+So, let's first go...
+
+00:05:19.808 --> 00:05:22.819
+Let's go dive right into our first formula.
+
+00:05:22.820 --> 00:05:24.766
+So I copied some values over here,
+
+00:05:24.767 --> 00:05:27.696
+just to save time, and the columns.
+
+00:05:27.697 --> 00:05:29.163
+So, let's go ahead and say that
+
+00:05:29.164 --> 00:05:30.749
+we have single family house,
+
+00:05:30.750 --> 00:05:33.018
+and the price is a hundred thousand.
+
+00:05:33.019 --> 00:05:34.163
+And, Let's say that I want the price,
+
+00:05:34.164 --> 00:05:36.431
+the down payment that I want to put is 10%.
+
+00:05:36.432 --> 00:05:40.527
+Right. Alright. 10%. Now if I tab
+
+00:05:40.528 --> 00:05:42.393
+or go to the next column, nothing happens.
+
+00:05:42.394 --> 00:05:43.879
+Why is that? Well, it's because
+
+00:05:43.880 --> 00:05:44.984
+(you probably guessed it)
+
+00:05:44.985 --> 00:05:47.755
+we haven't written or tied any table formulas.
+
+00:05:47.756 --> 00:05:49.563
+So we're saying, alright, enough talk.
+
+00:05:49.564 --> 00:05:50.440
+How do we do that?
+
+00:05:50.540 --> 00:05:52.093
+Well, the answer is very simple.
+
+00:05:52.094 --> 00:05:54.983
+We do a pound sign (#), if I can find it.
+
+00:05:54.984 --> 00:05:58.712
+#+ and then we do TBL for table
+
+00:05:58.713 --> 00:06:01.119
+and then FM for formula.
+
+00:06:01.120 --> 00:06:03.428
+So, table formula, and the column.
+
+00:06:03.429 --> 00:06:04.934
+So this, you're already halfway
+
+00:06:04.935 --> 00:06:07.063
+to writing your first table formula.
+
+00:06:07.064 --> 00:06:09.171
+So let's say we want to automatically,
+
+00:06:09.172 --> 00:06:10.978
+Let's just, for exercise,
+
+00:06:10.979 --> 00:06:13.189
+we want to put the down payment,
+
+00:06:13.190 --> 00:06:14.615
+just put some type of value in there,
+
+00:06:14.616 --> 00:06:16.382
+just to make sure that it's working.
+
+00:06:16.383 --> 00:06:20.992
+So the way Org Mode refers to columns is,
+
+00:06:20.993 --> 00:06:24.140
+we start with the dollar sign ($) and then
+
+00:06:24.141 --> 00:06:26.868
+we put the number that the column is.
+
+00:06:26.869 --> 00:06:29.113
+Indexes start with one, not a zero.
+
+00:06:29.114 --> 00:06:31.623
+As most of us watching are programmers,
+
+00:06:31.624 --> 00:06:33.792
+we're probably used to starting with zero,
+
+00:06:33.793 --> 00:06:34.959
+but it starts with one.
+
+00:06:34.960 --> 00:06:38.330
+So one, two, three, four, five.
+
+00:06:38.331 --> 00:06:39.654
+So down payment is the fifth column,
+
+00:06:39.655 --> 00:06:42.303
+we say five, and then we say equal to,
+
+00:06:42.304 --> 00:06:44.288
+let's say Gopar.
+
+00:06:44.289 --> 00:06:47.937
+Then we do C-c C-c to evaluate it,
+
+00:06:47.938 --> 00:06:50.545
+and the table is automatically updated.
+
+00:06:50.546 --> 00:06:50.857
+Look at that.
+
+00:06:50.957 --> 00:06:55.862
+So when you do just this, dollar sign ($) 5,
+
+00:06:55.863 --> 00:06:57.706
+it updates every single column.
+
+00:06:57.806 --> 00:07:00.679
+There is a way to specify that this cell only and
+
+00:07:00.680 --> 00:07:03.224
+this cell only but this is out of scope and it's
+
+00:07:03.324 --> 00:07:05.639
+not that hard it's just not in this video.
+
+00:07:05.640 --> 00:07:08.774
+I would recommend, I commend you, or, actually
+
+00:07:08.874 --> 00:07:12.999
+I recommend that you go check out the manual for that.
+
+00:07:13.000 --> 00:07:17.624
+All right so, let's say we want to do some basic
+
+00:07:17.724 --> 00:07:19.224
+arithmetic we want to do some list values
+
+00:07:19.324 --> 00:07:20.390
+instead of just putting in text.
+
+00:07:20.490 --> 00:07:21.440
+So how do we do that?
+
+00:07:21.540 --> 00:07:24.457
+Well, we have to pull the expression that we want
+
+00:07:24.557 --> 00:07:25.007
+to put in.
+
+00:07:25.107 --> 00:07:27.859
+So, for example, if we want to add we'll do 20 plus
+
+00:07:27.959 --> 00:07:31.357
+20 and if we do C-c C-C to evaluate it, it should
+
+00:07:31.457 --> 00:07:34.224
+update every single column, the entire column,
+
+00:07:34.324 --> 00:07:38.540
+the fifth column I mean and, tada, it does.
+
+00:07:38.640 --> 00:07:41.799
+Cool! So now let's say we want to do a little bit
+
+00:07:41.899 --> 00:07:42.556
+more advanced.
+
+00:07:42.656 --> 00:07:44.907
+Let's say we want to add the previous column to
+
+00:07:45.007 --> 00:07:47.007
+this column, so how do we refer to this one?
+
+00:07:47.107 --> 00:07:50.890
+Well, 1-2-3-4 is the fourth column, so we would
+
+00:07:50.990 --> 00:07:55.831
+just simply do $4 and this should automatically
+
+00:07:55.931 --> 00:07:58.057
+be referring to this column (% DP).
+
+00:07:58.157 --> 00:08:02.190
+So we'll do 10 + 20, it's going to be 30 over here,
+
+00:08:02.490 --> 00:08:04.174
+and let's do C-C C-c.
+
+00:08:04.274 --> 00:08:07.024
+Ooh, error, what happened?
+
+00:08:07.124 --> 00:08:08.874
+Oh my god, oh my god.
+
+00:08:08.974 --> 00:08:11.719
+Well, this seems scary but no worries.
+
+00:08:11.720 --> 00:08:14.077
+This is where debugging comes in pretty handy,
+
+00:08:14.078 --> 00:08:16.740
+which is actually our next section as you can see.
+
+00:08:16.940 --> 00:08:19.324
+So, what happens if we do, if we go into the
+
+00:08:19.424 --> 00:08:21.340
+debugging section, what is the first step?
+
+00:08:21.440 --> 00:08:24.790
+Well, the first step is to try out, is to enable
+
+00:08:24.890 --> 00:08:26.416
+formula debugger.
+
+00:08:26.516 --> 00:08:31.294
+So, if you do C-c {, it will turn on a minor mode
+
+00:08:31.394 --> 00:08:35.509
+that whenever you evaluate a table formula,
+
+00:08:35.510 --> 00:08:38.290
+the debugger will be enabled,
+
+00:08:38.291 --> 00:08:39.357
+will automatically kick in.
+
+00:08:39.457 --> 00:08:41.073
+And if you want to disable the debugger,
+
+00:08:41.074 --> 00:08:43.774
+you just run the command again, and it will turn off.
+
+00:08:43.874 --> 00:08:46.607
+So, let's go ahead and run it. C-c {.
+
+00:08:46.608 --> 00:08:48.790
+As you can see in the mini buffer, it says,
+
+00:08:48.791 --> 00:08:51.441
+"formula debugging has been turned on". Awesome!
+
+00:08:51.541 --> 00:08:53.157
+So if we go back to our table
+
+00:08:53.158 --> 00:08:58.400
+and we try to run this, and see what's going on, we see...
+
+00:08:58.500 --> 00:09:00.440
+Oh, first off, before we look
+
+00:09:00.441 --> 00:09:01.390
+at the buffer that just opened,
+
+00:09:01.391 --> 00:09:02.490
+look at the mini buffer,
+
+00:09:02.491 --> 00:09:04.974
+it says "Debugging Formula. Continue to next?"
+
+00:09:05.074 --> 00:09:07.874
+So if you have multiple or a series of formulas,
+
+00:09:07.974 --> 00:09:09.690
+it will say, "hey, do you want to debug this one
+
+00:09:09.691 --> 00:09:10.374
+or the next one?"
+
+00:09:10.474 --> 00:09:11.958
+So this is just saying, "hey, do you want to go
+
+00:09:12.058 --> 00:09:13.090
+into the next formula?"
+
+00:09:13.190 --> 00:09:14.990
+And since there's no next formula,
+
+00:09:14.991 --> 00:09:16.057
+debugger will just exit out
+
+00:09:16.058 --> 00:09:18.199
+and leave you with the other buffer to see.
+
+00:09:18.299 --> 00:09:19.949
+For now, we'll just click no.
+
+00:09:20.049 --> 00:09:22.590
+Right now, it doesn't matter if you click yes or no
+
+00:09:22.591 --> 00:09:23.540
+because there's only one formula,
+
+00:09:23.640 --> 00:09:26.072
+but we'll just click no, and let's go ahead and
+
+00:09:26.172 --> 00:09:27.657
+pay attention to the new buffer.
+
+00:09:27.757 --> 00:09:29.807
+Well, over here it might seem a little confusing,
+
+00:09:29.808 --> 00:09:32.390
+but don't worry, we're just going to ignore most of this.
+
+00:09:32.490 --> 00:09:33.890
+The first thing that we're going to pay
+
+00:09:33.990 --> 00:09:35.457
+attention is to the original.
+
+00:09:35.557 --> 00:09:38.067
+So it says, okay, this is the original, so we have
+
+00:09:38.167 --> 00:09:41.124
+a quote expression, which is just trying to add the
+
+00:09:41.324 --> 00:09:41.740
+fourth column.
+
+00:09:41.840 --> 00:09:42.840
+And if we go over here
+
+00:09:42.841 --> 00:09:44.207
+once everything is finalized,
+
+00:09:44.208 --> 00:09:47.107
+it says "hey, we're trying to add this 10,
+
+00:09:47.207 --> 00:09:50.240
+but it's actually a string 10, and added to 20.
+
+00:09:50.340 --> 00:09:52.325
+So of course it's going to be an error, so now we
+
+00:09:52.425 --> 00:09:53.999
+know what the error is.
+
+00:09:54.099 --> 00:09:56.090
+So you're saying all right cool, awesome, now how
+
+00:09:56.190 --> 00:09:58.840
+do we transform that string into a number?
+
+00:09:58.940 --> 00:10:02.607
+Well, Org Mode formulas have these flags
+
+00:10:02.608 --> 00:10:05.674
+that you can use, and essentially a flag looks like this.
+
+00:10:05.774 --> 00:10:10.257
+It's a semicolon (;) followed by some letter
+
+00:10:10.258 --> 00:10:13.270
+or some identifier
+
+00:10:13.370 --> 00:10:16.490
+that will let Org mode know that hey,
+
+00:10:16.590 --> 00:10:18.290
+this should be turned into a number
+
+00:10:18.291 --> 00:10:20.207
+or this should be turned into whatever.
+
+00:10:20.307 --> 00:10:22.724
+There's different ones for alpha literal
+
+00:10:22.725 --> 00:10:23.863
+and for a bunch of...
+
+00:10:23.963 --> 00:10:25.274
+I think there's even "i" for "integer",
+
+00:10:25.474 --> 00:10:26.819
+so it depends what you want.
+
+00:10:26.919 --> 00:10:28.202
+So for now we're just going to put "number"
+
+00:10:28.203 --> 00:10:29.490
+because it's a real number.
+
+00:10:29.590 --> 00:10:33.699
+If we do this and the debugger is still on,
+
+00:10:33.707 --> 00:10:35.274
+(remember because it automatically
+
+00:10:35.374 --> 00:10:36.374
+stays on until we turn it off),
+
+00:10:36.474 --> 00:10:41.540
+if we reevaluate the the formula,
+
+00:10:41.640 --> 00:10:43.624
+we should be able to see it.
+
+00:10:43.724 --> 00:10:47.379
+But first, before I do that, let's check step two.
+
+00:10:47.479 --> 00:10:52.240
+I'll now rerun formulas with C-c * and table,
+
+00:10:52.340 --> 00:10:54.639
+which calls org-table-recalculate.
+
+00:10:54.640 --> 00:10:58.507
+To do this, you actually have to be inside the table.
+
+00:10:58.607 --> 00:11:02.354
+Otherwise, Org mode will try to do some other stuff
+
+00:11:02.454 --> 00:11:04.325
+because it is context-aware, so depending on
+
+00:11:04.425 --> 00:11:06.324
+the context it might do something else.
+
+00:11:06.424 --> 00:11:09.124
+So if we do C-c *...
+
+00:11:09.224 --> 00:11:12.724
+As you can see the debugger has kicked in,
+
+00:11:12.824 --> 00:11:14.102
+says, "Do you want to continue to next?"
+
+00:11:14.202 --> 00:11:17.580
+Let's press yes (y), and it has been applied.
+
+00:11:17.680 --> 00:11:20.971
+So as you can see, it only updated one column--
+
+00:11:21.071 --> 00:11:22.977
+I'm sorry, one row--and the thing is,
+
+00:11:23.077 --> 00:11:28.007
+when you run this, the recalculate, it will only
+
+00:11:28.107 --> 00:11:30.361
+run for the current row that you're in.
+
+00:11:30.461 --> 00:11:32.785
+If you want to run for the entire table,
+
+00:11:32.885 --> 00:11:36.240
+you're going to do C-u C-c *.
+
+00:11:36.340 --> 00:11:38.407
+Before I do that, let me turn off the debugger
+
+00:11:38.507 --> 00:11:40.807
+since we no longer are in need of it.
+
+00:11:40.907 --> 00:11:44.977
+So C-c {, and debugging has been turned off.
+
+00:11:45.077 --> 00:11:50.807
+Now let me do C-u C-c * and as you can see
+
+00:11:50.808 --> 00:11:54.320
+the other rows also calculated, updated as well.
+
+00:11:54.420 --> 00:11:54.924
+Beautiful!
+
+00:11:55.024 --> 00:11:58.507
+So as I mentioned, feel free to look / browse the
+
+00:11:58.607 --> 00:12:00.107
+documentation for more flags
+
+00:12:00.108 --> 00:12:02.640
+because each flag has its own special meaning
+
+00:12:02.641 --> 00:12:07.139
+and will do different things, which is pretty cool.
+
+00:12:07.140 --> 00:12:08.124
+All right, cool.
+
+00:12:08.224 --> 00:12:10.007
+We're done with debugging and we fixed it.
+
+00:12:10.107 --> 00:12:12.075
+So there, now we know how to create formulas
+
+00:12:12.076 --> 00:12:14.207
+and how to debug them whenever they break,
+
+00:12:14.307 --> 00:12:15.040
+which is awesome.
+
+00:12:15.140 --> 00:12:18.324
+All right, but remember how I said that you can
+
+00:12:18.424 --> 00:12:23.659
+only debug... Whenever you run recalculate,
+
+00:12:23.660 --> 00:12:25.340
+It will only run the first formula?
+
+00:12:25.440 --> 00:12:28.439
+Well, let's say you want to have multiple formulas?
+
+00:12:28.539 --> 00:12:30.807
+This is completely valid, except the bad thing is
+
+00:12:30.907 --> 00:12:34.090
+that you have to do C-c C-c C-c on each each one,
+
+00:12:34.190 --> 00:12:39.457
+because C-u C-c * won't recalculate everything.
+
+00:12:39.557 --> 00:12:40.350
+It won't.
+
+00:12:40.450 --> 00:12:41.557
+Sadly, it doesn't do it.
+
+00:12:41.657 --> 00:12:44.189
+There is a way that you can do it,
+
+00:12:44.289 --> 00:12:46.459
+which is hacking together some elisp.
+
+00:12:46.460 --> 00:12:47.474
+You can probably find it
+
+00:12:47.475 --> 00:12:48.707
+or you can probably make it yourself
+
+00:12:48.807 --> 00:12:51.107
+if you look around, but that's out of scope for this.
+
+00:12:51.207 --> 00:12:57.099
+So now, how do we... We can write all the formulas
+
+00:12:57.100 --> 00:12:59.007
+we want in one single line.
+
+00:12:59.107 --> 00:13:01.740
+There's a way to to distinguish
+
+00:13:01.741 --> 00:13:03.340
+when one ends and one begins
+
+00:13:03.341 --> 00:13:04.707
+and that is the double colon (::).
+
+00:13:04.807 --> 00:13:07.607
+So right there, and a new formula will begin.
+
+00:13:07.707 --> 00:13:08.374
+So for example,
+
+00:13:08.474 --> 00:13:12.224
+let's say for the seventh column we say "gopar".
+
+00:13:12.324 --> 00:13:17.407
+If I do C-c C-c, it'll run every single thing
+
+00:13:17.507 --> 00:13:19.226
+so that... "gopar". Tada!
+
+00:13:19.326 --> 00:13:20.624
+There, awesome.
+
+00:13:20.724 --> 00:13:22.440
+But this is going to get very annoying if you're
+
+00:13:22.540 --> 00:13:25.007
+simply trying to edit formulas like this, right?
+
+00:13:25.107 --> 00:13:26.933
+So that's where the nicer debugging,
+
+00:13:27.033 --> 00:13:28.790
+nicer editing section comes in.
+
+00:13:28.890 --> 00:13:32.299
+So, yes, just like as mentioned, table calls
+
+00:13:32.300 --> 00:13:33.507
+only the first formula.
+
+00:13:33.607 --> 00:13:36.349
+So what's the step onto this nicer editing section?
+
+00:13:36.449 --> 00:13:40.424
+Try out "C-c ," or `org-edit-special`.
+
+00:13:40.524 --> 00:13:44.557
+So let's go back to the table formula and call it...
+
+00:13:44.657 --> 00:13:47.590
+oh my god, look at that,
+
+00:13:47.690 --> 00:13:49.890
+a new buffer just for editing,
+
+00:13:49.990 --> 00:13:52.599
+and each formula is in its own line to make
+
+00:13:52.699 --> 00:13:54.624
+it easier, which is beautiful!
+
+00:13:54.724 --> 00:13:58.715
+So, let's just say I want to do another calculation.
+
+00:13:58.815 --> 00:14:02.607
+Let's do eight times eight, which should be 64,
+
+00:14:02.707 --> 00:14:04.740
+and we have no need of putting this flag
+
+00:14:04.741 --> 00:14:07.440
+because the flag only affects it on the input coming in.
+
+00:14:07.540 --> 00:14:09.074
+I should have mentioned that earlier.
+
+00:14:09.174 --> 00:14:10.774
+Only input coming in.
+
+00:14:10.874 --> 00:14:13.174
+There is ways to affect the output,
+
+00:14:13.274 --> 00:14:16.474
+which we'll also cover in this topic later on,
+
+00:14:16.574 --> 00:14:19.131
+but for now, you can either leave the end flag
+
+00:14:19.231 --> 00:14:21.990
+or leave it out. It will still work fine.
+
+00:14:21.991 --> 00:14:23.507
+Let's just leave it out for now.
+
+00:14:23.508 --> 00:14:26.624
+Let's just do C-c C-c to make sure
+
+00:14:26.625 --> 00:14:30.690
+that everything is working. 64. Beautiful.
+
+00:14:30.790 --> 00:14:33.066
+So there you have it. You can have multiple formulas
+
+00:14:33.166 --> 00:14:34.778
+just stacked up into one line,
+
+00:14:34.878 --> 00:14:36.390
+and whenever you need to edit it,
+
+00:14:36.391 --> 00:14:38.257
+just go into that into that line
+
+00:14:38.357 --> 00:14:41.024
+and "C-c ,", and tada!
+
+00:14:41.124 --> 00:14:44.350
+You have this ready, good to go, and for editing.
+
+00:14:44.450 --> 00:14:45.824
+Oh and if you want to exit out,
+
+00:14:45.825 --> 00:14:48.940
+also just do "C-c ," again and you're back.
+
+00:14:49.040 --> 00:14:51.890
+I did not mention that. Sweet!
+
+00:14:51.990 --> 00:14:54.774
+So now we know how to have
+
+00:14:54.775 --> 00:14:57.006
+a better editing experience. Sweet!
+
+00:14:57.106 --> 00:15:00.240
+So now comes the formatting section which I talked about.
+
+00:15:00.340 --> 00:15:01.874
+So what's the first step?
+
+00:15:01.974 --> 00:15:05.507
+Well for formatting, Org mode uses
+
+00:15:05.508 --> 00:15:08.574
+the printf function from C.
+
+00:15:08.674 --> 00:15:10.374
+So those who are familiar with C,
+
+00:15:10.375 --> 00:15:12.823
+you'll feel right at home because the way you format it
+
+00:15:12.923 --> 00:15:13.940
+is exactly the same way.
+
+00:15:14.040 --> 00:15:16.557
+So for example, this will print off
+
+00:15:16.558 --> 00:15:18.873
+a floating number with two decimal points.
+
+00:15:18.973 --> 00:15:21.540
+As you can see here, this is how you will use it.
+
+00:15:21.640 --> 00:15:26.324
+It will be after the semicolon and it will be "%.2f".
+
+00:15:26.424 --> 00:15:28.157
+So let's go ahead and test that out.
+
+00:15:28.158 --> 00:15:30.590
+Actually, let's go ahead to our latest function--
+
+00:15:30.690 --> 00:15:32.340
+I mean, to our latest formula.
+
+00:15:32.440 --> 00:15:33.840
+Let's go ahead to the nicer buffer
+
+00:15:33.841 --> 00:15:39.207
+and let's do, Ctrl... Let's enter the semicolon,
+
+00:15:39.208 --> 00:15:45.324
+and then let's put the percent sign, we do 2f.
+
+00:15:45.424 --> 00:15:49.174
+Actually, let's make it five
+
+00:15:49.175 --> 00:15:52.590
+just to differentiate from the formula, and let's see.
+
+00:15:52.690 --> 00:15:57.174
+Let's run it, and tada!
+
+00:15:57.274 --> 00:16:00.179
+So yeah, as you can see, five decimal points.
+
+00:16:00.180 --> 00:16:01.857
+and if we want zero decimal points, we can also
+
+00:16:01.957 --> 00:16:04.957
+just move point zero, and tada!
+
+00:16:05.057 --> 00:16:06.124
+Just like that.
+
+00:16:06.224 --> 00:16:08.774
+We can also just leave it as is how it was before,
+
+00:16:08.874 --> 00:16:10.874
+because before, we didn't even actually need it,
+
+00:16:10.875 --> 00:16:13.014
+but yeah, just an example.
+
+00:16:13.114 --> 00:16:15.090
+And just a reminder, there are
+
+00:16:15.091 --> 00:16:17.357
+plenty more ways of formatting,
+
+00:16:17.358 --> 00:16:19.640
+just look at the documentation.
+
+00:16:19.740 --> 00:16:21.724
+There will be more. Basically every single thing
+
+00:16:21.725 --> 00:16:25.574
+that you need, just use the documentation as reference.
+
+00:16:25.674 --> 00:16:28.340
+Cool! So now we know how to debug,
+
+00:16:28.341 --> 00:16:29.774
+how to write formulas
+
+00:16:29.775 --> 00:16:32.824
+and how to get a better, nicer editing buffer
+
+00:16:32.825 --> 00:16:35.124
+for the formula so we don't have to do it all
+
+00:16:35.125 --> 00:16:36.240
+in a single line.
+
+00:16:36.340 --> 00:16:38.657
+So, what about conditional prompts, like I was
+
+00:16:38.757 --> 00:16:43.390
+showing in the first table in the end goal?
+
+00:16:43.490 --> 00:16:47.299
+Well that's actually pretty simple because we already
+
+00:16:47.300 --> 00:16:48.324
+know how to do this.
+
+00:16:48.424 --> 00:16:51.133
+Yes, if you think about it for a second, if we are
+
+00:16:51.233 --> 00:16:54.221
+able to pull lisp s-expressions, then we are able to
+
+00:16:54.321 --> 00:16:56.290
+basically do it already. Here's an example.
+
+00:16:56.390 --> 00:17:01.807
+We're saying if the second column is empty, is zero--
+
+00:17:01.907 --> 00:17:04.619
+so actually, this should be with the N flag
+
+00:17:04.620 --> 00:17:06.940
+because we will transform empty values as zero,
+
+00:17:07.040 --> 00:17:08.819
+and that's how Org mode will read those.
+
+00:17:08.820 --> 00:17:12.424
+It's saying if the second flag is zero,
+
+00:17:12.425 --> 00:17:16.952
+then I want you to put "Enter the values."
+
+00:17:17.052 --> 00:17:20.440
+And if it's not empty, we're going to put
+
+00:17:20.540 --> 00:17:22.190
+"Values entered." We're going to recognize.
+
+00:17:22.290 --> 00:17:24.240
+So let's go ahead and actually do this.
+
+00:17:24.540 --> 00:17:28.990
+So let's grab this, and let's type it in.
+
+00:17:29.090 --> 00:17:36.457
+So let's go ahead. "Enter the values," because it
+
+00:17:36.557 --> 00:17:37.390
+doesn't have any.
+
+00:17:37.490 --> 00:17:42.440
+So let's go ahead and say "Hello EmacsConf"
+
+00:17:42.441 --> 00:17:47.224
+and let's go ahead and run it again.
+
+00:17:47.324 --> 00:17:48.457
+Since there are values,
+
+00:17:48.458 --> 00:17:51.574
+it's going to overwrite what's here and put value entered.
+
+00:17:51.674 --> 00:17:53.398
+So let's go ahead.
+
+00:17:53.498 --> 00:17:55.690
+Tada, so there you go.
+
+00:17:55.790 --> 00:18:00.524
+So that is pretty much how you do conditional props,
+
+00:18:00.624 --> 00:18:01.940
+which is pretty straightforward
+
+00:18:01.941 --> 00:18:02.724
+once you think about it
+
+00:18:02.725 --> 00:18:05.440
+because if you are able to insert Lisp expressions,
+
+00:18:05.441 --> 00:18:08.240
+then you are able to just do that check
+
+00:18:08.241 --> 00:18:11.074
+and do the conditional check yourself.
+
+00:18:11.174 --> 00:18:13.540
+So, custom formulas.
+
+00:18:13.640 --> 00:18:15.324
+Yeah, you'll see what I mean.
+
+00:18:15.424 --> 00:18:19.924
+We want to be able to put our own custom functions,
+
+00:18:20.024 --> 00:18:23.890
+and you probably have an idea how to do this already.
+
+00:18:23.990 --> 00:18:27.059
+Yes, we also know how to do this already.
+
+00:18:27.060 --> 00:18:30.357
+Before I continue, I'm going to say that I already
+
+00:18:30.457 --> 00:18:31.940
+have some formulas that I use
+
+00:18:31.941 --> 00:18:33.374
+which are not part of this talk
+
+00:18:33.375 --> 00:18:37.390
+because they're just functions that calculate some stuff.
+
+00:18:37.490 --> 00:18:39.990
+So for example, they calculate the monthly mortgage,
+
+00:18:40.090 --> 00:18:43.257
+the monthly PMI, property tax, homeowners insurance,
+
+00:18:43.357 --> 00:18:44.757
+so a bunch of other stuff.
+
+00:18:44.857 --> 00:18:49.729
+I have these functions already and they are a bit off,
+
+00:18:49.829 --> 00:18:52.212
+but for this example, they're doing everything.
+
+00:18:52.312 --> 00:18:54.390
+It's close enough, so don't worry too much.
+
+00:18:54.490 --> 00:18:56.824
+Just an example, you can have your own function
+
+00:18:56.924 --> 00:18:59.213
+that does something else like calculate
+
+00:18:59.313 --> 00:19:01.540
+a REI B rental or something like that.
+
+00:19:01.640 --> 00:19:03.219
+So you can do whatever you want.
+
+00:19:03.220 --> 00:19:04.724
+As long as you can call via Lisp,
+
+00:19:04.824 --> 00:19:07.899
+you can call it in Org mode, in the table formulas.
+
+00:19:07.900 --> 00:19:11.337
+So let's exit out of there.
+
+00:19:11.437 --> 00:19:13.807
+Now that we know how to do everything,
+
+00:19:13.808 --> 00:19:20.924
+let me go back to the original table and go from there.
+
+00:19:21.024 --> 00:19:26.524
+Let me close all these out actually.
+
+00:19:26.624 --> 00:19:29.524
+Now let's go back and revisit this table,
+
+00:19:29.624 --> 00:19:31.619
+since we'll be much, much more familiar
+
+00:19:31.620 --> 00:19:35.418
+except for one thing, which I will explain.
+
+00:19:35.518 --> 00:19:38.040
+So we have the constants right there
+
+00:19:38.041 --> 00:19:39.690
+and we have the house prices
+
+00:19:39.691 --> 00:19:42.499
+and we have everything just like I mentioned before.
+
+00:19:42.500 --> 00:19:44.023
+The main part that we want to look at
+
+00:19:44.123 --> 00:19:45.024
+is the table formula.
+
+00:19:45.124 --> 00:19:47.474
+So let's open up our special editing buffer,
+
+00:19:47.574 --> 00:19:49.674
+"C-c ,",
+
+00:19:49.774 --> 00:19:52.390
+and as you can see, I have some right here.
+
+00:19:52.490 --> 00:19:53.524
+So, the fifth column I'm saying,
+
+00:19:53.624 --> 00:19:55.824
+"Hey, we're gonna call this function
+
+00:19:55.924 --> 00:19:58.557
+rei-calculate-down-payment, and I'm gonna
+
+00:19:58.657 --> 00:20:00.757
+pass in the third column and fourth column
+
+00:20:00.758 --> 00:20:02.339
+and I'm going to pass in t." (true)
+
+00:20:02.340 --> 00:20:05.874
+I believe this is just to normalize,
+
+00:20:07.174 --> 00:20:12.057
+to convert to the proper decimal place,
+
+00:20:12.157 --> 00:20:14.079
+so let's not worry too much about that.
+
+00:20:14.179 --> 00:20:16.690
+Then for the sixth column, we're going to say
+
+00:20:16.790 --> 00:20:18.045
+"I calculate the monthly mortgage."
+
+00:20:18.145 --> 00:20:20.124
+We're going to pass in the third column
+
+00:20:20.224 --> 00:20:21.339
+the INTEREST_RATE, which we have
+
+00:20:21.439 --> 00:20:22.979
+defined over here in the constants.
+
+00:20:22.980 --> 00:20:26.274
+The 30, I believe this is for 30 years,
+
+00:20:26.374 --> 00:20:29.323
+PMI, the PROPERTY_TAX and HOME_INSURANCE,
+
+00:20:29.423 --> 00:20:30.774
+and then the fourth column.
+
+00:20:30.874 --> 00:20:33.824
+Then everything is going to be accepted as numbers,
+
+00:20:33.924 --> 00:20:35.074
+and we're going to have two decimals
+
+00:20:35.174 --> 00:20:36.174
+at the end of the place.
+
+00:20:36.274 --> 00:20:37.507
+So, what else?
+
+00:20:37.607 --> 00:20:40.074
+Over here is where we have our conditionals.
+
+00:20:40.174 --> 00:20:42.274
+We're saying, "hey, if the seventh column is 0,
+
+00:20:42.374 --> 00:20:44.302
+press 'Enter Tenant Income'."
+
+00:20:44.402 --> 00:20:48.407
+Over here as well, if the seventh column is zero,
+
+00:20:48.507 --> 00:20:51.724
+we're going to press 'Enter Tenant Income'
+
+00:20:51.824 --> 00:20:53.605
+and for this one we're going to say,
+
+00:20:53.705 --> 00:20:55.940
+"Hey, we're going to normalize the price."
+
+00:20:56.040 --> 00:20:59.240
+I believe this is a 1% rule.
+
+00:20:59.340 --> 00:21:01.390
+This could have been extracted into a function,
+
+00:21:01.490 --> 00:21:03.939
+but I just did the calculation right here.
+
+00:21:04.239 --> 00:21:07.890
+This, I believe, is the ROI, 12 months.
+
+00:21:07.990 --> 00:21:11.007
+This is just calculating the cash flow.
+
+00:21:11.107 --> 00:21:14.907
+This is a very rudimentary function or formula.
+
+00:21:15.407 --> 00:21:16.732
+Do not use this because there is way more
+
+00:21:16.733 --> 00:21:18.840
+to go into calculating the cash flow
+
+00:21:18.841 --> 00:21:21.499
+and also, it differs from person to person.
+
+00:21:21.599 --> 00:21:23.774
+Some people are more conservative,
+
+00:21:23.874 --> 00:21:26.959
+other people are way more liberal, so it just
+
+00:21:26.960 --> 00:21:28.874
+depends how you want to calculate it.
+
+00:21:28.974 --> 00:21:34.240
+As you can see, we have the N flag for numeric number
+
+00:21:34.241 --> 00:21:36.090
+and then we're saying we're formatting
+
+00:21:36.190 --> 00:21:37.694
+to one decimal place.
+
+00:21:37.794 --> 00:21:43.207
+The %% sign is just to input a percent sign as itself.
+
+00:21:43.208 --> 00:21:45.419
+Otherwise, Org mode is going to think
+
+00:21:45.420 --> 00:21:47.940
+it's some type of a formatter, which it's not.
+
+00:21:48.040 --> 00:21:49.140
+If you do... As I mentioned,
+
+00:21:49.240 --> 00:21:51.690
+if you've used the printf function in C or C++,
+
+00:21:51.790 --> 00:21:55.507
+then you probably know how to use it.
+
+00:21:55.607 --> 00:22:01.824
+Okay, so this is pretty much everything in a nutshell.
+
+00:22:01.924 --> 00:22:04.970
+So, one thing that I do want to say
+
+00:22:05.070 --> 00:22:06.379
+is the last section,
+
+00:22:06.479 --> 00:22:07.774
+which is automatically updating,
+
+00:22:07.874 --> 00:22:10.174
+which is the part that blew my mind
+
+00:22:10.175 --> 00:22:11.457
+when I realized that Org Mode can do this.
+
+00:22:11.557 --> 00:22:12.477
+So how do we do it?
+
+00:22:12.577 --> 00:22:14.659
+Well, you probably guessed just from looking at
+
+00:22:14.660 --> 00:22:18.324
+at the first table that we have right now.
+
+00:22:18.424 --> 00:22:20.774
+We add a column at the beginning
+
+00:22:20.874 --> 00:22:22.857
+of the table with a percent (%)--
+
+00:22:22.957 --> 00:22:24.857
+I'm sorry, with the pound sign (#)
+
+00:22:24.957 --> 00:22:28.457
+or hashtag as the younger kids call it.
+
+00:22:28.557 --> 00:22:31.045
+So this is what we do.
+
+00:22:31.145 --> 00:22:32.819
+We added a column at the beginning of the
+
+00:22:32.820 --> 00:22:34.984
+table, we do pound sign (#).
+
+00:22:35.084 --> 00:22:35.790
+So this is what it's for.
+
+00:22:35.890 --> 00:22:38.839
+This lets Org mode know that "hey,
+
+00:22:38.840 --> 00:22:41.140
+I want the values, the table formulas,
+
+00:22:41.240 --> 00:22:43.957
+to automatically run on each tab change."
+
+00:22:44.057 --> 00:22:46.240
+Now I believe that you can make it so that
+
+00:22:46.340 --> 00:22:49.123
+it changes, so that it updates on every keystroke.
+
+00:22:49.223 --> 00:22:51.024
+I think that's too much.
+
+00:22:51.124 --> 00:22:53.007
+And then you can also make it so that
+
+00:22:53.107 --> 00:22:56.019
+only certain rows update or certain columns.
+
+00:22:56.020 --> 00:22:58.219
+There's a plethora of things that you can do.
+
+00:22:58.319 --> 00:23:00.924
+You should definitely read up on the documentation,
+
+00:23:01.024 --> 00:23:03.425
+because you will probably make a way better talk,
+
+00:23:03.525 --> 00:23:06.974
+a way more advanced talk than I on this one,
+
+00:23:07.074 --> 00:23:09.574
+so I'm looking forward for that.
+
+00:23:09.674 --> 00:23:12.459
+But this is essentially how you build
+
+00:23:12.460 --> 00:23:15.507
+a Org mode table formula that will help you know
+
+00:23:15.508 --> 00:23:17.125
+if a property is correct.
+
+00:23:17.225 --> 00:23:22.340
+So, let's go ahead and as a final out to this demo,
+
+00:23:22.440 --> 00:23:25.419
+let's go ahead and enter a new column.
+
+00:23:25.420 --> 00:23:30.174
+Org-mode automatically puts the pound sign (#),
+
+00:23:30.274 --> 00:23:35.440
+which is awesome, and let's just say 'Emacs House',
+
+00:23:35.540 --> 00:23:39.590
+and let's say it is 100k.
+
+00:23:39.690 --> 00:23:44.339
+So 100k, and as you can see it's already trying to
+
+00:23:44.340 --> 00:23:46.040
+calculate the monthly mortgage,
+
+00:23:46.140 --> 00:23:47.090
+but we'll see about that,
+
+00:23:47.190 --> 00:23:49.879
+and let's just put 10% down.
+
+00:23:49.880 --> 00:23:53.057
+So 10% of 100k should be 10,000.
+
+00:23:53.157 --> 00:23:56.407
+So 10,000, correct, and the monthly mortgage is that
+
+00:23:56.408 --> 00:24:00.090
+and let's just say the tenant income is,
+
+00:24:00.190 --> 00:24:01.657
+as you can see right here,
+
+00:24:01.757 --> 00:24:05.874
+tenant income is, let's say 1500.
+
+00:24:05.974 --> 00:24:07.274
+Is it passing the 1% rule?
+
+00:24:07.374 --> 00:24:09.424
+Yep! What's my ROI?
+
+00:24:09.524 --> 00:24:13.879
+118%, which is kind of cool actually.
+
+00:24:13.880 --> 00:24:14.707
+That's a nice deal.
+
+00:24:14.907 --> 00:24:17.657
+So this is a rudimentary way of
+
+00:24:17.757 --> 00:24:20.319
+calculating deals in Org mode.
+
+00:24:20.419 --> 00:24:44.380
+I hope you found it interesting, and yeah, that is it.
diff --git a/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers--chapters.vtt b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers--chapters.vtt
new file mode 100644
index 00000000..9dac1e1f
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers--chapters.vtt
@@ -0,0 +1,109 @@
+WEBVTT
+
+00:00:56.800 --> 00:03:24.599
+Pragmatically, how are people that buy into these ideals, and especially those that build the software, meant to live/thrive, short of renouncing many of the luxuries of modern life, as many have been struggling to reconcile both, it appears? Wouldn't it be smarter and more productive longer-term to solve that problem too?
+
+00:03:24.600 --> 00:04:28.679
+I have been admiring your work for free software for many years now. I am a bit concerned about what will happen to the GNU project when you retire (not soon, I hope!!). Have you planned how to manage the GNU project in the long run?
+
+00:04:52.520 --> 00:07:10.799
+In response to your aversion to JavaScript support in Emacs: In the same way that to revolt against the nonfree spirit in software development one has to develop software, and that to fight nonfree compilers one has to write a free compiler - can you fairly consider rejection of JavaScript as a tool conducive to improving the state of free JavaScript? A server can send back any MIME type to execute on your machine, JS was just the most convenient.
+
+00:07:27.000 --> 00:08:38.999
+With all the recent additions and optimizations to Emacs Lisp (lexical scoping, native compilation etc.) would you deem Emacs Lisp suitable for general purpose programming outside Emacs (i.e. scripting, running web servers). If not, why?
+
+00:08:44.760 --> 00:09:27.439
+Could you give a few examples of the medium-sized jobs necessary for WYSIWYG-editor support in Emacs?
+
+00:09:33.480 --> 00:10:48.639
+Should GNU (or someone else) define a safe-subset of HTML/CSS/JS to make web browsers simpler and safer (e.g. by preventing JS from contacting servers)?
+
+00:10:57.440 --> 00:13:50.479
+How can we ensure the continuity of an understanding of the more arcane parts of the [Emacs] source code, and increase their evolvability, notably with regards to display, single-threading limitations, etc.?
+
+00:13:50.480 --> 00:14:50.279
+Are there any problems or disadvantages using the GNU AGPL for non-networked software like Emacs packages?
+
+00:14:50.280 --> 00:16:36.839
+Is there a list of Emacs issues which can be solved by programmers with different levels? For example my level is A, I know basic elisp and C. How can I help?
+
+00:16:36.840 --> 00:17:19.359
+What roadblocks kept some of the other efforts from being used with Emacs?
+
+00:17:36.240 --> 00:17:55.119
+What do you use emacs for beyond editing?
+
+00:17:55.120 --> 00:18:37.279
+Song about e-mail
+
+00:18:49.556 --> 00:19:59.039
+Emacs is used by a small population relative to the population that could benefit from it. Do you have any thoughts on how to expand the user base more broadly even among software developers?
+
+00:20:05.760 --> 00:22:42.439
+Would a namespace system similar to Common Lisp packages but without :USE work in Emacs? Modern CL implementations have package local nicknames to create package local prefixes.
+
+00:22:42.440 --> 00:24:26.919
+With Emacs 29 adding more (awesome) features into vanilla Emacs, how should we ensure vanilla Emacs does not get bloated with many similar features? (example: ido/icomplete, vc/magit)
+
+00:24:26.920 --> 00:25:35.039
+Do you recommend reaching out in [high] schools for volunteers instead of universities because they are more prone to value the objectives of freedom?
+
+00:25:35.040 --> 00:27:14.879
+What was the thought process behind making Emacs Lisp dynamically scoped when you first created it? What advantages did it provide over the alternative?
+
+00:27:18.766 --> 00:29:28.839
+It's hard to pick up Emacs if you do not speak English. Can something be done to address that?
+
+00:29:28.840 --> 00:33:54.479
+Do you use Org or Org mode, and if so, to what extent?
+
+00:33:54.480 --> 00:35:19.039
+What do you have in mind for more modular Emacs development?
+
+00:35:19.040 --> 00:36:18.639
+Reframing the school question
+
+00:36:18.640 --> 00:37:48.799
+In light of that critique of JavaScript not being about the language per se but rather the "culture of blindly getting and running packages/libraries", what's so different with what's currently done by the vast majority of Emacs/Elisp users to just install packages blindly?
+
+00:37:48.800 --> 00:38:54.879
+Do you still intend to merge your patch to the "shorthands" feature to the master branch?
+
+00:38:54.880 --> 00:40:27.919
+Do you think the freedom e.g., we have in Emacs, becomes a hurdle for some people to pursue more important things in the world? I used to do a lot of Emacs programming, but I recently try to stay away from tinkering on Emacs.
+
+00:40:27.920 --> 00:43:28.839
+Question about software freedom: how does it apply to software that are art/media experiences, like videogames? In your view, Is the creator of a videogame obliged to release it under a free license?
+
+00:43:35.915 --> 00:45:45.567
+Have you seen Haketilo? It seems similar to LibreJS.
+
+00:45:45.568 --> 00:47:09.799
+Do you have any suggestions for helping propective contributers streamline
+the copyright assignment needed to contribute to Emacs (and other FSF software
+projects)?
+
+00:47:09.800 --> 00:49:31.279
+Can complexity induced by company-funded free/libre code become a problem, when the company pulls out, leaving the code potentially unmaintainable?
+
+00:49:31.280 --> 00:52:06.250
+What do you think of Hyperbole or EEV instead of org mode, or other things for the stuff that org mode does "second brain / knowledge base", or GTD 'getting things done' etc... among other things in Emacs or other Emacs packages
+
+00:52:06.251 --> 00:53:02.999
+Are there plans to bring modal editing (eg. evil-mode, viper) to Emacs core and did your opinion on modal editing change over the years?
+
+00:53:03.000 --> 00:54:04.839
+What is your opinion on the current state of large machine
+learning/AI models?
+
+00:54:14.302 --> 00:55:38.839
+I thought it was a virtue to separate the content from the style orappearance of information. Part of being free is also to view information in the format that you want. Does your WYSIWYG idea erode this virtue and lead to more thinking -- perhaps undue thinking about style over substance?
+
+00:55:38.840 --> 00:56:30.759
+Do you ever dabble in retro-computing, e.g. logging into TOPS10/20 systems SDF, etc?
+
+00:56:38.196 --> 00:58:04.479
+Do you know Gemini?
+
+00:58:04.480 --> 00:59:49.960
+stallmansupport.org
diff --git a/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.vtt b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.vtt
new file mode 100644
index 00000000..eee7b8cc
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.vtt
@@ -0,0 +1,2217 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:02.492
+[Amin]: Yep, thanks RMS for the great talk.
+
+00:00:02.493 --> 00:00:04.759
+Now it's time for questions and answers.
+
+00:00:04.760 --> 00:00:13.519
+I will paste the questions here and RMS will choose which ones to answer.
+
+00:00:13.520 --> 00:00:17.501
+[Richard]: Please don't post a lot of questions in the Mumble chat
+
+00:00:17.502 --> 00:00:19.239
+and fill up the buffer.
+
+00:00:19.240 --> 00:00:25.359
+There's a limit to what I can see on the screen, so make sure it's visible.
+
+00:00:25.360 --> 00:00:27.159
+Don't get too far ahead.
+
+00:00:27.160 --> 00:00:42.279
+[Amin]: Sure, I will only paste one or two questions at a time.
+
+00:00:42.280 --> 00:00:43.639
+I think it would also be helpful
+
+00:00:43.640 --> 00:00:47.359
+if you read out the questions as you answer them, Richard.
+
+00:00:47.360 --> 00:00:56.799
+[Richard]: Okay.
+
+NOTE Pragmatically, how are people that buy into these ideals, and especially those that build the software, meant to live/thrive, short of renouncing many of the luxuries of modern life, as many have been struggling to reconcile both it appears. Wouldn't it be smarter and more productive longer-term to solve that problem too?
+
+00:00:56.800 --> 00:01:01.079
+Well, this question is a little silly.
+
+00:01:01.080 --> 00:01:05.159
+It's based on sort of all or none thinking.
+
+00:01:05.160 --> 00:01:09.079
+Pragmatically, how are people that buy into these ideals?
+
+00:01:09.080 --> 00:01:11.199
+I find that term offensive.
+
+00:01:11.200 --> 00:01:16.479
+And especially those that build the software meant to live/thrive,
+
+00:01:16.480 --> 00:01:20.839
+short of renouncing many of the luxuries of modern life.
+
+00:01:20.840 --> 00:01:24.239
+It's repackaged standard.
+
+00:01:24.240 --> 00:01:30.319
+You'll die if you don't write proprietary software.
+
+00:01:30.320 --> 00:01:33.839
+But most people in the world don't write proprietary software
+
+00:01:33.840 --> 00:01:36.079
+and that doesn't kill them.
+
+00:01:36.080 --> 00:01:41.799
+Whatever you do to make money, if you're reasonably well paid at it,
+
+00:01:41.800 --> 00:01:44.119
+which if you're working in software, I hope you are,
+
+00:01:44.120 --> 00:01:49.479
+that enables you to have a lot of time to do something else,
+
+00:01:49.480 --> 00:01:53.199
+like write some free software, even supposing you find no way
+
+00:01:53.200 --> 00:02:01.639
+to make any money from the free software world, but that's just the worst case.
+
+00:02:01.640 --> 00:02:08.079
+And for a lot of people, the life they find isn't the worst case.
+
+00:02:08.080 --> 00:02:13.559
+So I think it's basically, the question is an exaggeration.
+
+00:02:13.560 --> 00:02:16.399
+We don't need to worry about it.
+
+00:02:16.400 --> 00:02:22.479
+There are many businesses which do hire people to write free software.
+
+00:02:22.480 --> 00:02:26.079
+So write whatever free program for the business
+
+00:02:26.080 --> 00:02:28.079
+that the business wants you to write.
+
+00:02:28.080 --> 00:02:32.759
+And make sure you get permission to write your own software
+
+00:02:32.760 --> 00:02:34.639
+and release it as free software
+
+00:02:34.640 --> 00:02:38.239
+and contribute it to free software projects,
+
+00:02:38.240 --> 00:02:46.759
+and you'll be able to contribute.
+
+00:02:46.760 --> 00:02:48.439
+How can I help?
+
+00:02:48.440 --> 00:02:52.519
+In addition, one very big part of the software business
+
+00:02:52.520 --> 00:02:56.359
+is custom software development for a client.
+
+00:02:56.360 --> 00:02:59.919
+One client at a time, basically.
+
+00:02:59.920 --> 00:03:05.519
+And if that business is not treating its clients as suckers,
+
+00:03:05.520 --> 00:03:10.719
+it will release the code to them under a free software license.
+
+00:03:10.720 --> 00:03:14.039
+Okay, there you are. You're getting paid to write free software.
+
+00:03:14.040 --> 00:03:24.599
+Perfectly ethical.
+
+NOTE I have been admiring your work for free software for many years now. I am a bit concerned about what will happen to the GNU project when you retire (not soon, I hope!!). Have you planned how to manage the GNU project in the long run?
+
+00:03:24.600 --> 00:03:28.719
+I have been admiring your work for free software for many years now.
+
+00:03:28.720 --> 00:03:33.639
+I'm a bit concerned about what will happen to the GNU project when you retire.
+
+00:03:33.640 --> 00:03:37.359
+Have you planned how to manage the GNU project in the long run?
+
+00:03:37.360 --> 00:03:45.359
+I haven't found a way. I had an idea for what to do.
+
+00:03:45.360 --> 00:03:54.639
+I hoped to train some people who were activists and committed supporters
+
+00:03:54.640 --> 00:04:01.159
+to start making some decisions without me and I would give them feedback.
+
+00:04:01.160 --> 00:04:10.199
+But I didn't succeed in getting them to discuss issues and propose decisions.
+
+00:04:10.200 --> 00:04:11.719
+Well, I guess I'll have to try again. Over.
+
+00:04:11.720 --> 00:04:28.679
+Just a second. I have to go and open the door.
+
+NOTE In response to your aversion to JavaScript support in Emacs: In the same way that to revolt against the nonfree spirit in software development one has to develop software, and that to fight nonfree compilers one has to write a free compiler - can you fairly consider rejection of JavaScript as a tool conducive to improving the state of free JavaScript? A server can send back any MIME type to execute on your machine, JS was just the most convenient.
+
+00:04:52.520 --> 00:04:55.479
+In response to your aversion to JavaScript support in Emacs
+
+00:04:55.480 --> 00:04:58.039
+in the same way that to revolt against
+
+00:04:58.040 --> 00:05:00.479
+the non-free spirit in software development,
+
+00:05:00.480 --> 00:05:04.439
+one has to develop software and that to fight non-free compilers,
+
+00:05:04.440 --> 00:05:05.999
+one has to write a free compiler.
+
+00:05:06.000 --> 00:05:11.199
+Can you fairly consider rejection of JavaScript as a tool conducive
+
+00:05:11.200 --> 00:05:14.159
+to improving the state of free JavaScript?
+
+00:05:14.160 --> 00:05:16.759
+There's a fundamental confusion here.
+
+00:05:16.760 --> 00:05:23.439
+The problem with JavaScript is not comparable to the problem of
+
+00:05:23.440 --> 00:05:31.519
+non-free C compilers or C++ compilers or Java compilers.
+
+00:05:31.520 --> 00:05:36.839
+This is a totally different kind of issue.
+
+00:05:36.840 --> 00:05:40.479
+We have free JavaScript support.
+
+00:05:40.480 --> 00:05:45.839
+Free browsers contain that.
+
+00:05:45.840 --> 00:05:48.519
+That's not the issue.
+
+00:05:48.520 --> 00:05:52.399
+The issue is what about the programs you're going to run?
+
+00:05:52.400 --> 00:05:58.359
+If you're talking about C, well, if you're going to run a C program,
+
+00:05:58.360 --> 00:06:02.799
+it's because at compile at first, it's because you got the source code.
+
+00:06:02.800 --> 00:06:09.039
+Probably it's free software or else it's a private project,
+
+00:06:09.040 --> 00:06:14.919
+internal project, and there's no particular danger in that.
+
+00:06:14.920 --> 00:06:18.399
+If JavaScript were just like that,
+
+00:06:18.400 --> 00:06:21.319
+there'd be no particular danger in JavaScript either.
+
+00:06:21.320 --> 00:06:26.959
+The problem is that hundreds of thousands of websites,
+
+00:06:26.960 --> 00:06:33.199
+or is it millions, are sending JavaScript programs to their visitors
+
+00:06:33.200 --> 00:06:35.919
+who don't even know what JavaScript is,
+
+00:06:35.920 --> 00:06:39.159
+who are not programmers, who have no idea what's going on.
+
+00:06:39.160 --> 00:06:43.439
+So these programs are usually non-free.
+
+00:06:43.440 --> 00:06:48.599
+They end up in the user's browser, they run, many of them are malware.
+
+00:06:48.600 --> 00:06:51.039
+So what's going to happen?
+
+00:06:51.040 --> 00:06:57.679
+Basically, JavaScript is a platform for websites to mistreat users.
+
+00:06:57.680 --> 00:06:59.679
+I know it can be used in other ways,
+
+00:06:59.680 --> 00:07:06.319
+but socially, the existence of those other ways makes little difference.
+
+00:07:06.320 --> 00:07:10.799
+The important thing about JavaScript is the danger that it creates.
+
+NOTE With all the recent additions and optimizations to Emacs Lisp (lexical scoping, native compilation etc.) would you deem Emacs Lisp suitable for general purpose programming outside Emacs (i.e. scripting, running web servers). If not, why?
+
+00:07:27.000 --> 00:07:32.279
+This question is about the idea of using Emacs Lisp
+
+00:07:32.280 --> 00:07:37.919
+for general purpose programming that has nothing to do with Emacs.
+
+00:07:37.920 --> 00:07:44.479
+Well, in theory, I guess, in principle, there's nothing wrong with that.
+
+00:07:44.480 --> 00:07:56.879
+But I think that would be a distraction, and I'd rather we didn't do it.
+
+00:07:56.880 --> 00:08:02.359
+Now, if we had a thousand great programmers ready to do that,
+
+00:08:02.360 --> 00:08:05.999
+and every other thing we could use, sure.
+
+00:08:06.000 --> 00:08:12.639
+But the fact is, we don't. And I'd really rather--
+
+00:08:12.640 --> 00:08:17.479
+There are many platforms that are fine to write programs on.
+
+00:08:17.480 --> 00:08:26.399
+So I'd rather we work on making Emacs better at editing
+
+00:08:26.400 --> 00:08:30.799
+and improving Emacs Lisp in the ways that help that goal,
+
+00:08:30.800 --> 00:08:38.999
+and leave developing general purpose programming platforms to other languages.
+
+NOTE Could you give a few examples of the medium-sized jobs necessary for WYSIWYG-editor support in Emacs?
+
+00:08:44.760 --> 00:08:51.559
+Could I give a list of the specific medium-sized jobs
+
+00:08:51.560 --> 00:08:54.959
+necessary for WYSIWYG editing?
+
+00:08:54.960 --> 00:08:58.999
+Well, I can't really. I don't have a list of one.
+
+00:08:59.000 --> 00:09:04.399
+And I'd really appreciate it if people started putting together such a list.
+
+00:09:04.400 --> 00:09:08.839
+But if you look at every feature that LibreOffice has
+
+00:09:08.840 --> 00:09:14.399
+that Emacs doesn't have, I think you will get a list.
+
+00:09:14.400 --> 00:09:17.679
+Now, maybe some of those are not that important.
+
+00:09:17.680 --> 00:09:23.759
+Maybe only a subset of them would make the list of really important ones.
+
+00:09:23.760 --> 00:09:27.439
+But I think that will give everybody a start.
+
+NOTE Should GNU (or someone else) define a safe-subset of HTML/CSS/JS to make web browsers simpler and safer (e.g. by preventing JS from contacting servers)?
+
+00:09:33.480 --> 00:09:39.159
+Should GNU or someone else define a safe subset of HTML, CSS, JS
+
+00:09:39.160 --> 00:09:41.559
+to make web browsers simpler and safer?
+
+00:09:41.560 --> 00:09:46.519
+You know, that would be an interesting thing to explore.
+
+00:09:46.520 --> 00:09:48.879
+But I don't know whether it can be done.
+
+00:09:48.880 --> 00:09:53.439
+The thing is, one of the dangerous things about JavaScript
+
+00:09:53.440 --> 00:09:55.959
+is browser profiling.
+
+00:09:55.960 --> 00:10:02.559
+Every machine runs a program at a slightly different speed.
+
+00:10:02.560 --> 00:10:09.399
+And the idea of browser profiling is that the website sends a JavaScript program
+
+00:10:09.400 --> 00:10:13.399
+to run on every visitor's browser.
+
+00:10:13.400 --> 00:10:19.999
+And it's actually a collection of benchmarks.
+
+00:10:20.000 --> 00:10:26.079
+And the collection of results is different for each user's computer.
+
+00:10:26.080 --> 00:10:30.919
+And so it enables the website to recognize each one when it comes back
+
+00:10:30.920 --> 00:10:34.799
+even if there's no cookie to help it.
+
+00:10:34.800 --> 00:10:42.719
+So, which features are sufficient to make possible browser profiling?
+
+00:10:42.720 --> 00:10:46.799
+There may be no particular unusual feature that's crucial.
+
+00:10:46.800 --> 00:10:48.639
+But arithmetic might be enough.
+
+NOTE How can we ensure the continuity of an understanding of the more arcane parts of the [Emacs] source code, and increase their evolvability, notably with regards to display, single-threading limitations, etc.?
+
+00:10:57.440 --> 00:11:00.679
+How can we ensure the continuity of an understanding
+
+00:11:00.680 --> 00:11:02.999
+of the more arcane parts of source code
+
+00:11:03.000 --> 00:11:08.279
+and increase their evolvability, notably with regard to display,
+
+00:11:08.280 --> 00:11:14.879
+single-threading limitations, etc.?
+
+00:11:14.880 --> 00:11:19.759
+Well, single-threading is a very specific thing.
+
+00:11:19.760 --> 00:11:26.559
+And the furthest that I've bothered to think about it is
+
+00:11:26.560 --> 00:11:33.799
+how can we enable easily multiple list program threads
+
+00:11:33.800 --> 00:11:35.199
+to be running in parallel.
+
+00:11:35.200 --> 00:11:39.759
+But if you're talking about multi-threading in display,
+
+00:11:39.760 --> 00:11:42.239
+I don't know if that even helps.
+
+00:11:42.240 --> 00:11:48.599
+Of course, my machine doesn't really enable me to run
+
+00:11:48.600 --> 00:11:57.719
+multiple threads in a single program, so it never mattered to me.
+
+00:11:57.720 --> 00:12:06.319
+Basically, now, development of a display code
+
+00:12:06.320 --> 00:12:12.239
+not in regard to threads, well, that's more feasible.
+
+00:12:12.240 --> 00:12:19.279
+But the thing is, generally, any new feature is likely to require
+
+00:12:19.280 --> 00:12:25.799
+changes in the buffer data structure to represent the use of the feature.
+
+00:12:25.800 --> 00:12:29.199
+And I think that's going to be the hard part.
+
+00:12:29.200 --> 00:12:33.479
+So, display won't be the hard part, and it won't be the first part.
+
+00:12:33.480 --> 00:12:37.599
+The first part is figuring out how you're going to represent a buffer
+
+00:12:37.600 --> 00:12:43.519
+with a certain display bell or whistle in it.
+
+00:12:43.520 --> 00:12:47.719
+And once you've worked that out and worked out how it's going to work well
+
+00:12:47.720 --> 00:12:51.359
+in editing, then I think you'll be able to figure out
+
+00:12:51.360 --> 00:12:55.119
+what display has to do to handle it.
+
+00:12:55.120 --> 00:13:01.079
+Of course, you have to decide that data structure,
+
+00:13:01.080 --> 00:13:05.199
+thinking about how display is going to handle it efficiently.
+
+00:13:05.200 --> 00:13:13.119
+If the data structure is bad, it won't be possible to display efficiently.
+
+00:13:13.120 --> 00:13:15.759
+So you need to think about that at that stage.
+
+00:13:15.760 --> 00:13:19.599
+But the actual work is working out the data structure
+
+00:13:19.600 --> 00:13:21.559
+and the editing to handle it.
+
+00:13:21.560 --> 00:13:31.639
+Do you recommend reaching out to schools for volunteers instead of universities
+
+00:13:31.640 --> 00:13:35.639
+because they're more prone to value the objectives of freedom?
+
+00:13:35.640 --> 00:13:38.519
+Well, reaching out for what?
+
+00:13:38.520 --> 00:13:43.719
+Reaching out to try to teach people about freedom?
+
+00:13:43.720 --> 00:13:47.479
+Or reaching out to find more developers?
+
+00:13:47.480 --> 00:13:50.479
+Maybe that person could respond.
+
+NOTE Are there any problems or disadvantages using the GNU AGPL for non-networked software like Emacs packages?
+
+00:13:50.480 --> 00:14:05.199
+Is there any problem or disadvantage in using the GNU AGPL
+
+00:14:05.200 --> 00:14:08.519
+for non-network software like Emacs packages?
+
+00:14:08.520 --> 00:14:10.239
+I don't see one.
+
+00:14:10.240 --> 00:14:17.359
+The reason why I didn't put the AGPL clause into the regular GNU GPL
+
+00:14:17.360 --> 00:14:22.319
+is it seemed a bit radical and I figured the community
+
+00:14:22.320 --> 00:14:27.079
+would be happier if that radical change didn't happen
+
+00:14:27.080 --> 00:14:31.839
+in the GNU general public license itself.
+
+00:14:31.840 --> 00:14:35.839
+I would like the person who asked the previous question
+
+00:14:35.840 --> 00:14:40.719
+to respond to what I said so I can get that answer
+
+00:14:40.720 --> 00:14:43.519
+and finish answering her question.
+
+00:14:43.520 --> 00:14:46.119
+Right.
+
+00:14:46.120 --> 00:14:50.279
+I will let you know if we end up hearing back from you--from per.
+
+NOTE Is there a list of Emacs issues which can be solved by programmers with different levels? For example my level is A, I know basic elisp and C. How can I help?
+
+00:14:50.280 --> 00:15:03.439
+Is there a list of Emacs issues which can be solved by programmers
+
+00:15:03.440 --> 00:15:05.079
+with different levels?
+
+00:15:05.080 --> 00:15:07.319
+I don't know of one.
+
+00:15:07.320 --> 00:15:14.159
+I tend to think that people who know basic programs
+
+00:15:14.160 --> 00:15:20.359
+the basic level of list programming can't contribute yet.
+
+00:15:20.360 --> 00:15:25.919
+They might be able to start debugging problems.
+
+00:15:25.920 --> 00:15:30.359
+It won't be easy but that might be a good first thing to do.
+
+00:15:30.360 --> 00:15:36.359
+Look at bugs that are waiting and see if you can debug one of them
+
+00:15:36.360 --> 00:15:39.519
+and then when you find out what's actually going wrong
+
+00:15:39.520 --> 00:15:44.159
+you can send that to the developers and it will very likely
+
+00:15:44.160 --> 00:15:46.679
+enable them to fix the problem quickly.
+
+00:15:46.680 --> 00:15:52.279
+In the process you'll learn a lot about programs
+
+00:15:52.280 --> 00:15:54.039
+and how programs are actually written
+
+00:15:54.040 --> 00:15:56.959
+and how to understand the code you actually come across.
+
+00:15:56.960 --> 00:16:02.439
+With features like Org mode and enriched mode,
+
+00:16:02.440 --> 00:16:06.759
+it seems that Emacs is getting closer to the goal of WYSIWYG.
+
+00:16:06.760 --> 00:16:10.799
+Well it's got somewhat closer but it has a very long way to go.
+
+00:16:10.800 --> 00:16:15.119
+If you compare it with something like LibreOffice
+
+00:16:15.120 --> 00:16:17.039
+you'll see how long away there is to go.
+
+00:16:17.040 --> 00:16:31.399
+There was an effort called GuileEmacs a while back
+
+00:16:31.400 --> 00:16:36.839
+which was some effort to get Guile to be able to compile and run Emacs Lisp.
+
+NOTE What roadblocks kept some of the other efforts from being used with Emacs?
+
+00:16:36.840 --> 00:16:40.959
+[Amin]: You mentioned there were still some challenges relating to Guile.
+
+00:16:40.960 --> 00:16:45.879
+What roadblocks kept some of the other efforts from being used with Emacs?
+
+00:16:45.880 --> 00:16:50.275
+[Richard]: Well we never finished solving the problem
+
+00:16:50.276 --> 00:16:55.239
+of reconciling Guile data types with Emacs Lisp data types.
+
+00:16:55.240 --> 00:17:02.439
+We got an idea for how to deal with the fact that
+
+00:17:02.440 --> 00:17:08.599
+Scheme handling of nil is different from Lisp handling of nil.
+
+00:17:08.600 --> 00:17:14.679
+The idea was that maybe this would get us close enough it could actually work.
+
+00:17:14.680 --> 00:17:19.359
+But I don't think anyone fully implemented it and made it actually work.
+
+NOTE What do you use emacs for beyond editing?
+
+00:17:36.240 --> 00:17:39.759
+What do you use Emacs for beyond editing?
+
+00:17:39.760 --> 00:17:42.679
+Well I use it for reading and writing email.
+
+00:17:42.680 --> 00:17:44.759
+That's what I mainly do.
+
+00:17:44.760 --> 00:17:47.839
+That's what I do most of the day.
+
+00:17:47.840 --> 00:17:52.559
+I could... I mean should I sing my song?
+
+00:17:52.560 --> 00:17:55.119
+Sure.
+
+NOTE Song about e-mail
+
+00:17:55.120 --> 00:18:02.639
+I've been answering my email all the goddamn day.
+
+00:18:02.640 --> 00:18:10.879
+I've been answering my email 'cause my work gets done that way.
+
+00:18:10.880 --> 00:18:14.879
+Can't you feel the fingers aching?
+
+00:18:14.880 --> 00:18:18.479
+Type until early in the morn.
+
+00:18:18.480 --> 00:18:22.319
+Can't you see the letters blurring?
+
+00:18:22.320 --> 00:18:25.799
+It's just an ad for porn.
+
+00:18:25.800 --> 00:18:30.519
+You can see how out of date that song is 'cause we don't
+
+00:18:30.520 --> 00:18:32.039
+get ads for porn much anymore.
+
+00:18:32.400 --> 00:18:37.279
+[Amin]: Thanks for the performance.
+
+NOTE Emacs is used by a small population relative to the population that could benefit from it. Do you have any thoughts on how to expand the user base more broadly even among software developers?
+
+00:18:49.556 --> 00:18:52.919
+[Richard]: Emacs is used by a small population relative to
+
+00:18:52.920 --> 00:18:54.639
+the population that could benefit from it.
+
+00:18:54.640 --> 00:18:59.519
+Do you have any thoughts on how to expand the user base more broadly,
+
+00:18:59.520 --> 00:19:02.159
+even among software developers?
+
+00:19:02.160 --> 00:19:11.679
+No. Basically, the fact is that on that aspect of things,
+
+00:19:11.680 --> 00:19:20.759
+VS Code has an advantage and the advantage comes from Microsoft.
+
+00:19:20.760 --> 00:19:28.159
+It's pushing that together as part of a large collection
+
+00:19:28.160 --> 00:19:32.839
+of evil proprietary software that subjugates its users.
+
+00:19:32.840 --> 00:19:36.119
+But those users don't understand that issue.
+
+00:19:36.120 --> 00:19:40.639
+So, I mean, I sure wish I could come up with an idea
+
+00:19:40.640 --> 00:19:44.279
+for how to spread awareness of free software
+
+00:19:44.280 --> 00:19:46.599
+and the injustice of non-free software.
+
+00:19:46.600 --> 00:19:52.879
+The best one that I know of is to show them the TEDx talk that you saw.
+
+00:19:52.880 --> 00:19:57.239
+If you show that to people, they'll get at least a basic idea
+
+00:19:57.240 --> 00:19:59.039
+of what's at stake here and why.
+
+NOTE Would a namespace system similar to Common Lisp packages but without :USE work in Emacs? Modern CL implementations have package local nicknames to create package local prefixes.
+
+00:20:05.760 --> 00:20:10.719
+Would a namespace system similar to Common Lisp packages but without :USE
+
+00:20:10.720 --> 00:20:12.199
+work in Emacs?
+
+00:20:12.200 --> 00:20:14.319
+I suppose it would.
+
+00:20:14.320 --> 00:20:18.399
+I mean, basically, the thing that's really broken about
+
+00:20:18.400 --> 00:20:21.599
+Common Lisp packages is use.
+
+00:20:21.600 --> 00:20:29.999
+But it's not crucial, or at least it's not crucial to allow that to exist
+
+00:20:30.000 --> 00:20:32.119
+for arbitrary use.
+
+00:20:32.120 --> 00:20:37.079
+Maybe you want to have something saying where a package can specify
+
+00:20:37.080 --> 00:20:42.759
+whether to use the standard system functions and variables and so on.
+
+00:20:42.760 --> 00:20:49.679
+But there is a drawback to Common Lisp packages,
+
+00:20:49.680 --> 00:21:01.719
+which is that all of the aspects of any given symbol have to go together.
+
+00:21:01.720 --> 00:21:07.319
+So if compile-foo is a variable and it's also a function,
+
+00:21:07.320 --> 00:21:09.999
+and it's also a property name,
+
+00:21:10.000 --> 00:21:15.359
+then if your symbol foo is aliased to compile-foo,
+
+00:21:15.360 --> 00:21:21.839
+that means it's aliased as a function, aliased as a variable,
+
+00:21:21.840 --> 00:21:23.959
+and aliased as a property name.
+
+00:21:23.960 --> 00:21:30.319
+And aliased is anything else that you're going to point to from list structure.
+
+00:21:30.320 --> 00:21:35.799
+So it's not going to work really smoothly.
+
+00:21:35.800 --> 00:21:42.239
+And I tend to think that we're better off with a naming convention.
+
+00:21:42.240 --> 00:21:50.599
+Since the use feature of Common Lisp packages causes trouble,
+
+00:21:50.600 --> 00:21:57.919
+well if you don't use that, why is it better to write compile-foo
+
+00:21:57.920 --> 00:22:03.479
+and have that be foo in the compile package than to write compile-foo?
+
+00:22:03.480 --> 00:22:09.959
+The packages are almost equivalent to name prefixes.
+
+00:22:09.960 --> 00:22:18.799
+And I think that there is an advantage of clarity to writing the name prefixes,
+
+00:22:18.800 --> 00:22:20.639
+even in the same file.
+
+00:22:20.640 --> 00:22:28.759
+That abbreviation, which is meant to just shorten the code and make it simpler,
+
+00:22:28.760 --> 00:22:32.319
+looks simpler, I believe doesn't actually help.
+
+00:22:32.320 --> 00:22:42.439
+And I say that based on many years of writing code that way.
+
+NOTE With Emacs 29 adding more (awesome) features into vanilla Emacs, how should we ensure vanilla Emacs does not get bloated with many similar features? (example: ido/icomplete, vc/magit)
+
+00:22:42.440 --> 00:22:48.719
+With Emacs 29 adding more awesome features into Vanilla Emacs,
+
+00:22:48.720 --> 00:22:52.919
+how should we ensure vanilla Emacs does not get bloated
+
+00:22:52.920 --> 00:22:54.879
+with many similar features?
+
+00:22:54.880 --> 00:23:03.799
+Example, ido/icomplete, vc/magit.
+
+00:23:03.800 --> 00:23:08.759
+Well, to some extent we can't. Users do things differently.
+
+00:23:08.760 --> 00:23:13.679
+I have never used Magit because I don't want to get used to using anything
+
+00:23:13.680 --> 00:23:18.839
+that's not, packages that are not actually part of Emacs.
+
+00:23:18.840 --> 00:23:25.199
+Now, a couple of years ago, the author of Maggot said he was starting to work
+
+00:23:25.200 --> 00:23:30.919
+on getting the copyright assignments to include Magit in Emacs.
+
+00:23:30.920 --> 00:23:36.159
+But I was unable to get any information on how this is progressing.
+
+00:23:36.160 --> 00:23:44.599
+So because I've never actually seen Magit and because Git is actually not
+
+00:23:44.600 --> 00:23:50.559
+the VC system that I use most, I don't know if I'd want to use Magit.
+
+00:23:50.560 --> 00:23:53.199
+I'd probably be happier using VC.
+
+00:23:53.200 --> 00:23:59.959
+I'm told that they have extremely different basic approaches to doing things.
+
+00:23:59.960 --> 00:24:03.319
+They're not just slight variants of each other.
+
+00:24:03.320 --> 00:24:07.039
+Now, having multiple slight variants, you know,
+
+00:24:07.040 --> 00:24:10.919
+things doing similar jobs in little different ways,
+
+00:24:10.920 --> 00:24:13.959
+that could be seen as redundant.
+
+00:24:13.960 --> 00:24:23.759
+But when packages have very different approaches, I think that's not redundant.
+
+00:24:23.760 --> 00:24:26.919
+Clarified version of earlier question.
+
+NOTE Do you recommend reaching out in [high] schools for volunteers instead of universities because they are more prone to value the objectives of freedom?
+
+00:24:26.920 --> 00:24:31.599
+Do you recommend reaching out in schools for volunteers for both advocacy
+
+00:24:31.600 --> 00:24:35.239
+and development instead of universities?
+
+00:24:35.240 --> 00:24:40.839
+I think that you'll find few people in high schools.
+
+00:24:40.840 --> 00:24:46.799
+I think the question when it says schools means high schools.
+
+00:24:46.800 --> 00:24:51.079
+I think you will find only very rarely someone in high school
+
+00:24:51.080 --> 00:24:57.279
+who is good enough at programming to start actually developing things.
+
+00:24:57.280 --> 00:25:00.239
+Once in a while, I guess.
+
+00:25:00.240 --> 00:25:07.039
+As an activist, I think somewhat more often.
+
+00:25:07.040 --> 00:25:09.919
+But the main thing is, do you know how to have a rapport
+
+00:25:09.920 --> 00:25:13.039
+with high school students?
+
+00:25:13.040 --> 00:25:16.359
+If you do, it would be a great thing to try.
+
+00:25:16.360 --> 00:25:26.519
+We have had some projects of teaching free software to people in public schools.
+
+00:25:26.520 --> 00:25:32.559
+And if you want to work on that, I suggest sending me an email
+
+00:25:32.560 --> 00:25:35.039
+and I'll put you in touch with someone who's done it.
+
+NOTE What was the thought process behind making Emacs Lisp dynamically scoped when you first created it? What advantages did it provide over the alternative?
+
+00:25:35.040 --> 00:25:44.719
+What was the thought process behind making Emacs Lisp dynamically scoped?
+
+00:25:44.720 --> 00:25:46.039
+It was easy.
+
+00:25:46.040 --> 00:25:53.159
+I knew perfectly well how to write a simple, small Lisp interpreter
+
+00:25:53.160 --> 00:25:55.039
+that was dynamically scoped.
+
+00:25:55.040 --> 00:26:03.919
+And small was absolutely necessary at the time because I was trying to make it
+
+00:26:03.920 --> 00:26:12.079
+able to run in a machine whose total address space was one megabyte.
+
+00:26:12.080 --> 00:26:16.639
+So the code had to be small.
+
+00:26:16.640 --> 00:26:25.239
+Why did I implement if and I believe not cond?
+
+00:26:25.240 --> 00:26:30.359
+Why did I implement or and not unless?
+
+00:26:30.360 --> 00:26:33.439
+Because you didn't need those others.
+
+00:26:33.440 --> 00:26:39.839
+You could write your Lisp code with a smaller Lisp interpreter
+
+00:26:39.840 --> 00:26:49.759
+if you didn't have those other convenient traditional standard parts of Lisp.
+
+00:26:49.760 --> 00:26:54.519
+So I stripped Emacs Lisp down to bare bones.
+
+00:26:54.520 --> 00:27:01.679
+Of course, nowadays that's not necessary anymore.
+
+00:27:01.680 --> 00:27:08.239
+Emacs used to be criticized as eight megabytes and constantly swapping.
+
+00:27:08.240 --> 00:27:10.799
+And someone pointed out to me ten years ago
+
+00:27:10.800 --> 00:27:13.079
+that if something's only eight megabytes,
+
+00:27:13.080 --> 00:27:14.879
+it's not going to swap at all anymore.
+
+NOTE It's hard to pick up Emacs if you do not speak English. Can something be done to address that?
+
+00:27:18.766 --> 00:27:21.759
+It's hard to pick up Emacs if you do not speak English.
+
+00:27:21.760 --> 00:27:24.679
+Can something be done to address that?
+
+00:27:24.680 --> 00:27:28.239
+Well, what do you actually suggest?
+
+00:27:28.240 --> 00:27:30.039
+Is it the documentation?
+
+00:27:30.040 --> 00:27:34.279
+Is it the names of commands?
+
+00:27:34.280 --> 00:27:39.319
+Is it the doc strings or is it the manual or both?
+
+00:27:39.320 --> 00:27:43.879
+Is it the messages that Emacs displays?
+
+00:27:43.880 --> 00:27:47.679
+I mean, each of these is a different issue technically.
+
+00:27:47.680 --> 00:27:51.759
+Now, the easiest thing to deal with would be the messages
+
+00:27:51.760 --> 00:27:53.679
+because in other GNU packages,
+
+00:27:53.680 --> 00:27:57.639
+we have a system for internationalizing messages.
+
+00:27:57.640 --> 00:28:01.079
+It's hard to adapt it directly to Emacs
+
+00:28:01.080 --> 00:28:06.199
+because it's designed for programs, tools, or applications
+
+00:28:06.200 --> 00:28:09.639
+that have a fixed set of messages to display.
+
+00:28:09.640 --> 00:28:12.239
+Emacs doesn't. You load in a different Lisp program,
+
+00:28:12.240 --> 00:28:14.359
+it's got a different set of messages.
+
+00:28:14.360 --> 00:28:17.119
+How exactly do you want to handle this?
+
+00:28:17.120 --> 00:28:18.439
+But it could be done.
+
+00:28:18.440 --> 00:28:20.879
+It's not a terribly hard problem.
+
+00:28:20.880 --> 00:28:25.559
+If you're interested, please work on it.
+
+00:28:25.560 --> 00:28:29.719
+What about the command names?
+
+00:28:29.720 --> 00:28:35.319
+Well, you could imagine coming up with an alternate set of command names
+
+00:28:35.320 --> 00:28:40.159
+and maybe a different character instead of M-x
+
+00:28:40.160 --> 00:28:46.839
+so that it would read only the translated command names
+
+00:28:46.840 --> 00:28:51.319
+and the ordinary Emacs command names wouldn't get in the way.
+
+00:28:51.320 --> 00:28:57.719
+M-x might still be there, but if you type this other thing, M-foobar,
+
+00:28:57.720 --> 00:29:05.799
+then it would only complete over the command names in the other language.
+
+00:29:05.800 --> 00:29:10.479
+This might be pretty simple to do technically,
+
+00:29:10.480 --> 00:29:16.559
+although working out the details might take a good deal of thought.
+
+00:29:16.560 --> 00:29:20.999
+And then docstrings?
+
+00:29:21.000 --> 00:29:25.799
+Well, you could just write another set of them
+
+00:29:25.800 --> 00:29:28.839
+and have other help commands to display them.
+
+NOTE Do you use Org or Org mode, and if so, to what extent?
+
+00:29:28.840 --> 00:29:36.159
+Do you use Org or Org mode, and if so, to what extent?
+
+00:29:36.160 --> 00:29:39.759
+I have never used them, and here's why.
+
+00:29:39.760 --> 00:29:48.359
+I think that the design process of Org mode went awry,
+
+00:29:48.360 --> 00:29:52.959
+not at the very beginning, but at the next stage.
+
+00:29:52.960 --> 00:29:56.759
+Originally, Org mode was an outlining mode.
+
+00:29:56.760 --> 00:29:58.559
+It's not something I wanted to use.
+
+00:29:58.560 --> 00:30:02.999
+I had nothing against including it, but I didn't ever try to use it.
+
+00:30:03.000 --> 00:30:08.719
+The documentation of it somehow wasn't easy for me to grasp,
+
+00:30:08.720 --> 00:30:11.719
+especially since I had no actual use for it,
+
+00:30:11.720 --> 00:30:16.079
+no reason to go through and remember all those things.
+
+00:30:16.080 --> 00:30:24.599
+Anyway, then people started developing other facilities to use the Org syntax,
+
+00:30:24.600 --> 00:30:27.599
+and they're totally unrelated to each other.
+
+00:30:27.600 --> 00:30:30.599
+They just happen to use the Org syntax,
+
+00:30:30.600 --> 00:30:34.719
+and some of them, occasionally, I thought it might be interesting to use this,
+
+00:30:34.720 --> 00:30:38.639
+but to use it, first I'd have to learn the Org syntax,
+
+00:30:38.640 --> 00:30:43.199
+and that was a task that had already proved discouraging.
+
+00:30:43.200 --> 00:30:46.759
+Now, the mistaken design, I think,
+
+00:30:46.760 --> 00:30:51.159
+was to integrate all those other facilities with Org mode.
+
+00:30:51.160 --> 00:30:54.239
+They should all have been separate, modularly separate,
+
+00:30:54.240 --> 00:30:59.439
+so that you could maybe use them with Org mode if you wanted to,
+
+00:30:59.440 --> 00:31:03.199
+but also use them separately from Org mode,
+
+00:31:03.200 --> 00:31:05.279
+and they'd be documented separately,
+
+00:31:05.280 --> 00:31:08.999
+and those I wanted to use, I would have learned to use.
+
+00:31:09.000 --> 00:31:10.999
+But that was hard to do.
+
+00:31:11.000 --> 00:31:16.639
+They had been welded together such that it was not easy to separate them.
+
+00:31:16.640 --> 00:31:20.439
+I really wish they'd get separated, but that's not an easy job.
+
+00:31:20.440 --> 00:31:23.759
+Each one needs to be remodularized.
+
+00:31:23.760 --> 00:31:31.759
+Anyway, there is something for which I think Org mode could become an advance.
+
+00:31:31.760 --> 00:31:39.759
+I'm not saying it isn't useful for people who like what it does,
+
+00:31:39.760 --> 00:31:46.399
+but it might play an important role if it were extended to do it,
+
+00:31:46.400 --> 00:31:53.639
+and that is we could use a replacement for Texinfo.
+
+00:31:53.640 --> 00:31:57.639
+Texinfo's syntax is arcane.
+
+00:31:57.640 --> 00:32:05.559
+It was based on what I could implement on top of TeX in 1984 or so.
+
+00:32:05.560 --> 00:32:15.519
+And, well, Org mode, Org syntax doesn't make all the distinctions,
+
+00:32:15.520 --> 00:32:20.599
+all the semantic markup distinctions that we can make in Texinfo.
+
+00:32:20.600 --> 00:32:25.839
+If it did, which would require extending it,
+
+00:32:25.840 --> 00:32:33.399
+then it might become a good format to write GNU manuals in.
+
+00:32:33.400 --> 00:32:37.639
+It could conceivably become a better format than we have now,
+
+00:32:37.640 --> 00:32:39.719
+and that would be a good thing.
+
+00:32:39.720 --> 00:32:43.599
+Not that many people know Texinfo syntax.
+
+00:32:43.600 --> 00:32:47.479
+It's not widely used except for GNU manuals.
+
+00:32:47.480 --> 00:32:52.439
+But probably more people know Org syntax,
+
+00:32:52.440 --> 00:32:57.239
+and if it were extended so that it did in a fairly natural way
+
+00:32:57.240 --> 00:33:02.319
+all the things that Texinfo does and maybe some additional ones,
+
+00:33:02.320 --> 00:33:05.279
+then it could be superior.
+
+00:33:05.280 --> 00:33:11.239
+And then we could gradually switch our manuals over to it.
+
+00:33:11.240 --> 00:33:14.119
+But we need to be able to generate all the output formats
+
+00:33:14.120 --> 00:33:15.359
+that we can generate now.
+
+00:33:15.360 --> 00:33:19.999
+That means HTML to put on websites.
+
+00:33:20.000 --> 00:33:27.159
+That means either info files or perhaps another form of the HTML output
+
+00:33:27.160 --> 00:33:30.079
+that would be good for an info browser,
+
+00:33:30.080 --> 00:33:34.079
+including the one inside Emacs and the one that's separate.
+
+00:33:34.080 --> 00:33:42.479
+And generating input to TeX so that it would generate pretty-looking manuals,
+
+00:33:42.480 --> 00:33:46.719
+which is one of the advantages of Texinfo.
+
+00:33:46.720 --> 00:33:48.719
+This is not a gigantic job.
+
+00:33:48.720 --> 00:33:54.479
+I'd say this is a medium-sized job, or maybe two or three medium-sized jobs.
+
+NOTE What do you have in mind for more modular Emacs development?
+
+00:33:54.480 --> 00:34:05.879
+What do you have in mind for more modular Emacs development?
+
+00:34:05.880 --> 00:34:13.479
+I think that that's...
+
+00:34:13.480 --> 00:34:17.679
+There's no specific feature that I have in mind to solve that.
+
+00:34:17.680 --> 00:34:21.719
+It's more of an approach to how you develop things.
+
+00:34:21.720 --> 00:34:28.719
+It's thinking about modularity when you write each package that you write,
+
+00:34:28.720 --> 00:34:34.119
+because you will find situations where it has to interact
+
+00:34:34.120 --> 00:34:37.439
+in various ways with other packages.
+
+00:34:37.440 --> 00:34:40.879
+And sometimes you'll find the other packages have hooks
+
+00:34:40.880 --> 00:34:42.719
+that will enable you to do it.
+
+00:34:42.720 --> 00:34:45.239
+And sometimes you'll find that
+
+00:34:45.240 --> 00:34:47.679
+the hook you'd really need for this is missing.
+
+00:34:47.680 --> 00:34:52.519
+In that case, the best thing to do might be to add
+
+00:34:52.520 --> 00:34:58.479
+a suitable, fairly general hook that can be used for your job
+
+00:34:58.480 --> 00:35:00.879
+to the other existing package,
+
+00:35:00.880 --> 00:35:08.399
+so that instead of a rigid connection to other parts of Emacs,
+
+00:35:08.400 --> 00:35:09.599
+which is somewhat unmodular,
+
+00:35:09.600 --> 00:35:12.999
+you could use a general-purpose hook,
+
+00:35:13.000 --> 00:35:17.039
+which you designed because it could do a lot of things,
+
+00:35:17.040 --> 00:35:19.039
+including the thing you need to do.
+
+NOTE Reframing the school question
+
+00:35:19.040 --> 00:35:32.039
+It might be interesting to reframe the school question.
+
+00:35:32.040 --> 00:35:34.399
+I think it is related to the first part,
+
+00:35:34.400 --> 00:35:36.959
+how to bring Libre software into schools.
+
+00:35:36.960 --> 00:35:42.159
+For example, my entry point was LaTeX in school.
+
+00:35:42.160 --> 00:35:44.439
+Well, it's okay.
+
+00:35:44.440 --> 00:35:50.599
+I don't see anything wrong with that, by all means, if it works.
+
+00:35:50.600 --> 00:36:00.479
+Now, my naive, perhaps, guess is that it wouldn't arouse much interest,
+
+00:36:00.480 --> 00:36:05.879
+because I suspect most people would rather use a WYSIWYG text editor
+
+00:36:05.880 --> 00:36:13.959
+than a text formatter like LaTeX, any text formatter.
+
+00:36:13.960 --> 00:36:18.639
+But if your experience is otherwise, go ahead.
+
+NOTE In light of that critique of JavaScript not being about the language per se but rather the "culture of blindly getting and running packages/libraries", what's so different with what's currently done by the vast majority of Emacs/Elisp users to just install packages blindly?
+
+00:36:18.640 --> 00:36:28.799
+In the light of that critique of JavaScript not being about language per se,
+
+00:36:28.800 --> 00:36:33.759
+but rather the culture of blindly getting and running packages, libraries.
+
+00:36:33.760 --> 00:36:36.119
+What's so different with what's currently done by the vast
+
+00:36:36.120 --> 00:36:42.199
+majority of EmacsLib users to just install packages blindly?
+
+00:36:42.200 --> 00:36:44.199
+Well, they know they're installing a package,
+
+00:36:44.200 --> 00:36:46.799
+and that makes all the difference.
+
+00:36:46.800 --> 00:36:50.879
+And people can post various versions of a package,
+
+00:36:50.880 --> 00:36:53.679
+and then people can compare them and say,
+
+00:36:53.680 --> 00:36:59.279
+"Hey, I looked at that version there, and it has a horrible bug."
+
+00:36:59.280 --> 00:37:03.959
+And so the community can do something about that.
+
+00:37:03.960 --> 00:37:09.519
+With JavaScript sent by websites, there is no way to do anything like that.
+
+00:37:09.520 --> 00:37:13.039
+And in addition, most of those programs are not free.
+
+00:37:13.040 --> 00:37:16.559
+How would you know? If you're not running LibreJS,
+
+00:37:16.560 --> 00:37:20.799
+you don't know what JavaScript programs are being installed
+
+00:37:20.800 --> 00:37:25.319
+into your browser at any given moment, or whether they're free.
+
+00:37:25.320 --> 00:37:31.119
+You know, very likely you'll just get a bunch of obfuscript,
+
+00:37:31.120 --> 00:37:35.559
+and you won't know what the source code is, or whether you could even find it.
+
+00:37:35.560 --> 00:37:41.399
+These things don't happen with EmacsList packages.
+
+00:37:41.400 --> 00:37:48.799
+At least not when they're in reputable package archives.
+
+NOTE Do you still intend to merge your patch to the "shorthands" feature to the master branch?
+
+00:37:48.800 --> 00:37:55.839
+Do you still intend to merge your patch to the shorthands feature
+
+00:37:55.840 --> 00:37:57.519
+to the master branch?
+
+00:37:57.520 --> 00:38:05.159
+Yes, but I've seen that something needs to be done with the docstrings,
+
+00:38:05.160 --> 00:38:17.679
+because s.el mentions in its docstrings the function names used in s.el,
+
+00:38:17.680 --> 00:38:27.199
+and the magnars string library that works just by renaming those symbols
+
+00:38:27.200 --> 00:38:31.119
+really would want to alter the docstrings too.
+
+00:38:31.120 --> 00:38:34.719
+And now there are multiple ways of doing that.
+
+00:38:34.720 --> 00:38:39.519
+One of them maybe is to edit the s.el source file
+
+00:38:39.520 --> 00:38:42.559
+so it'll do the right thing in either case.
+
+00:38:42.560 --> 00:38:48.879
+That would need a new docstring construct.
+
+00:38:48.880 --> 00:38:52.159
+Well, we've added many docstring constructs.
+
+00:38:52.160 --> 00:38:54.879
+We could add one more. It's not that hard a thing.
+
+NOTE Do you think the freedom e.g., we have in Emacs, becomes a hurdle for some people to pursue more important things in the world? I used to do a lot of Emacs programming, but I recently try to stay away from tinkering on Emacs.
+
+00:38:54.880 --> 00:39:05.799
+Do you think the freedom, e.g., we have in Emacs becomes a hurdle
+
+00:39:05.800 --> 00:39:09.319
+for some people to pursue more important things in the world?
+
+00:39:09.320 --> 00:39:12.359
+Is there something more important in the world?
+
+00:39:12.360 --> 00:39:17.399
+I used to do a lot of Emacs programming, but recently I decided to stay away
+
+00:39:17.400 --> 00:39:22.199
+from tink-linking, from tinking Emacs.
+
+00:39:22.200 --> 00:39:27.159
+I'm not sure what-- tinking is a strange word to me, tinkering with maybe.
+
+00:39:27.160 --> 00:39:33.559
+Well, there may be more important things for you to do than extend Emacs.
+
+00:39:33.560 --> 00:39:39.239
+On the other hand, when you look at all the distractions that the world offers
+
+00:39:39.240 --> 00:39:42.439
+that distract a lot more people than this,
+
+00:39:42.440 --> 00:39:47.799
+it really seems unfair to criticize Emacs because it's something
+
+00:39:47.800 --> 00:39:50.959
+you could put a lot of time into tinkering with.
+
+00:39:50.960 --> 00:39:54.599
+Look how much time people put into playing video games,
+
+00:39:54.600 --> 00:39:58.199
+which achieves nothing except distracting them.
+
+00:39:58.200 --> 00:40:04.599
+And if you distract yourself by playing with Emacs Lisp code,
+
+00:40:04.600 --> 00:40:07.399
+that's surely better.
+
+00:40:07.400 --> 00:40:10.919
+It has a chance of resulting in something
+
+00:40:10.920 --> 00:40:17.919
+actually useful and a chance that you'd learn something
+
+00:40:17.920 --> 00:40:27.919
+that's more important as learning than how to win a certain video game.
+
+NOTE Question about software freedom: how does it apply to software that are art/media experiences, like videogames? In your view, Is the creator of a videogame obliged to release it under a free license?
+
+00:40:27.920 --> 00:40:29.919
+Questions about software freedom.
+
+00:40:29.920 --> 00:40:34.719
+How does it apply to software that are art/media experiences
+
+00:40:34.720 --> 00:40:36.919
+like video games in your view?
+
+00:40:36.920 --> 00:40:42.719
+Well, I'd say that a video game typically is a collection of things,
+
+00:40:42.720 --> 00:40:49.319
+some of which are programs and some of which are art.
+
+00:40:49.320 --> 00:40:54.719
+And so once you analyze the game in that way,
+
+00:40:54.720 --> 00:40:59.479
+if you agree with my ideas about what the moral rules are
+
+00:40:59.480 --> 00:41:04.319
+for each of those categories, you can apply them separately
+
+00:41:04.320 --> 00:41:06.759
+to each thing in the collection.
+
+00:41:06.760 --> 00:41:12.279
+Programs are operational. They do things for you.
+
+00:41:12.280 --> 00:41:15.879
+And anything that does things for you should be free.
+
+00:41:15.880 --> 00:41:20.999
+The art that is simply displayed is not of that kind,
+
+00:41:21.000 --> 00:41:26.239
+so it doesn't, in my view, have to be free.
+
+00:41:26.240 --> 00:41:29.359
+It does have to be shareable.
+
+00:41:29.360 --> 00:41:36.199
+You have to be free to non-commercially redistribute an exact copy.
+
+00:41:36.200 --> 00:41:40.039
+When I talk about sharing, that's what it means, precisely that.
+
+00:41:40.040 --> 00:41:45.319
+Non-commercially redistribute exact copies to others when you wish.
+
+00:41:45.320 --> 00:41:58.359
+How would technologies like WebAssembly fit with the JavaScript issues?
+
+00:41:58.360 --> 00:42:00.519
+They don't change anything much.
+
+00:42:00.520 --> 00:42:06.079
+Basically, if the program is JavaScript source code
+
+00:42:06.080 --> 00:42:09.999
+that you could actually read, well, then if it had a free license on it,
+
+00:42:10.000 --> 00:42:11.279
+it would be free software.
+
+00:42:11.280 --> 00:42:16.319
+And if the free license is indicated in the standardized format
+
+00:42:16.320 --> 00:42:24.959
+that LibreJS understands, it would actually recognize it as free software.
+
+00:42:24.960 --> 00:42:30.759
+If it's obfuscated, then it's not the source code.
+
+00:42:30.760 --> 00:42:35.599
+And if it's WebAssembly, then it's not the source code.
+
+00:42:35.600 --> 00:42:41.999
+So those are both compiled versions of source code that isn't in the page.
+
+00:42:42.000 --> 00:42:45.759
+So they make things somewhat nastier,
+
+00:42:45.760 --> 00:42:51.159
+in the sense that you couldn't have much chance of reading it
+
+00:42:51.160 --> 00:42:52.999
+and seeing what it does.
+
+00:42:53.000 --> 00:42:55.479
+But either way, it's not free,
+
+00:42:55.480 --> 00:43:00.599
+even if it's source code with no free license, it's still not free.
+
+00:43:00.600 --> 00:43:03.639
+If it's a compiled version rather than source,
+
+00:43:03.640 --> 00:43:07.359
+that's a little further away from being free.
+
+00:43:07.360 --> 00:43:11.599
+But further away from being free doesn't make it worse.
+
+00:43:11.600 --> 00:43:13.599
+It's equally bad.
+
+00:43:13.600 --> 00:43:18.559
+If it gets further away from being free,
+
+00:43:18.560 --> 00:43:23.439
+that means the work that you might have to do to free it is more,
+
+00:43:23.440 --> 00:43:26.239
+but it's not worse.
+
+00:43:26.240 --> 00:43:28.839
+Non-free is bad.
+
+NOTE Have you seen Haketilo? It seems similar to LibreJS.
+
+00:43:35.915 --> 00:43:38.959
+Have you seen Haketilo?
+
+00:43:38.960 --> 00:43:41.679
+It seems similar to LibreJS.
+
+00:43:41.680 --> 00:43:44.519
+Haketilo is meant to enable people
+
+00:43:44.520 --> 00:43:49.199
+to get some of the benefits of the free software community
+
+00:43:49.200 --> 00:43:54.439
+with free replacement JavaScript programs for websites.
+
+00:43:54.440 --> 00:44:00.879
+So potentially it offers a real solution to the JavaScript problem.
+
+00:44:00.880 --> 00:44:05.039
+It has a long way to go from what I hear.
+
+00:44:05.040 --> 00:44:07.999
+If you want to work on it, please do.
+
+00:44:08.000 --> 00:44:14.159
+Of course, writing free replacement JavaScript
+
+00:44:14.160 --> 00:44:16.919
+for a million websites is an enormous job,
+
+00:44:16.920 --> 00:44:19.319
+but maybe we could do it for some sites.
+
+00:44:19.320 --> 00:44:24.319
+It depends how many people get enthusiastic about doing it
+
+00:44:24.320 --> 00:44:25.959
+and how many sites cooperate.
+
+00:44:25.960 --> 00:44:32.719
+Is writing free software replacement to GitHub Copilot
+
+00:44:32.720 --> 00:44:36.759
+with proper license attribution a good idea?
+
+00:44:36.760 --> 00:44:44.959
+Maybe, but remember that Copilot is not a program. Copilot is a service.
+
+00:44:44.960 --> 00:44:50.119
+It is something that somebody else's computer will do for you.
+
+00:44:50.120 --> 00:44:55.439
+It's a computation that someone else's server will do for you when you ask.
+
+00:44:55.440 --> 00:45:06.239
+And so what are the practical problems of doing that? I'm not sure.
+
+00:45:06.240 --> 00:45:13.479
+The point is, of course, the server runs by running a program.
+
+00:45:13.480 --> 00:45:17.439
+The service operates by running programs.
+
+00:45:17.440 --> 00:45:21.119
+But still, a service is a very different kind of thing from a program.
+
+00:45:21.120 --> 00:45:28.999
+People who use Copilot don't get any sort of copy of Copilot.
+
+00:45:29.000 --> 00:45:33.319
+All they do is send something they're working on to that server
+
+00:45:33.320 --> 00:45:34.999
+and they get something back.
+
+00:45:35.000 --> 00:45:45.567
+So it might be a good idea.
+
+NOTE
+Do you have any suggestions for helping propective contributers streamline
+the copyright assignment needed to contribute to Emacs (and other FSF software
+projects)?
+
+00:45:45.568 --> 00:45:48.359
+Do you have any suggestions for helping prospective contributors
+
+00:45:48.360 --> 00:45:53.359
+streamline the copyright assignment needed to contribute to Emacs?
+
+00:45:53.360 --> 00:45:57.279
+I don't think that's needed.
+
+00:45:57.280 --> 00:46:04.359
+Basically, the copyright assignment itself is pretty easy
+
+00:46:04.360 --> 00:46:06.599
+and doesn't take very long.
+
+00:46:06.600 --> 00:46:09.919
+What is sometimes harder is the copyright disclaimer,
+
+00:46:09.920 --> 00:46:14.959
+the employer disclaimer, where your employer,
+
+00:46:14.960 --> 00:46:20.399
+if you're employed to program, or if your job includes programming
+
+00:46:20.400 --> 00:46:24.399
+or could include programming, we want to be sure that your employer
+
+00:46:24.400 --> 00:46:30.559
+is not going to say that you had no right to contribute that to any program
+
+00:46:30.560 --> 00:46:37.799
+because it belonged to the employer all along and you broke the rules
+
+00:46:37.800 --> 00:46:42.319
+and the project you contributed to is shafted.
+
+00:46:42.320 --> 00:46:50.679
+Well, we are working on some simplifications to that text
+
+00:46:50.680 --> 00:46:55.119
+in the hope of making it easier to get companies to say yes to it.
+
+00:46:55.120 --> 00:46:59.039
+But fundamentally, they've got to say yes to it.
+
+00:46:59.040 --> 00:47:06.279
+We need them to say yes to it.
+
+00:47:06.280 --> 00:47:08.719
+We can't make them say yes to it.
+
+00:47:08.720 --> 00:47:09.799
+We can only ask.
+
+NOTE Can complexity induced by company-funded free/libre code become a problem, when the company pulls out, leaving the code potentially unmaintainable?
+
+00:47:09.800 --> 00:47:13.759
+Can complexity induced by company funded...
+
+00:47:13.760 --> 00:47:17.119
+Sorry, it talks about open code.
+
+00:47:17.120 --> 00:47:21.359
+I don't know what that means.
+
+00:47:21.360 --> 00:47:23.759
+Is this talking about free software?
+
+00:47:23.760 --> 00:47:27.759
+[Amin]: I think it would be safe to assume that they are indeed
+
+00:47:27.760 --> 00:47:28.959
+talking about free software.
+
+00:47:28.960 --> 00:47:34.119
+[Richard]: Okay, because I don't use the term open to classify programs.
+
+00:47:34.120 --> 00:47:39.359
+I'm not a supporter of open source and I never was.
+
+00:47:39.360 --> 00:47:42.519
+And the reason is very important.
+
+00:47:42.520 --> 00:47:50.199
+I touched on this briefly in the TEDx video.
+
+00:47:50.200 --> 00:47:58.639
+But basically, the idea of the free software movement is that users deserve
+
+00:47:58.640 --> 00:48:04.559
+the freedom to study, change and redistribute the code that they use.
+
+00:48:04.560 --> 00:48:09.879
+And it is an injustice to deny that to users.
+
+00:48:09.880 --> 00:48:13.719
+And therefore, software must be free.
+
+00:48:13.720 --> 00:48:16.159
+It's wrong if it's not free.
+
+00:48:16.160 --> 00:48:22.879
+Well, the people who created the idea of open source about 14 years later,
+
+00:48:22.880 --> 00:48:27.719
+they wanted to avoid bringing up that question.
+
+00:48:27.720 --> 00:48:31.999
+And they more or less succeeded when people talk about open source.
+
+00:48:32.000 --> 00:48:38.959
+Occasionally, that question has seeped in from the free software community.
+
+00:48:38.960 --> 00:48:41.599
+But most of the time, it never occurs to them.
+
+00:48:41.600 --> 00:48:47.519
+They simply take for granted that it's legitimate for a program not to be open.
+
+00:48:47.520 --> 00:48:52.759
+Well, that's missing the point that I consider most important.
+
+00:48:52.760 --> 00:48:57.679
+So whenever I talk about this area, I talk about it in
+
+00:48:57.680 --> 00:49:04.039
+terms of free, libre, freedom-respecting software.
+
+00:49:04.040 --> 00:49:09.839
+So, can complexity-induced by company-funded free code
+
+00:49:09.840 --> 00:49:12.399
+become a problem when the company pulls out,
+
+00:49:12.400 --> 00:49:16.239
+leaving the code potentially unmaintainable?
+
+00:49:16.240 --> 00:49:21.999
+Well, I'd say over-complicated free programs
+
+00:49:22.000 --> 00:49:24.879
+which don't have community contributors
+
+00:49:24.880 --> 00:49:27.359
+can fall into that problem.
+
+00:49:27.360 --> 00:49:31.279
+It's not limited to programs developed by companies, I think.
+
+NOTE What do you think of Hyperbole or EEV instead of org mode, or other things for the stuff that org mode does "second brain / knowledge base", or GTD 'getting things done' etc... among other things in Emacs or other Emacs packages
+
+00:49:31.280 --> 00:49:42.239
+What do you think of Hyperbole or EEV instead of Org mode?
+
+00:49:42.240 --> 00:49:46.759
+Well, I don't actually know that much about either of them.
+
+00:49:46.760 --> 00:49:49.439
+I don't know what EEV is.
+
+00:49:49.440 --> 00:49:54.257
+I've heard of Hyperbole, but it was many years ago that I looked at it,
+
+00:49:54.258 --> 00:49:56.399
+and I don't remember what I saw.
+
+00:49:56.400 --> 00:50:03.199
+So, I'm sorry I can't have an educated opinion about those specific things.
+
+00:50:03.200 --> 00:50:07.319
+It would be interesting for somebody to study that.
+
+00:50:07.320 --> 00:50:10.319
+Now, there'd be a lot to study.
+
+00:50:10.320 --> 00:50:14.999
+After all, Org mode consists of an outlining mode together
+
+00:50:15.000 --> 00:50:20.119
+with lots of other specific features that have been welded onto it.
+
+00:50:20.120 --> 00:50:26.479
+And if they were separated, made modular, separate parts of Emacs,
+
+00:50:26.480 --> 00:50:31.599
+it would be a lot easier to adapt some of them to work with hyperbole
+
+00:50:31.600 --> 00:50:32.799
+if we wanted to.
+
+00:50:32.800 --> 00:50:34.879
+Of course, do we want to?
+
+00:50:34.880 --> 00:50:36.359
+That's another question.
+
+00:50:36.360 --> 00:50:38.519
+What is EEV?
+
+00:50:38.520 --> 00:50:46.279
+I think it's similar in many ways to hyperbole.
+
+00:50:46.280 --> 00:50:50.039
+I haven't used either of them too much myself, but yeah,
+
+00:50:50.040 --> 00:50:51.759
+they are fairly similar as far as I know.
+
+00:50:51.760 --> 00:50:55.759
+If they're fairly similar, I guess that brings up the question,
+
+00:50:55.760 --> 00:50:58.319
+is either of them actually part of Emacs?
+
+00:50:58.320 --> 00:51:04.639
+I think hyperbole is a GNU package.
+
+00:51:04.640 --> 00:51:07.719
+I'm not sure if it's part of Emacs or GNU ELPA.
+
+00:51:07.720 --> 00:51:10.879
+It might be, but EEV is not as of yet.
+
+00:51:10.880 --> 00:51:12.159
+But both are free software.
+
+00:51:12.160 --> 00:51:19.159
+Well, it might be that it doesn't make sense to include them both in any sense.
+
+00:51:19.160 --> 00:51:21.159
+People can write them and distribute them,
+
+00:51:21.160 --> 00:51:23.679
+but that doesn't mean we need to pick them up.
+
+00:51:23.680 --> 00:51:28.359
+We might want to compare them and see which one is better
+
+00:51:28.360 --> 00:51:32.799
+and then look at whether it could be improved further
+
+00:51:32.800 --> 00:51:35.319
+by bringing in features from the other.
+
+00:51:35.320 --> 00:51:40.199
+This is what you do if those two things exist
+
+00:51:40.200 --> 00:51:42.519
+and you want to make the best possible thing
+
+00:51:42.520 --> 00:51:44.999
+to add, for instance, to Emacs.
+
+00:51:45.000 --> 00:51:56.319
+But since I don't know any specifics anymore, and with EEV I never did,
+
+00:51:56.320 --> 00:52:01.639
+I don't want to state any sort of a priori preference.
+
+00:52:01.640 --> 00:52:06.250
+I don't have one.
+
+NOTE Are there plans to bring modal editing (eg. evil-mode, viper) to Emacs core and did your opinion on modal editing change over the years?
+
+00:52:06.251 --> 00:52:10.959
+Are there plans to bring modal editing to Emacs core?
+
+00:52:10.960 --> 00:52:11.759
+What does that mean?
+
+00:52:11.760 --> 00:52:19.399
+[Amin]: I think they're speaking about projects or editing modes such as VI,
+
+00:52:19.400 --> 00:52:23.639
+where by default whatever you type is not getting inserted,
+
+00:52:23.640 --> 00:52:28.319
+but you can navigate between different modes
+
+00:52:28.320 --> 00:52:30.199
+and one of them being text insertion.
+
+00:52:30.200 --> 00:52:35.759
+[Richard]: Well, I don't have a wish for that.
+
+00:52:35.760 --> 00:52:38.399
+Now, I mean, it's not somehow morally anathema.
+
+00:52:38.400 --> 00:52:49.279
+I mean, it's not as if it were a non-free program.
+
+00:52:49.280 --> 00:52:58.439
+But it wouldn't be easy to design that in such a way that
+
+00:52:58.440 --> 00:53:02.999
+it fit into the framework of existing Emacs without doing any violence to it.
+
+NOTE What is your opinion on the current state of large machine
+learning/AI models?
+
+00:53:03.000 --> 00:53:16.719
+What is your opinion of the current state of large machine learning models?
+
+00:53:16.720 --> 00:53:20.919
+Even if the model is released under a free license,
+
+00:53:20.920 --> 00:53:25.399
+it cannot be modified in a meaningful way?
+
+00:53:25.400 --> 00:53:29.039
+I don't think that's true.
+
+00:53:29.040 --> 00:53:33.279
+A person who was in the field of machine learning
+
+00:53:33.280 --> 00:53:35.839
+told me that you can modify it.
+
+00:53:35.840 --> 00:53:38.999
+You can modify it by starting with what you've got
+
+00:53:39.000 --> 00:53:40.839
+and doing some further training,
+
+00:53:40.840 --> 00:53:47.159
+and you don't need, I'm told, the previously used training data to train it,
+
+00:53:47.160 --> 00:53:49.439
+to modify it.
+
+00:53:49.440 --> 00:53:53.399
+Based on that, I concluded that the trained neural network
+
+00:53:53.400 --> 00:53:56.879
+can be treated as source code.
+
+00:53:56.880 --> 00:54:01.079
+And after all, it's not made from any other kind of source code.
+
+00:54:01.080 --> 00:54:04.839
+So, in some sense, what else could the source code be?
+
+NOTE I thought it was a virtue to separate the content from the style or
+appearance of information. Part of being free is also to view information in the
+format that you want. Does your WYSIWYG idea erode this virtue and lead to more
+thinking -- perhaps undue thinking about style over substance?
+
+00:54:14.302 --> 00:54:17.519
+I thought it was a virtue to separate the content
+
+00:54:17.520 --> 00:54:19.719
+from the style or appearance of information.
+
+00:54:19.720 --> 00:54:24.759
+Part of being free is also to view information in the format you want.
+
+00:54:24.760 --> 00:54:29.959
+Does your WYSIWYG idea erode this virtue and lead to more thinking,
+
+00:54:29.960 --> 00:54:34.359
+perhaps undue thinking about style over substance?
+
+00:54:34.360 --> 00:54:38.919
+Well, I don't know, actually.
+
+00:54:38.920 --> 00:54:43.959
+I know that in LibreOffice you can make named styles,
+
+00:54:43.960 --> 00:54:46.959
+and you can apply them to parts of the text,
+
+00:54:46.960 --> 00:54:51.239
+and later on you can change what any given named style
+
+00:54:51.240 --> 00:54:53.719
+means in terms of appearance.
+
+00:54:53.720 --> 00:55:03.319
+So, is that enough independence of appearance from semantics?
+
+00:55:03.320 --> 00:55:06.319
+I am hardly a power user of LibreOffice.
+
+00:55:06.320 --> 00:55:09.239
+I've come across that feature. I've never used it.
+
+00:55:09.240 --> 00:55:17.559
+The only things I write with it are pretty simple.
+
+00:55:17.560 --> 00:55:23.519
+I have a feeling that I've been doing this for a rather long time.
+
+00:55:23.520 --> 00:55:27.279
+Do you recall when I started answering questions?
+
+00:55:27.280 --> 00:55:29.799
+I think it was something like an hour ago.
+
+00:55:29.800 --> 00:55:35.759
+Yeah, I think so. About an hour or 45 minutes-ish.
+
+00:55:35.760 --> 00:55:38.839
+Well, then I'll do a few questions more.
+
+NOTE Do you ever dabble in retro-computing, e.g. logging into TOPS10/20 systems SDF, etc?
+
+00:55:38.840 --> 00:55:42.679
+Do you ever dabble in retrocomputing?
+
+00:55:42.680 --> 00:55:47.319
+No. I decided it's a waste of time.
+
+00:55:47.320 --> 00:55:51.759
+It basically would be tinkering that would not develop
+
+00:55:51.760 --> 00:55:56.039
+anything of any importance or use.
+
+00:55:56.040 --> 00:56:02.839
+And I know that if I'm going to enjoy developing something,
+
+00:56:02.840 --> 00:56:06.079
+I could enjoy it developing anything.
+
+00:56:06.080 --> 00:56:10.239
+You know, I could enjoy just as much developing something
+
+00:56:10.240 --> 00:56:17.199
+that I think is needed right now for non-retrocomputing
+
+00:56:17.200 --> 00:56:20.679
+as I could enjoy working on retrocomputing.
+
+00:56:20.680 --> 00:56:26.079
+So I decided never to let retrocomputing
+
+00:56:26.080 --> 00:56:30.759
+distract my attention from useful computing.
+
+NOTE Do you know Gemini?
+
+00:56:38.196 --> 00:56:40.359
+Do you know the Gemini Project -
+
+00:56:40.360 --> 00:56:45.239
+a network of very simplified markdown-like text files without images
+
+00:56:45.240 --> 00:56:52.759
+and third-party materials transmitted via an open public free protocol,
+
+00:56:52.760 --> 00:56:56.519
+which is not HTTPS?
+
+00:56:56.520 --> 00:56:58.839
+I don't remember if I ever heard of that before.
+
+00:56:58.840 --> 00:57:02.639
+Sorry, I have no opinion about it.
+
+00:57:02.640 --> 00:57:10.799
+But I think that the lack of images will turn out to be a considerable drawback.
+
+00:57:10.800 --> 00:57:14.159
+I mean, imagine a website.
+
+00:57:14.160 --> 00:57:19.439
+Well, there are lots of reasons you might want to put in images.
+
+00:57:19.440 --> 00:57:27.559
+It's not limited just to making it look snazzy and distracting.
+
+00:57:27.560 --> 00:57:32.159
+There are a lot of pictures you might want to include and diagrams,
+
+00:57:32.160 --> 00:57:37.719
+and scientific papers include pictures and diagrams.
+
+00:57:37.720 --> 00:57:41.359
+It would be crippling if they couldn't be in there.
+
+00:57:41.360 --> 00:57:46.519
+So basically, I think that exclusion of images is a big loss.
+
+00:57:46.520 --> 00:57:56.879
+[Amin]: Thanks. I think that's so far all the questions I see on the pad,
+
+00:57:56.880 --> 00:58:00.319
+but let's give it maybe another minute or two
+
+00:58:00.320 --> 00:58:04.479
+if people have any other question or two to get in before we call this close.
+
+NOTE stallmansupport.org
+
+00:58:04.480 --> 00:58:27.520
+[Richard] Well, I'd like to mention that if you've heard
+
+00:58:27.521 --> 00:58:43.959
+rumors of attacks against me that people have made, it's mostly false,
+
+00:58:43.960 --> 00:58:50.079
+and you can find out more by looking at stallmansupport.org.
+
+00:58:50.080 --> 00:58:55.359
+So I refer you there, and I hope you'll take a look.
+
+00:58:55.360 --> 00:59:04.639
+[Amin]: Yes, thank you.
+
+00:59:04.640 --> 00:59:08.599
+All right, I think that's pretty much all the questions that we have.
+
+00:59:08.600 --> 00:59:10.559
+Thanks again, Richard, both for your great talk
+
+00:59:10.560 --> 00:59:14.319
+and also for taking this much time answering so many questions.
+
+00:59:14.320 --> 00:59:17.999
+We really appreciate it.
+
+00:59:18.000 --> 00:59:21.639
+[Richard]: Well, this is what I do.
+
+00:59:21.640 --> 00:59:28.839
+GNU and the Free Software Movement are what I've dedicated my life to,
+
+00:59:28.840 --> 00:59:34.679
+and since I'm still alive, I've got more to dedicate to them.
+
+00:59:34.680 --> 00:59:40.319
+[Amin]: Wonderful, and we all hope that it keeps on coming
+
+00:59:40.320 --> 00:59:43.839
+and you're able to continue for a very long time into the future.
+
+00:59:43.840 --> 00:59:46.079
+[Richard]: Happy hacking.
+
+00:59:46.080 --> 00:59:49.960
+[Amin]: Happy hacking. Bye.
diff --git a/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main--chapters.vtt b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main--chapters.vtt
new file mode 100644
index 00000000..24aba25c
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main--chapters.vtt
@@ -0,0 +1,32 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:02:33.540
+GNU Emacs and its purpose
+
+00:02:33.640 --> 00:03:46.280
+Lisp as the extension language
+
+00:03:46.280 --> 00:06:14.640
+JavaScript versus freedom
+
+00:06:14.640 --> 00:07:23.307
+Updating "An Introduction to Emacs Lisp Programming"
+
+00:07:23.407 --> 00:08:31.707
+More memorable package names
+
+00:08:31.807 --> 00:10:23.620
+Simplifying the command interface
+
+00:10:23.620 --> 00:11:22.220
+Modularity
+
+00:11:22.220 --> 00:12:55.460
+Editing formatted text
+
+00:12:55.460 --> 00:15:31.300
+Not the equivalent of a modern web browser
+
+00:15:31.300 --> 00:17:01.500
+Getting involved
diff --git a/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.vtt b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.vtt
new file mode 100644
index 00000000..5873b47b
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.vtt
@@ -0,0 +1,756 @@
+WEBVTT captioned by anush
+
+NOTE GNU Emacs and its purpose
+
+00:00:00.000 --> 00:00:08.960
+Hello! I'm going to talk about what I would like to see
+
+00:00:08.960 --> 00:00:11.240
+in GNU Emacs in the future,
+
+00:00:11.240 --> 00:00:17.600
+and what I would prefer not to find there.
+
+00:00:17.600 --> 00:00:22.080
+This is all within the context
+
+00:00:22.080 --> 00:00:25.360
+of GNU Emacs and its purpose.
+
+00:00:25.360 --> 00:00:30.600
+GNU Emacs is a part of the GNU operating system,
+
+00:00:30.600 --> 00:00:33.300
+and the purpose of the GNU operating system
+
+00:00:33.400 --> 00:00:38.840
+is not simply to do a good job technically,
+
+00:00:38.840 --> 00:00:42.640
+not simply to be good to use.
+
+00:00:42.640 --> 00:00:45.760
+Its main purpose, its overall purpose,
+
+00:00:45.760 --> 00:00:48.560
+is to give people freedom,
+
+00:00:48.560 --> 00:00:54.760
+and to help them value and defend that freedom.
+
+00:00:54.760 --> 00:01:00.160
+A GNU package, by being a convenient, well-written program,
+
+00:01:00.160 --> 00:01:06.000
+should contribute to that overall ethical and social goal,
+
+00:01:06.000 --> 00:01:10.440
+and not only to the usefulness of our software.
+
+00:01:10.440 --> 00:01:14.080
+This is true for GNU Emacs
+
+00:01:14.080 --> 00:01:18.720
+as much as it is for any other free program we’ve developed.
+
+00:01:18.720 --> 00:01:25.320
+In fact, GNU Emacs is the first GNU program that I released.
+
+00:01:25.320 --> 00:01:28.800
+I had written some other things before that,
+
+00:01:28.800 --> 00:01:30.600
+but didn't release them at that time.
+
+00:01:30.600 --> 00:01:34.200
+There was no particular use in doing so.
+
+00:01:34.200 --> 00:01:36.007
+So it was through GNU Emacs
+
+00:01:36.107 --> 00:01:38.307
+that I learned about various things
+
+00:01:38.407 --> 00:01:44.240
+such as software licenses and how to defend freedom.
+
+00:01:44.240 --> 00:01:50.407
+You're of course familiar with what GNU Emacs is today,
+
+00:01:50.507 --> 00:01:54.240
+thanks to the contributions of thousands of other people
+
+00:01:54.340 --> 00:01:56.967
+who came after me.
+
+00:01:57.067 --> 00:01:58.880
+What would I like?
+
+00:01:58.880 --> 00:02:01.433
+What would other people like?
+
+00:02:01.533 --> 00:02:06.480
+Lots of people come to Emacs familiar with VS Code,
+
+00:02:06.480 --> 00:02:10.520
+and they say, "Please make Emacs more like VS Code.
+
+00:02:10.520 --> 00:02:15.840
+Change everything that you did in the 1980s and 90s
+
+00:02:15.840 --> 00:02:18.320
+to be like that other thing."
+
+00:02:18.320 --> 00:02:24.200
+That wouldn't be feasible even if we wanted to.
+
+00:02:24.200 --> 00:02:30.440
+Our goal is not to be... not resembling VS Code.
+
+00:02:30.440 --> 00:02:33.540
+Any resemblance is coincidental.
+
+NOTE Lisp as the extension language
+
+00:02:33.640 --> 00:02:37.940
+But in particular,
+
+00:02:38.040 --> 00:02:43.774
+we do not want to have extension languages other than Lisp.
+
+00:02:43.874 --> 00:02:47.474
+Emacs Lisp is the variant of Lisp
+
+00:02:47.574 --> 00:02:49.474
+that we've always supported,
+
+00:02:49.574 --> 00:02:52.960
+which has evolved along with Emacs.
+
+00:02:52.960 --> 00:02:57.400
+We can conceivably have Scheme as well,
+
+00:02:57.400 --> 00:03:01.040
+if we can sufficiently solve the problems,
+
+00:03:01.140 --> 00:03:03.760
+the technical problems of making Scheme
+
+00:03:03.760 --> 00:03:06.480
+and Emacs Lisp interoperate.
+
+00:03:06.480 --> 00:03:11.600
+We did some design work, I think that was with Tom Lord,
+
+00:03:11.600 --> 00:03:15.880
+whom the community will greatly miss.
+
+00:03:15.880 --> 00:03:19.240
+In the 1990s, there are challenges that remain;
+
+00:03:19.340 --> 00:03:21.360
+maybe it can be done.
+
+00:03:21.360 --> 00:03:27.960
+But a non-Lispy language would be a mistake.
+
+00:03:27.960 --> 00:03:33.000
+It would divert our development focus into areas
+
+00:03:33.000 --> 00:03:37.480
+that we don't need, languages that are less powerful,
+
+00:03:37.480 --> 00:03:46.280
+less beautiful, and less desirable for the purpose.
+
+NOTE JavaScript versus freedom
+
+00:03:46.280 --> 00:03:52.120
+However, the language that we above all shouldn't support
+
+00:03:52.120 --> 00:03:57.233
+is JavaScript. That's not because of the language itself.
+
+00:03:57.333 --> 00:04:00.480
+I don't know the JavaScript language,
+
+00:04:00.480 --> 00:04:04.200
+I've heard people say it's rather clumsy
+
+00:04:04.200 --> 00:04:07.520
+and not well designed, but I don't know this.
+
+00:04:07.520 --> 00:04:12.400
+In any case, it's not what my views are based on.
+
+00:04:12.400 --> 00:04:14.740
+There's something much worse about JavaScript,
+
+00:04:14.840 --> 00:04:18.800
+which is not the language itself, but how people use it.
+
+00:04:18.800 --> 00:04:23.640
+Namely, it's been adopted as a way for a network server
+
+00:04:23.640 --> 00:04:26.120
+to send a program to your machine
+
+00:04:26.120 --> 00:04:30.120
+without your even noticing, so that this program,
+
+00:04:30.120 --> 00:04:35.007
+written by you don't know who, will run on your computer
+
+00:04:35.107 --> 00:04:37.200
+and do you don't know what.
+
+00:04:37.200 --> 00:04:39.674
+And you're supposed to just trust
+
+00:04:39.774 --> 00:04:43.640
+all and sundry developers of software
+
+00:04:43.640 --> 00:04:45.840
+for the sites you visit,
+
+00:04:45.840 --> 00:04:51.320
+which very commonly do malicious things, often unknown
+
+00:04:51.320 --> 00:04:55.680
+to the people who are running the server itself.
+
+00:04:55.680 --> 00:04:59.320
+They paid someone else to design a website
+
+00:04:59.320 --> 00:05:01.307
+and they probably said, oh,
+
+00:05:01.407 --> 00:05:04.440
+make it fashionable and attractive.
+
+00:05:04.440 --> 00:05:09.760
+And they didn't insist, don't snoop on the visitors,
+
+00:05:09.760 --> 00:05:12.840
+even if they understood what the issue was.
+
+00:05:12.840 --> 00:05:20.480
+So these sites snoop. It's a serious problem.
+
+00:05:20.480 --> 00:05:24.080
+The problem comes not from the language JavaScript,
+
+00:05:24.080 --> 00:05:28.680
+but from the fact that browsers, by default,
+
+00:05:28.680 --> 00:05:32.440
+will pull in JavaScript code that gets sent to them
+
+00:05:32.440 --> 00:05:35.833
+and run it to do anything at all.
+
+00:05:35.933 --> 00:05:39.320
+Emacs is supposed to defend your freedom.
+
+00:05:39.320 --> 00:05:42.520
+It's supposed to help you to defend your freedom,
+
+00:05:42.520 --> 00:05:45.640
+and lead you to defend your freedom,
+
+00:05:45.640 --> 00:05:47.200
+which means it shouldn't lead you
+
+00:05:47.200 --> 00:05:50.960
+to throw your freedom away as soon as you visit a site
+
+00:05:50.960 --> 00:05:53.920
+that tries to send you a non-free program
+
+00:05:53.920 --> 00:05:58.280
+to run straight off of that other machine.
+
+00:05:58.280 --> 00:06:04.080
+So it's important not to lead users
+
+00:06:04.080 --> 00:06:06.520
+to do computing this way.
+
+00:06:06.520 --> 00:06:10.800
+So what are some good things
+
+00:06:10.800 --> 00:06:14.640
+that we would want instead of this?
+
+NOTE Updating "An Introduction to Emacs Lisp Programming"
+
+00:06:14.640 --> 00:06:19.774
+One thing we want
+
+00:06:19.874 --> 00:06:26.474
+is to update the "Introduction to Emacs Lisp Programming"
+
+00:06:26.574 --> 00:06:29.480
+by the late Bob Chassell.
+
+00:06:29.480 --> 00:06:34.720
+It's a book that makes it easy for even non-programmers
+
+00:06:34.720 --> 00:06:38.000
+to learn to write simple programs in Emacs Lisp.
+
+00:06:38.000 --> 00:06:41.200
+And from there, they can go on to do better.
+
+00:06:41.200 --> 00:06:44.800
+We made a pretty big change in Emacs Lisp
+
+00:06:44.800 --> 00:06:49.480
+a few years ago, implementing lexical scoping by default.
+
+00:06:49.480 --> 00:06:57.360
+Originally, Emacs Lisp used to be entirely dynamic scoping,
+
+00:06:57.360 --> 00:07:01.960
+like some of the earliest Lisp interpreters.
+
+00:07:01.960 --> 00:07:06.520
+This is a change that should have a careful job
+
+00:07:06.520 --> 00:07:10.560
+of updating for the introduction.
+
+00:07:10.560 --> 00:07:14.600
+I'm sure we've made it clear in the reference manual,
+
+00:07:14.600 --> 00:07:18.400
+but that's not what beginners read first.
+
+00:07:18.400 --> 00:07:23.307
+We need something to teach them in lexical scoping.
+
+NOTE More memorable package names
+
+00:07:23.407 --> 00:07:30.440
+Another thing we could use is to make it easier
+
+00:07:30.440 --> 00:07:33.880
+to understand the facilities that we have.
+
+00:07:33.880 --> 00:07:38.560
+For instance, I think every package
+
+00:07:38.560 --> 00:07:42.200
+that you might load into your Emacs and run
+
+00:07:42.200 --> 00:07:47.680
+should have a name that helps you remember what job it does.
+
+00:07:47.680 --> 00:07:51.274
+It doesn't have to be super long to tell you
+
+00:07:51.374 --> 00:07:53.507
+what job that package does.
+
+00:07:53.607 --> 00:07:56.774
+You can read the description to learn that.
+
+00:07:56.874 --> 00:07:59.600
+But once you've read the description,
+
+00:07:59.600 --> 00:08:02.974
+it should be memorable. When you see that name again,
+
+00:08:03.074 --> 00:08:06.507
+you should realize, oh, that's the package I could use
+
+00:08:06.607 --> 00:08:11.880
+to do "less" and so. We've had a tendency
+
+00:08:11.880 --> 00:08:17.840
+to give packages names for the sake of pure wordplay
+
+00:08:17.940 --> 00:08:23.474
+or lack of obvious meaning,
+
+00:08:23.574 --> 00:08:28.188
+and I think we should add on, to those packages,
+
+00:08:28.189 --> 00:08:31.707
+names that people will remember.
+
+NOTE Simplifying the command interface
+
+00:08:31.807 --> 00:08:39.200
+Also, there are ways we can simplify the command interface
+
+00:08:39.200 --> 00:08:43.760
+of Emacs. For instance, there are many different parameters
+
+00:08:43.760 --> 00:08:48.000
+users can specify that can have several values,
+
+00:08:48.000 --> 00:08:51.707
+and sometimes you do various kinds of editing
+
+00:08:51.807 --> 00:08:54.440
+in one session. That's normal in Emacs,
+
+00:08:54.440 --> 00:08:57.740
+and you might want different parameter settings
+
+00:08:57.840 --> 00:09:00.307
+for different kinds of editing.
+
+00:09:00.407 --> 00:09:06.200
+So you specify parameter value A, do some editing,
+
+00:09:06.200 --> 00:09:10.240
+you specify parameter value B, and do some editing,
+
+00:09:10.240 --> 00:09:13.720
+and you'd switch back and forth, so you want
+
+00:09:13.720 --> 00:09:17.440
+to switch back and forth between these parameters.
+
+00:09:17.440 --> 00:09:22.607
+I think we should aim ...
+
+00:09:22.707 --> 00:09:26.640
+People have added various commands to switch
+
+00:09:26.740 --> 00:09:30.400
+between the last two or n values of this parameter,
+
+00:09:30.500 --> 00:09:32.674
+and another command to switch
+
+00:09:32.774 --> 00:09:36.740
+between the last two or n values of this [other] parameter,
+
+00:09:36.840 --> 00:09:41.360
+and then that parameter, you know, and that parameter.
+
+00:09:41.360 --> 00:09:44.667
+I think we should be able to have
+
+00:09:44.767 --> 00:09:49.120
+a switch between the last n values command
+
+00:09:49.120 --> 00:09:54.320
+that works on various different parameters,
+
+00:09:54.320 --> 00:09:57.040
+and thus makes it easy to remember
+
+00:09:57.040 --> 00:09:59.240
+that there is this facility.
+
+00:09:59.340 --> 00:10:03.774
+Because right now the commands to do that are all ad-hoc,
+
+00:10:03.874 --> 00:10:08.540
+and if you don't use a toggling among the last n values
+
+00:10:08.640 --> 00:10:11.740
+of a given parameter, you won't know how to do it.
+
+00:10:11.840 --> 00:10:15.267
+It won't be obvious that there is a way,
+
+00:10:15.367 --> 00:10:17.667
+so you'd have to go to a suitable manual
+
+00:10:17.767 --> 00:10:20.100
+and study for a while to think of that.
+
+00:10:20.100 --> 00:10:23.620
+We could make this easily discoverable.
+
+NOTE Modularity
+
+00:10:23.620 --> 00:10:30.140
+There is another kind of modularity that's important,
+
+00:10:30.140 --> 00:10:34.100
+and that is modularity at the level of maintenance.
+
+00:10:34.100 --> 00:10:38.207
+This is something all programmers know about, of course,
+
+00:10:38.307 --> 00:10:43.300
+but in Emacs, various parts interact with other parts,
+
+00:10:43.300 --> 00:10:47.980
+and we've tried to make them modular in design
+
+00:10:47.980 --> 00:10:50.380
+by using lots of hooks,
+
+00:10:50.380 --> 00:10:54.380
+but we haven't gone as far as we could.
+
+00:10:54.380 --> 00:10:58.060
+With some effort, we could find calls
+
+00:10:58.060 --> 00:11:00.220
+from over here to over there
+
+00:11:00.220 --> 00:11:03.140
+that could be replaced by use of hooks,
+
+00:11:03.140 --> 00:11:05.940
+so that we could reduce the extent
+
+00:11:05.940 --> 00:11:09.874
+to which you need to know about one part of Emacs
+
+00:11:09.974 --> 00:11:12.607
+to maintain another part of Emacs,
+
+00:11:12.707 --> 00:11:17.580
+and I think that as we keep adding more facilities to Emacs,
+
+00:11:17.580 --> 00:11:22.220
+this kind of modularity will be an investment that pays off.
+
+NOTE Editing formatted text
+
+00:11:22.220 --> 00:11:27.140
+There’s one big area of features
+
+00:11:27.240 --> 00:11:30.700
+that I would like to see in Emacs,
+
+00:11:30.800 --> 00:11:33.180
+and that's the ability to edit
+
+00:11:33.180 --> 00:11:40.340
+formatted documents in WYSIWYG, to be able to edit
+
+00:11:40.340 --> 00:11:47.940
+a letter or a scientific mathematical paper with formulas
+
+00:11:47.940 --> 00:11:52.900
+or a nicely laid out manual,
+
+00:11:52.900 --> 00:11:56.660
+looking at what it's really going to look like.
+
+00:11:56.660 --> 00:12:00.460
+Now we have free software to do this.
+
+00:12:00.460 --> 00:12:04.660
+For instance, I use LibreOffice some of the time.
+
+00:12:04.660 --> 00:12:08.100
+Sometimes it's faster than writing something
+
+00:12:08.100 --> 00:12:11.860
+to be formatted with a text formatter
+
+00:12:11.860 --> 00:12:16.180
+and then formatting it. But when I use LibreOffice,
+
+00:12:16.180 --> 00:12:19.220
+I always miss the commands and facilities,
+
+00:12:19.220 --> 00:12:22.574
+the editing facilities of Emacs.
+
+00:12:22.674 --> 00:12:26.500
+I'd like to have them both together, something with
+
+00:12:26.500 --> 00:12:30.340
+the text formatting capabilities of LibreOffice
+
+00:12:30.340 --> 00:12:36.060
+or even better of TeX, but the editing commands
+
+00:12:36.060 --> 00:12:40.300
+and facilities of Emacs. This would be a big job,
+
+00:12:40.300 --> 00:12:45.980
+but it can be made up of a lot of medium-sized jobs.
+
+00:12:45.980 --> 00:12:50.020
+If people start working on those medium-sized jobs,
+
+00:12:50.020 --> 00:12:52.060
+then in a number of years
+
+00:12:52.060 --> 00:12:55.460
+we'll have something absolutely amazing.
+
+NOTE Not the equivalent of a modern web browser
+
+00:12:55.460 --> 00:13:01.140
+But one thing I think we really shouldn't have
+
+00:13:01.140 --> 00:13:06.500
+is the equivalent of a modern web browser.
+
+00:13:06.500 --> 00:13:10.940
+The World Wide Web started out in the 1990s
+
+00:13:10.940 --> 00:13:13.774
+in a much simpler form,
+
+00:13:13.874 --> 00:13:17.820
+where a web page described its contents,
+
+00:13:17.820 --> 00:13:21.180
+and the web browser laid them out,
+
+00:13:21.180 --> 00:13:23.707
+and the user could parameterize
+
+00:13:23.807 --> 00:13:27.140
+how to lay out various kinds of situations.
+
+00:13:27.140 --> 00:13:31.707
+This was not only convenient for users
+
+00:13:31.807 --> 00:13:35.874
+who wanted to control things and understand things,
+
+00:13:35.974 --> 00:13:39.640
+it was also freedom-respecting
+
+00:13:39.740 --> 00:13:43.020
+because the layout was done by your browser.
+
+00:13:43.020 --> 00:13:48.100
+If you had a free browser, you were in control,
+
+00:13:48.100 --> 00:13:51.620
+even though the browser was complicated already.
+
+00:13:51.620 --> 00:13:54.707
+But starting around two decades ago,
+
+00:13:54.807 --> 00:13:58.820
+there was an explosion in the complexity of browsers
+
+00:13:58.820 --> 00:14:02.780
+as companies wanted to have more and more control
+
+00:14:02.780 --> 00:14:07.700
+over exactly what would appear on a user's screen.
+
+00:14:07.700 --> 00:14:12.374
+So they invented lots of features to control that,
+
+00:14:12.474 --> 00:14:15.907
+features where the user couldn't really customize
+
+00:14:16.007 --> 00:14:18.307
+how something would actually appear
+
+00:14:18.407 --> 00:14:21.207
+because the whole point was that
+
+00:14:21.307 --> 00:14:23.707
+the company could control that.
+
+00:14:23.807 --> 00:14:27.020
+And JavaScript was sort of the ultimate level
+
+00:14:27.020 --> 00:14:32.007
+of "the company controls everything."
+
+00:14:32.107 --> 00:14:38.500
+Because of this, going beyond the simple level
+
+00:14:38.500 --> 00:14:43.540
+of web page formatting features in Emacs
+
+00:14:43.540 --> 00:14:50.940
+is basically heading down a path that leads to subjugation.
+
+00:14:50.940 --> 00:14:54.740
+It's a path that we need to stay away from.
+
+00:14:54.740 --> 00:15:00.307
+It's a path to an unjust world of computing
+
+00:15:00.407 --> 00:15:03.420
+that you can easily see around you.
+
+00:15:03.420 --> 00:15:08.600
+Web browsers nowadays are designed to display ads
+
+00:15:08.700 --> 00:15:11.567
+that you may not want to see.
+
+00:15:11.667 --> 00:15:17.900
+They're designed for DRM.
+
+00:15:17.900 --> 00:15:22.420
+They're designed for companies to snoop on you
+
+00:15:22.420 --> 00:15:26.300
+in unobvious ways. And all of that
+
+00:15:26.300 --> 00:15:28.980
+we should protect ourselves from,
+
+00:15:28.980 --> 00:15:31.300
+protect our users from.
+
+NOTE Getting involved
+
+00:15:31.300 --> 00:15:39.980
+So I hope that some of you will be enthusiastic
+
+00:15:39.980 --> 00:15:42.060
+about some of these changes,
+
+00:15:42.060 --> 00:15:46.940
+especially towards editing formatted text.
+
+00:15:46.940 --> 00:15:51.980
+If you want to get involved, we have
+
+00:15:51.980 --> 00:15:57.820
+a development discussion list called emacs-devel@gnu.org.
+
+00:15:57.820 --> 00:16:02.380
+You can join that. You can also,
+
+00:16:02.380 --> 00:16:05.740
+if you get interested in working on a package
+
+00:16:05.740 --> 00:16:09.500
+and you're not an experienced Emacs Lisp developer,
+
+00:16:09.500 --> 00:16:13.640
+it's a very good idea to look for an experienced developer
+
+00:16:13.740 --> 00:16:14.980
+to talk with.
+
+00:16:14.980 --> 00:16:19.220
+Make sure you can write programs in Emacs Lisp first.
+
+00:16:19.220 --> 00:16:24.260
+It's not useful to take up the expert’s time learning that.
+
+00:16:24.260 --> 00:16:27.307
+You can still learn it from the introduction.
+
+00:16:27.407 --> 00:16:31.660
+But after that, when it's a matter of how to design
+
+00:16:31.660 --> 00:16:36.180
+your favorite package, do have a discussion with developers.
+
+00:16:36.180 --> 00:16:39.060
+They'll give you design ideas
+
+00:16:39.060 --> 00:16:43.180
+that will help you make a package that we put into Emacs.
+
+00:16:43.180 --> 00:17:01.500
+Now it's time for questions.
diff --git a/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main--chapters.vtt b/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main--chapters.vtt
new file mode 100644
index 00000000..05297798
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main--chapters.vtt
@@ -0,0 +1,73 @@
+WEBVTT - EmacsConf 2022, Ramin Honary: "Build a Zettelkasten with the Hyperbole Rolodex"
+
+00:00:00.000 --> 00:01:41.039
+Introduction
+
+00:01:41.040 --> 00:01:41.039
+Key takeaway
+
+00:02:17.00 --> 00:02:46.319
+Overview of Zettelkasten
+
+00:02:46.320 --> 00:03:25.359
+Tools I use in day-to-day writing
+
+00:03:25.360 --> 00:04:03.519
+Quick overview of Hyperbole
+
+00:04:03.520 --> 00:04:55.239
+Explain HyRolo
+
+00:04:55.240 --> 00:05:44.279
+Configuration of Hyperbole using ~use-package~
+
+00:05:44.280 --> 00:06:37.599
+The Hyperbole menu-driven user interface
+
+00:06:37.600 --> 00:08:23.759
+Getting started with *HyRolo*: Create a /zettel/
+
+00:08:23.760 --> 00:09:27.121
+Searching the *HyRolo* database
+
+00:09:27.120 --> 00:10:06.959
+Demo *HyRolo* search
+
+00:10:06.960 --> 00:10:42.519
+Search operators AND/OR/NOT
+
+00:10:42.520 --> 00:12:01.759
+Navigating the search results
+
+00:12:01.760 --> 00:12:25.559
+Editing entries creates timestamps
+
+00:12:25.560 --> 00:12:56.039
+How is *HyRolo* a zettelkasten?
+
+00:12:56.040 --> 00:14:26.799
+Demo interlinked notes via *HyRolo* search
+
+00:14:26.800 --> 00:15:35.079
+Explaining how Hyperbole hyperlinks work
+
+00:15:35.080 --> 00:16:04.679
+Demo Hyperbole "implicit links"
+
+00:16:04.680 --> 00:16:04.679
+Explain Hyperbole "explicit links"
+
+00:16:04.680 --> 00:18:32.719
+Demo creating an explicit link
+
+00:18:32.720 --> 00:19:19.879
+Demo creating an /zettel/ entry for a person
+
+00:19:19.880 --> 00:20:10.559
+Demo explicit linking new entry to others
+
+00:20:10.560 --> 00:21:12.479
+How "explicit buttons" encode actions
+
+00:21:12.480 --> 00:21:43.920
+Conclusion
diff --git a/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.vtt b/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.vtt
new file mode 100644
index 00000000..2ec7490e
--- /dev/null
+++ b/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.vtt
@@ -0,0 +1,1315 @@
+WEBVTT - EmacsConf 2022, Ramin Honary: "Build a Zettelkasten with the Hyperbole Rolodex" captioned by ramin
+
+00:00:00.000 --> 00:00:06.759
+Hello, attendees of EmacsConf 2022!
+
+00:00:06.760 --> 00:00:08.839
+The title of my talk is:
+
+00:00:08.840 --> 00:00:16.159
+"Build a Zettelkasten with the Hyperbole Rolodex."
+
+00:00:16.160 --> 00:00:17.479
+My name is Ramin Honary.
+
+00:00:17.480 --> 00:00:19.279
+I work as a software engineer
+
+00:00:19.280 --> 00:00:22.839
+writing apps for a small machine learning consultancy.
+
+00:00:22.840 --> 00:00:24.839
+I have been using Emacs since roughly 2018
+
+00:00:24.840 --> 00:00:26.479
+after having switched from a workflow
+
+00:00:26.480 --> 00:00:29.439
+using Vim together with Screen/Tmux for over a decade.
+
+00:00:29.440 --> 00:00:31.439
+Today I'd like to talk a bit about
+
+00:00:31.440 --> 00:00:34.039
+the Hyperbole package for Emacs.
+
+00:00:34.040 --> 00:00:36.159
+Others are presenting talks later today
+
+00:00:36.160 --> 00:00:37.479
+about Hyperbole as well,
+
+00:00:37.480 --> 00:00:39.839
+including some of the the authors and maintainers,
+
+00:00:39.840 --> 00:00:41.879
+so I won't go into too much detail
+
+00:00:41.880 --> 00:00:43.559
+about how Hyperbole works.
+
+00:00:43.560 --> 00:00:45.039
+Instead, I want to present
+
+00:00:45.040 --> 00:00:46.839
+a more concrete use case for Hyperbole,
+
+00:00:46.840 --> 00:00:49.279
+which is how to use it to facilitate
+
+00:00:49.280 --> 00:00:51.919
+the Zettelkasten method.
+
+00:00:51.920 --> 00:00:53.759
+Most Emacs users will probably be
+
+00:00:53.760 --> 00:00:56.039
+more familiar with Org Roam.
+
+00:00:56.040 --> 00:00:58.679
+Org Roam may even be the first thing that comes to mind
+
+00:00:58.680 --> 00:01:00.399
+when you hear the word "Zettelkasten."
+
+00:01:00.400 --> 00:01:02.479
+But personally, I use Hyperbole
+
+00:01:02.480 --> 00:01:05.039
+because I found it easier to get started with
+
+00:01:05.040 --> 00:01:07.479
+using it as an ideas database.
+
+00:01:07.480 --> 00:01:09.599
+All you need to do is install the Hyperbole package
+
+00:01:09.600 --> 00:01:11.399
+(which is available on GNU-ELPA)
+
+00:01:11.400 --> 00:01:13.759
+and then set a few customization options.
+
+00:01:13.760 --> 00:01:15.399
+There is nothing else you really need to do
+
+00:01:15.400 --> 00:01:16.079
+to get started.
+
+00:01:16.080 --> 00:01:19.759
+And also, Hyperbole works nicely with Org Mode.
+
+00:01:19.760 --> 00:01:21.799
+So Hyperbole's built-in functionality
+
+00:01:21.800 --> 00:01:24.919
+can be used as a nice, light-weight alternative
+
+00:01:24.920 --> 00:01:28.199
+to other Emacs Zettelkasten packages.
+
+00:01:28.200 --> 00:01:30.599
+This talk is for people who are curious about
+
+00:01:30.600 --> 00:01:34.159
+getting started with the Zettelkasten method,
+
+00:01:34.160 --> 00:01:36.079
+but are not ready to commit
+
+00:01:36.080 --> 00:01:41.039
+to a more purpose-built solution like Org Roam.
+
+00:01:41.040 --> 00:01:42.719
+So the thing I'd like people
+
+00:01:42.720 --> 00:01:44.599
+to take away from this presentation
+
+00:01:44.600 --> 00:01:46.759
+is that the Hyperbole Emacs package
+
+00:01:46.760 --> 00:01:50.639
+provides you with a flat-file database called "HyRolo"
+
+00:01:50.640 --> 00:01:53.239
+which you can use to store ideas.
+
+00:01:53.240 --> 00:01:55.999
+Then you can use what Hyperbole calls "buttons"
+
+00:01:56.000 --> 00:01:57.239
+(which are hyperlinks)
+
+00:01:57.240 --> 00:02:00.519
+to execute arbitrary Emacs commands
+
+00:02:00.520 --> 00:02:03.159
+and by inserting links into your database
+
+00:02:03.160 --> 00:02:06.159
+that execute queries against the database itself.
+
+00:02:06.160 --> 00:02:08.959
+These query-action links serve as
+
+00:02:08.960 --> 00:02:10.319
+a means to link ideas together,
+
+00:02:10.320 --> 00:02:13.439
+thus creating a functioning "Zettelkasten."
+
+00:02:13.440 --> 00:02:15.479
+If this doesn't make sense to you,
+
+00:02:15.480 --> 00:02:19.839
+I'll explain what all of this means presently.
+
+00:02:19.840 --> 00:02:24.359
+So just a quick overview of what "Zettelkasten" is.
+
+00:02:24.360 --> 00:02:26.199
+Note that most of what I say
+
+00:02:26.200 --> 00:02:27.359
+about the Zettelkasten method
+
+00:02:27.360 --> 00:02:29.759
+comes from a guy called Sascha Fast,
+
+00:02:29.760 --> 00:02:33.119
+and his website: zettelkasten.de .
+
+00:02:33.120 --> 00:02:34.999
+So a Zettelkasten is, in brief,
+
+00:02:35.000 --> 00:02:38.199
+a database containing many nodes of interconnected ideas,
+
+00:02:38.200 --> 00:02:40.759
+each idea being a single quantity of knowledge
+
+00:02:40.760 --> 00:02:42.039
+(about a paragraph)
+
+00:02:42.040 --> 00:02:46.319
+and linked to other related ideas.
+
+00:02:46.320 --> 00:02:47.959
+Also, let me quickly mention
+
+00:02:47.960 --> 00:02:49.679
+that there are actually many tools I use
+
+00:02:49.680 --> 00:02:51.879
+that assist me with the zettelkasten method:
+
+00:02:51.880 --> 00:02:53.599
+Hyperbole for hyperlinks;
+
+00:02:53.600 --> 00:02:56.079
+Embark for general text editing;
+
+00:02:56.080 --> 00:02:57.279
+Org Mode for markup;
+
+00:02:57.280 --> 00:02:59.439
+Dired for managing large sets of files;
+
+00:02:59.440 --> 00:03:01.959
+Consult, Vertico, Orderless, Marginalia;
+
+00:03:01.960 --> 00:03:04.519
+for interactive search through directories and documents;
+
+00:03:04.520 --> 00:03:06.359
+and Magit for revision control,
+
+00:03:06.360 --> 00:03:08.159
+and syncing my database of ideas
+
+00:03:08.160 --> 00:03:10.199
+across a few of my computers.
+
+00:03:10.200 --> 00:03:12.959
+Each of these tools provides some unique functionality,
+
+00:03:12.960 --> 00:03:15.439
+but today I will be focusing mostly on Hyperbole
+
+00:03:15.440 --> 00:03:17.039
+and how it is especially useful
+
+00:03:17.040 --> 00:03:19.839
+for the task of linking information together
+
+00:03:19.840 --> 00:03:21.399
+which is the most important aspect
+
+00:03:21.400 --> 00:03:25.359
+of the Zettelkasten methodology.
+
+00:03:25.360 --> 00:03:28.399
+And now I'll briefly go over what Hyperbole is.
+
+00:03:28.400 --> 00:03:31.159
+At it's core, Hyperbole is a simple markup language
+
+00:03:31.160 --> 00:03:34.519
+specifically designed to markup hyperlinks.
+
+00:03:34.520 --> 00:03:38.439
+Now, a hyperlink usually is only able to jump to
+
+00:03:38.440 --> 00:03:40.959
+ordinary URLs and file paths.
+
+00:03:40.960 --> 00:03:44.319
+Hyperbole extends the function of a hyperlink to provide
+
+00:03:44.320 --> 00:03:45.999
+a simple human-readable markup
+
+00:03:46.000 --> 00:03:49.639
+for executing Emacs commands (called "button actions")
+
+00:03:49.640 --> 00:03:52.359
+and then, on top of this core functionality,
+
+00:03:52.360 --> 00:03:53.239
+a few mini applications
+
+00:03:53.240 --> 00:03:56.839
+for example "HyRolo" and "Koutline",
+
+00:03:56.840 --> 00:04:00.959
+have been built to make Hyperbole more generally useful
+
+00:04:00.960 --> 00:04:03.519
+as a personal information management tool.
+
+00:04:03.520 --> 00:04:07.959
+"HyRolo" is the feature that I use as my Zettelkasten,
+
+00:04:07.960 --> 00:04:10.999
+and in particular, the HyRolo search feature
+
+00:04:11.000 --> 00:04:12.319
+in combination with
+
+00:04:12.320 --> 00:04:16.719
+the usual Hyperbole hyperlink markup language.
+
+00:04:16.720 --> 00:04:19.199
+So let me just quote the Hyperbole manual:
+
+00:04:19.200 --> 00:04:24.759
+"Hyperbole includes HyRolo for convenient management of
+
+00:04:24.760 --> 00:04:27.439
+hierarchical, record-oriented information.
+
+00:04:27.440 --> 00:04:30.879
+Most often, this is used for contact management
+
+00:04:30.880 --> 00:04:33.519
+but it can quickly be adapted to most any
+
+00:04:33.520 --> 00:04:37.199
+record-oriented lookup task requiring fast retrieval."
+
+00:04:37.200 --> 00:04:38.839
+So in other words, for example,
+
+00:04:38.840 --> 00:04:41.399
+it can be used to run search queries
+
+00:04:41.400 --> 00:04:44.679
+across the full set of nodes in a set of Org-Mode files.
+
+00:04:44.680 --> 00:04:47.679
+This means we can use an Org-Mode file
+
+00:04:47.680 --> 00:04:49.639
+as a flat-file database
+
+00:04:49.640 --> 00:04:52.159
+in which entries in the database can be linked together.
+
+00:04:52.160 --> 00:04:55.239
+This, in essence, is a what a Zettelkasten is.
+
+00:04:55.240 --> 00:04:58.959
+HyRolo needs almost no configuration,
+
+00:04:58.960 --> 00:05:00.239
+even if you are using it
+
+00:05:00.240 --> 00:05:01.719
+for the purpose of Zettelkasten,
+
+00:05:01.720 --> 00:05:03.839
+but you should at least make sure
+
+00:05:03.840 --> 00:05:05.599
+you set the location of the database
+
+00:05:05.600 --> 00:05:08.159
+in your Emacs config file, using the Customize system
+
+00:05:08.160 --> 00:05:10.359
+or however you prefer to configure your Emacs.
+
+00:05:10.360 --> 00:05:13.799
+I use "use-package", and on this slide I have here
+
+00:05:13.800 --> 00:05:15.879
+an abridged version of what my "init.el" file
+
+00:05:15.880 --> 00:05:18.199
+looks like for the Hyperbole package.
+
+00:05:18.200 --> 00:05:21.159
+A few relevant environment variables are set:
+
+00:05:21.160 --> 00:05:23.879
+the "hyrolo-file-list" variable
+
+00:05:23.880 --> 00:05:26.919
+selects where to find Rolo database files
+
+00:05:26.920 --> 00:05:29.279
+for the purpose of search. I have it set
+
+00:05:29.280 --> 00:05:31.919
+to just the Zettelkasten flat file database.
+
+00:05:31.920 --> 00:05:35.199
+And I also set "hyrolo-date-format" variable.
+
+00:05:35.200 --> 00:05:37.879
+Each database entry has a time stamp, and
+
+00:05:37.880 --> 00:05:40.239
+I use the time stamp as a unique ID
+
+00:05:40.240 --> 00:05:43.279
+for each entry (that is, each idea node)
+
+00:05:43.280 --> 00:05:44.279
+in the database.
+
+00:05:44.280 --> 00:05:48.199
+Finally, before I get into the actual demo,
+
+00:05:48.200 --> 00:05:49.599
+let me quickly explain
+
+00:05:49.600 --> 00:05:51.559
+the Hyperbole mini-buffer menu system.
+
+00:05:51.560 --> 00:05:54.599
+Mini-buffer menus in Hyperbole work just like
+
+00:05:54.600 --> 00:05:55.559
+in an ordinary GUI,
+
+00:05:55.560 --> 00:05:58.759
+except you typically enter into the mini-buffer menu
+
+00:05:58.760 --> 00:06:01.159
+with a key binding instead of a mouse click.
+
+00:06:01.160 --> 00:06:03.319
+To open the Hyperbole menu,
+
+00:06:03.320 --> 00:06:06.479
+you use the Hyperbole universal leader key
+
+00:06:06.480 --> 00:06:09.519
+that's C-h h, which by the way,
+
+00:06:09.520 --> 00:06:13.239
+this rebinds the "view-hello-file" command,
+
+00:06:13.240 --> 00:06:15.759
+which is a command that probably most people never use.
+
+00:06:15.760 --> 00:06:20.919
+So all Hyperbole menu key sequences begin with C-h h.
+
+00:06:20.920 --> 00:06:23.239
+Please remember this:
+
+00:06:23.240 --> 00:06:25.159
+as I explain how to do things,
+
+00:06:25.160 --> 00:06:26.959
+please don't worry too much
+
+00:06:26.960 --> 00:06:28.679
+about the key sequences I use
+
+00:06:28.680 --> 00:06:30.319
+to perform certain actions.
+
+00:06:30.320 --> 00:06:32.319
+Really, I am just navigating
+
+00:06:32.320 --> 00:06:33.479
+the Hyperbole mini-buffer menus.
+
+00:06:33.480 --> 00:06:37.599
+It is a very discoverable and fluid user interface.
+
+00:06:37.600 --> 00:06:42.159
+Anyway, now that we have configured our Rolo database,
+
+00:06:42.160 --> 00:06:45.399
+let's see how we enter new ideas into the database.
+
+00:06:45.400 --> 00:06:48.879
+And I will start with an empty database,
+
+00:06:48.880 --> 00:06:53.639
+then I'll switch over to a more complete database
+
+00:06:53.640 --> 00:06:57.039
+that I prepared for this demo. So...
+
+00:06:57.040 --> 00:07:04.159
+first we type the Hyperbole universal leader key C-h h,
+
+00:07:04.160 --> 00:07:08.919
+and then, you can see the menus down here
+
+00:07:08.920 --> 00:07:15.279
+we type "r" for "Rolo" and "a" for "add".
+
+00:07:15.280 --> 00:07:19.479
+That's C-h h r a to enter a new idea.
+
+00:07:19.480 --> 00:07:23.319
+And this command is available globally so,
+
+00:07:23.320 --> 00:07:26.599
+much like with the "org-capture" feature in Org-Mode,
+
+00:07:26.600 --> 00:07:28.879
+you can run this command at any time,
+
+00:07:28.880 --> 00:07:32.479
+at the very moment you want to enter an idea.
+
+00:07:32.480 --> 00:07:36.159
+First we are prompted for an entry title,
+
+00:07:36.160 --> 00:07:38.799
+and if you were using HyRolo as a contact list,
+
+00:07:38.800 --> 00:07:40.959
+this is where you would enter the person's name.
+
+00:07:40.960 --> 00:07:43.199
+I am using it as a Zettelkasten,
+
+00:07:43.200 --> 00:07:45.439
+so I instead enter a title for my idea.
+
+00:07:45.440 --> 00:07:46.839
+I'll just type in...
+
+00:07:46.840 --> 00:07:53.159
+and as soon as I press enter after this prompt,
+
+00:07:53.160 --> 00:07:55.999
+my Zettelkasten org file is opened,
+
+00:07:56.000 --> 00:08:02.879
+a new entry with the timestamp is created,
+
+00:08:02.880 --> 00:08:06.319
+and the cursor is placed at this entry
+
+00:08:06.320 --> 00:08:09.079
+ready for me to enter the body text of the idea.
+
+00:08:09.080 --> 00:08:14.799
+I'll type that in...
+
+00:08:14.800 --> 00:08:18.039
+Now I save the "idea" file (C-x C-s)
+
+00:08:18.040 --> 00:08:20.879
+and switch back to what I was working on before
+
+00:08:20.880 --> 00:08:23.759
+with the usual C-x 0 (delete-window) command.
+
+00:08:23.760 --> 00:08:26.279
+Next, I'd like to talk about
+
+00:08:26.280 --> 00:08:28.719
+the HyRolo database search feature,
+
+00:08:28.720 --> 00:08:30.879
+which is very useful.
+
+00:08:30.880 --> 00:08:33.719
+The HyRolo search feature uses
+
+00:08:33.720 --> 00:08:35.319
+only Emacs built-in functions
+
+00:08:35.320 --> 00:08:36.599
+and there is no indexing
+
+00:08:36.600 --> 00:08:38.679
+as with tools like "mlocate" or Org-Roam.
+
+00:08:38.680 --> 00:08:41.439
+So far, I have not had any trouble with efficiency.
+
+00:08:41.440 --> 00:08:42.759
+I don't know if at some point in the future,
+
+00:08:42.760 --> 00:08:44.079
+it will start slowing down.
+
+00:08:44.080 --> 00:08:46.199
+Emacs built-in search functionality
+
+00:08:46.200 --> 00:08:47.679
+is already pretty efficient as it is.
+
+00:08:47.680 --> 00:08:50.839
+It could also be that I am in the habit
+
+00:08:50.840 --> 00:08:55.679
+of storing larger bodies of text in separate files,
+
+00:08:55.680 --> 00:08:57.559
+and not in the flat file database.
+
+00:08:57.560 --> 00:08:58.999
+Anyway, you can search
+
+00:08:59.000 --> 00:09:02.239
+by regex, by string, or by words.
+
+00:09:02.240 --> 00:09:03.799
+I personally find the string search
+
+00:09:03.800 --> 00:09:04.719
+to be the most useful.
+
+00:09:04.720 --> 00:09:07.479
+The difference between word search and string search
+
+00:09:07.480 --> 00:09:09.199
+is that string search provides
+
+00:09:09.200 --> 00:09:12.119
+logical query operators like AND, OR, XOR, and NOT.
+
+00:09:12.120 --> 00:09:14.199
+Once you run a search query,
+
+00:09:14.200 --> 00:09:16.479
+a "*HyRolo*" buffer is opened
+
+00:09:16.480 --> 00:09:18.159
+with the query's results.
+
+00:09:18.160 --> 00:09:20.439
+And this is a read-only-mode buffer
+
+00:09:20.440 --> 00:09:23.239
+with a few useful single-key action bindings
+
+00:09:23.240 --> 00:09:25.079
+for navigating the list of results
+
+00:09:25.080 --> 00:09:27.119
+which I will now demonstrate.
+
+00:09:27.120 --> 00:09:31.879
+By the way, I have now switched over
+
+00:09:31.880 --> 00:09:34.639
+to a larger example Rolo database that I have created
+
+00:09:34.640 --> 00:09:36.559
+to demonstrate more of the HyRolo features.
+
+00:09:36.560 --> 00:09:39.479
+The HyRolo search is available
+
+00:09:39.480 --> 00:09:40.679
+in the Hyperbole mini-buffer menu
+
+00:09:40.680 --> 00:09:42.239
+so it is always available to you.
+
+00:09:42.240 --> 00:09:46.959
+Start with the Hyperbole universal leader key C-h h
+
+00:09:46.960 --> 00:09:53.839
+then "r" for Rolo and "s" for search. That is C-h h r s.
+
+00:09:53.840 --> 00:09:56.039
+Now we are prompted for a search string:
+
+00:09:56.040 --> 00:10:02.519
+I type in "Alice Abelton", and when I press enter,
+
+00:10:02.520 --> 00:10:03.999
+the search results pop up
+
+00:10:04.000 --> 00:10:06.959
+and the number of results is printed in the mini-buffer.
+
+00:10:06.960 --> 00:10:09.599
+We could also enter a search expression
+
+00:10:09.600 --> 00:10:12.159
+similar to a Lisp S-expression
+
+00:10:12.160 --> 00:10:14.759
+with logical operators like AND or NOT,
+
+00:10:14.760 --> 00:10:19.279
+but you would not need to quote the search terms.
+
+00:10:19.280 --> 00:10:24.519
+So, for example (C-h h r s), I could write
+
+00:10:24.520 --> 00:10:30.279
+"(and university character)" within parentheses
+
+00:10:30.280 --> 00:10:31.959
+and this would find entries
+
+00:10:31.960 --> 00:10:33.799
+that only contain both of the words
+
+00:10:33.800 --> 00:10:35.759
+"university" and "character".
+
+00:10:35.760 --> 00:10:39.239
+For the most part, I only really ever use
+
+00:10:39.240 --> 00:10:41.719
+the ordinary string search without logical operators.
+
+00:10:41.720 --> 00:10:44.759
+So as you can see, a search result buffer
+
+00:10:44.760 --> 00:10:47.239
+called "*HyRolo*" has popped up
+
+00:10:47.240 --> 00:10:48.359
+with all of the matching entries.
+
+00:10:48.360 --> 00:10:51.319
+And the search results buffer is a read-only buffer
+
+00:10:51.320 --> 00:10:54.319
+with several useful navigation key bindings:
+
+00:10:54.320 --> 00:11:01.399
+I can press "o" to switch to "overview" mode,
+
+00:11:01.400 --> 00:11:03.959
+which shows all of the headings, but no content.
+
+00:11:03.960 --> 00:11:05.479
+This would include subheadings
+
+00:11:05.480 --> 00:11:07.959
+with like 2 stars in front of it or 3 stars
+
+00:11:07.960 --> 00:11:12.159
+I can press "a" to switch to "show all mode"
+
+00:11:12.160 --> 00:11:14.559
+which shows all of the content under each heading.
+
+00:11:14.560 --> 00:11:17.079
+If I know I am looking for a keyword
+
+00:11:17.080 --> 00:11:17.999
+in a top-level heading,
+
+00:11:18.000 --> 00:11:22.639
+I can press "t" to switch to the "top-level" view mode
+
+00:11:22.640 --> 00:11:25.439
+which shows only the top-level headings.
+
+00:11:25.440 --> 00:11:27.119
+As is always the case
+
+00:11:27.120 --> 00:11:28.879
+with the Emacs default key bindings,
+
+00:11:28.880 --> 00:11:32.359
+"n" and "p" move the cursor down and up lines,
+
+00:11:32.360 --> 00:11:34.519
+so I can navigate the cursor downward
+
+00:11:34.520 --> 00:11:37.599
+to an entry that looks interesting.
+
+00:11:37.600 --> 00:11:40.279
+I can press "s" to show the content
+
+00:11:40.280 --> 00:11:41.519
+of that particular entry.
+
+00:11:41.520 --> 00:11:44.799
+I can press "h" to hide the entry again.
+
+00:11:44.800 --> 00:11:49.479
+And I can press "e" or M-RET on the entry heading
+
+00:11:49.480 --> 00:11:53.279
+to "edit" that heading (that entry),
+
+00:11:53.280 --> 00:11:56.279
+which will open the Org-Mode file,
+
+00:11:56.280 --> 00:11:59.039
+that is, the Zettelkasten database file
+
+00:11:59.040 --> 00:12:01.759
+with the cursor at this particular entry.
+
+00:12:01.760 --> 00:12:07.639
+Be warned that editing an entry creates a new timestamp,
+
+00:12:07.640 --> 00:12:10.159
+which I do not need, and there is currently
+
+00:12:10.160 --> 00:12:12.039
+no way to avoid this behavior.
+
+00:12:12.040 --> 00:12:15.199
+I work around this by simply using the undo command
+
+00:12:15.200 --> 00:12:20.039
+which removes the unwanted timestamp.
+
+00:12:20.040 --> 00:12:25.559
+And so that is how I use the HyRolo search functionality.
+
+00:12:25.560 --> 00:12:31.999
+Now... since the most important aspect of Zettelkasten
+
+00:12:32.000 --> 00:12:33.839
+is linking ideas in the database,
+
+00:12:33.840 --> 00:12:37.039
+how do we actually make this work in HyRolo?
+
+00:12:37.040 --> 00:12:40.039
+So this is the secret sauce of Hyperbole,
+
+00:12:40.040 --> 00:12:41.119
+and the key take-away
+
+00:12:41.120 --> 00:12:43.279
+for this presentation (as I said earlier).
+
+00:12:43.280 --> 00:12:46.679
+Hyperbole provides markup syntax
+
+00:12:46.680 --> 00:12:50.079
+for executing arbitrary Emacs commands
+
+00:12:50.080 --> 00:12:53.759
+so you can link HyRolo entries together
+
+00:12:53.760 --> 00:12:56.039
+using the HyRolo search function.
+
+00:12:56.040 --> 00:12:58.279
+Let me demonstrate this now.
+
+00:12:58.280 --> 00:13:03.879
+I am back in my example HyRolo database,
+
+00:13:03.880 --> 00:13:06.239
+and if you take a closer look
+
+00:13:06.240 --> 00:13:11.399
+you can see some of the hyperlinks
+
+00:13:11.400 --> 00:13:13.119
+that I already created
+
+00:13:13.120 --> 00:13:15.839
+with the angle-round bracket syntax.
+
+00:13:15.840 --> 00:13:19.279
+Now with the cursor inside of these brackets,
+
+00:13:19.280 --> 00:13:23.439
+I can press M-RET to "click" on this link.
+
+00:13:23.440 --> 00:13:27.799
+As you can see, the search query
+
+00:13:27.800 --> 00:13:32.039
+corresponding to this hyperlink here has executed
+
+00:13:32.040 --> 00:13:34.919
+and popped up the "*HyRolo*" search results buffer.
+
+00:13:34.920 --> 00:13:38.719
+There is only one linked entry,
+
+00:13:38.720 --> 00:13:41.399
+but the list of ideas that are produced
+
+00:13:41.400 --> 00:13:43.759
+by the search query in this buffer here
+
+00:13:43.760 --> 00:13:45.639
+are the list of all of the other ideas
+
+00:13:45.640 --> 00:13:47.799
+that are related to this hyperlink
+
+00:13:47.800 --> 00:13:49.479
+that we just clicked on here.
+
+00:13:49.480 --> 00:13:52.199
+(Let me get rid of the other window...)
+
+00:13:52.200 --> 00:13:55.239
+Now from within this "*HyRolo*" buffer,
+
+00:13:55.240 --> 00:13:57.839
+I can navigate to another hyperlink...
+
+00:13:57.840 --> 00:14:03.759
+and clicking on that updates the "*HyRolo*" buffer
+
+00:14:03.760 --> 00:14:04.799
+with new results again.
+
+00:14:04.800 --> 00:14:10.119
+I can just keep navigating through
+
+00:14:10.120 --> 00:14:13.959
+all the Zettelkasten entries in this way.
+
+00:14:13.960 --> 00:14:18.639
+And so this is it.
+
+00:14:18.640 --> 00:14:22.719
+This is my simple but effective Zettelkasten,
+
+00:14:22.720 --> 00:14:25.119
+constructed entirely with the functionality
+
+00:14:25.120 --> 00:14:26.799
+already built-in to Hyperbole.
+
+00:14:26.800 --> 00:14:32.599
+In the remaining time,
+
+00:14:32.600 --> 00:14:36.999
+I'd like to talk about how Hyperbole hyperlinks work,
+
+00:14:37.000 --> 00:14:38.799
+because it's slightly different
+
+00:14:38.800 --> 00:14:40.759
+from how hyperlinks work in Org Mode
+
+00:14:40.760 --> 00:14:49.199
+or with the Emacs clickable text properties.
+
+00:14:49.200 --> 00:14:52.239
+The easiest way to create a hyperlink button
+
+00:14:52.240 --> 00:14:55.279
+that runs an Emacs command
+
+00:14:55.280 --> 00:14:59.479
+is simply to type the Emacs command as an S-expression,
+
+00:14:59.480 --> 00:15:03.399
+but with angle brackets instead of parentheses.
+
+00:15:03.400 --> 00:15:05.679
+If you were looking closely,
+
+00:15:05.680 --> 00:15:08.639
+you probably already saw a hyperlink of this form,
+
+00:15:08.640 --> 00:15:10.559
+an angle-bracketed Emacs command.
+
+00:15:10.560 --> 00:15:13.159
+This hyperlink simply calls
+
+00:15:13.160 --> 00:15:18.079
+the "hyrolo-fgrep" function with this string argument.
+
+00:15:18.080 --> 00:15:20.839
+and so clicking on this button
+
+00:15:20.840 --> 00:15:23.119
+is equivalent to running a HyRolo search
+
+00:15:23.120 --> 00:15:27.319
+with the C-h h r s key sequence.
+
+00:15:27.320 --> 00:15:31.399
+As you can see, clicking on it
+
+00:15:31.400 --> 00:15:32.919
+produced the search results
+
+00:15:32.920 --> 00:15:35.079
+for entries associated with that string query.
+
+00:15:35.080 --> 00:15:41.079
+It's also possible to label an action
+
+00:15:41.080 --> 00:15:43.599
+with a so-called "implicit link",
+
+00:15:43.600 --> 00:15:47.079
+and that's this angle-and-square bracketed notation.
+
+00:15:47.080 --> 00:15:51.999
+If I click on this button,
+
+00:15:52.000 --> 00:15:54.159
+it will activate this action
+
+00:15:54.160 --> 00:16:01.359
+to the right of the colon separator,
+
+00:16:01.360 --> 00:16:03.639
+and there are the relevant search results
+
+00:16:03.640 --> 00:16:04.679
+from that string query.
+
+00:16:04.680 --> 00:16:09.119
+Finally, there are "explicit links",
+
+00:16:09.120 --> 00:16:11.239
+which I find to be especially useful
+
+00:16:11.240 --> 00:16:12.599
+for the Zettelkasten method.
+
+00:16:12.600 --> 00:16:15.239
+I've already shown an example
+
+00:16:15.240 --> 00:16:17.079
+of using an explicit link before.
+
+00:16:17.080 --> 00:16:20.759
+What makes explicit links so useful is, firstly,
+
+00:16:20.760 --> 00:16:23.919
+that the button works with just the label alone.
+
+00:16:23.920 --> 00:16:26.599
+There is no need to write an S-expression or anything.
+
+00:16:26.600 --> 00:16:28.919
+You can write the link label
+
+00:16:28.920 --> 00:16:31.959
+inline with the body text of the idea.
+
+00:16:31.960 --> 00:16:34.879
+(For example, like this.)
+
+00:16:34.880 --> 00:16:38.999
+Explicit links are identified by their label,
+
+00:16:39.000 --> 00:16:40.839
+so they are especially good for
+
+00:16:40.840 --> 00:16:43.119
+the names of people and places.
+
+00:16:43.120 --> 00:16:46.399
+By the way, this Zettelkasten database is for
+
+00:16:46.400 --> 00:16:47.919
+a fictional story I started writing
+
+00:16:47.920 --> 00:16:50.079
+for the purpose of demonstrating HyRolo
+
+00:16:50.080 --> 00:16:52.879
+in this presentation, and I had so much fun writing it
+
+00:16:52.880 --> 00:16:54.999
+that I may actually continue developing this story.
+
+00:16:55.000 --> 00:16:58.639
+Anyway, let's create a new explicit link
+
+00:16:58.640 --> 00:17:01.679
+and a new idea entry for a character in the story.
+
+00:17:01.680 --> 00:17:10.239
+So suppose I want to create a new idea node entry
+
+00:17:10.240 --> 00:17:11.959
+for this fictional character here,
+
+00:17:11.960 --> 00:17:15.359
+and I'll also want to link this entry to that node.
+
+00:17:15.360 --> 00:17:17.839
+Since hyperlinks are just string search,
+
+00:17:17.840 --> 00:17:19.799
+we don't actually need to have
+
+00:17:19.800 --> 00:17:22.279
+an entry in the database for this character.
+
+00:17:22.280 --> 00:17:24.879
+The worst that can happen is that the hyperlink
+
+00:17:24.880 --> 00:17:27.319
+executes a search that returns no results.
+
+00:17:27.320 --> 00:17:29.079
+So it's OK to create the hyperlink
+
+00:17:29.080 --> 00:17:31.879
+before we have an actual entry for this person.
+
+00:17:31.880 --> 00:17:36.719
+(I'll just M-w copy the name.)
+
+00:17:36.720 --> 00:17:40.919
+Now I use the universal Hyperbole leader key C-h h,
+
+00:17:40.920 --> 00:17:44.519
+and then "e" for "explicit links"
+
+00:17:44.520 --> 00:17:49.359
+and "c" for "create". That's C-h h e c.
+
+00:17:49.360 --> 00:17:52.639
+We are prompted for an entry label
+
+00:17:52.640 --> 00:17:56.119
+but it defaults to the text highlighted by the region,
+
+00:17:56.120 --> 00:17:57.959
+so I just press enter.
+
+00:17:57.960 --> 00:18:00.479
+Now it prompts for a button type,
+
+00:18:00.480 --> 00:18:03.119
+so I select "hyrolo-fgrep"
+
+00:18:03.120 --> 00:18:06.479
+(and there's Orderless helping me go faster),
+
+00:18:06.480 --> 00:18:10.319
+and since "hyrolo-fgrep" requires
+
+00:18:10.320 --> 00:18:12.679
+a string argument for the search query,
+
+00:18:12.680 --> 00:18:14.479
+I am prompted for the query string.
+
+00:18:14.480 --> 00:18:21.839
+I'll type in "character:", (yank "Kerri Katz's" name)
+
+00:18:21.840 --> 00:18:26.839
+and there we are, the link has been created, and
+
+00:18:26.840 --> 00:18:31.159
+(let me just get rid of the # character)
+
+00:18:31.160 --> 00:18:32.719
+I can try it out.
+
+00:18:32.720 --> 00:18:36.199
+There's no search results. That's fine.
+
+00:18:36.200 --> 00:18:38.959
+We haven't created an idea entry yet
+
+00:18:38.960 --> 00:18:40.799
+for this character now.
+
+00:18:40.800 --> 00:18:43.399
+So let's go ahead and do that now.
+
+00:18:43.400 --> 00:18:45.679
+If we remember how to create a new idea,
+
+00:18:45.680 --> 00:18:52.359
+it's C-h h r a, and then I type "character:"
+
+00:18:52.360 --> 00:18:56.799
+and then yank the name again.
+
+00:18:56.800 --> 00:18:58.399
+Now a new node has been created,
+
+00:18:58.400 --> 00:19:04.359
+and I can start describing this character.
+
+00:19:04.360 --> 00:19:08.839
+Notice that I like to precede my characters
+
+00:19:08.840 --> 00:19:11.479
+with the keyword "character:" colon.
+
+00:19:11.480 --> 00:19:14.919
+This technique helps me to create hyperlinks
+
+00:19:14.920 --> 00:19:16.999
+using more descriptive search queries
+
+00:19:17.000 --> 00:19:19.879
+that return fewer but more useful search results.
+
+00:19:19.880 --> 00:19:23.839
+And finally, I can create an explicit link
+
+00:19:23.840 --> 00:19:26.039
+from this character back to
+
+00:19:26.040 --> 00:19:28.839
+the other character (her boyfriend).
+
+00:19:28.840 --> 00:19:31.159
+I just type in "<(Bertrand Becket)>",
+
+00:19:31.160 --> 00:19:37.039
+and this explicit link has already been created
+
+00:19:37.040 --> 00:19:39.679
+so I don't need to create it again. It just works.
+
+00:19:39.680 --> 00:19:41.879
+Hyperbole identifies buttons by their label,
+
+00:19:41.880 --> 00:19:44.719
+so as long as an explicit link button with that label
+
+00:19:44.720 --> 00:19:46.039
+has been created before,
+
+00:19:46.040 --> 00:19:51.079
+I just can type in the button with markup by hand,
+
+00:19:51.080 --> 00:19:53.279
+and then I can just use it.
+
+00:19:53.280 --> 00:19:57.839
+Now I am back to the search results
+
+00:19:57.840 --> 00:19:59.319
+for the boyfriend character.
+
+00:19:59.320 --> 00:20:04.159
+I hope you can see how minimal but useful
+
+00:20:04.160 --> 00:20:07.759
+is this particular Zettelkasten technique I have
+
+00:20:07.760 --> 00:20:10.559
+that uses this "HyRolo".
+
+00:20:10.560 --> 00:20:19.359
+I should also make clear that Hyperbole explicit links
+
+00:20:19.360 --> 00:20:22.279
+are encoded in a separate file in the same directory
+
+00:20:22.280 --> 00:20:24.279
+as the Zettelkasten flat-file database.
+
+00:20:24.280 --> 00:20:37.079
+(So, let's go back to that and C-x C-f ".hypb").
+
+00:20:37.080 --> 00:20:41.239
+You should not edit this file by hand,
+
+00:20:41.240 --> 00:20:43.599
+but it is human readable,
+
+00:20:43.600 --> 00:20:45.399
+so it works well with Git
+
+00:20:45.400 --> 00:20:47.079
+and other revision control systems.
+
+00:20:47.080 --> 00:20:49.559
+Whenever an explicit link is activated,
+
+00:20:49.560 --> 00:20:52.559
+it consults this file and runs the associated action,
+
+00:20:52.560 --> 00:20:55.839
+which, in the Zettelkasten use case,
+
+00:20:55.840 --> 00:20:58.799
+will always be to run a HyRolo search query.
+
+00:20:58.800 --> 00:21:02.039
+The advantage of keeping a separate table of links
+
+00:21:02.040 --> 00:21:03.919
+is that you can edit the link action
+
+00:21:03.920 --> 00:21:06.999
+(that is, the search query) in just one place,
+
+00:21:07.000 --> 00:21:10.559
+and the updated button action works everywhere
+
+00:21:10.560 --> 00:21:12.479
+without having to change any other files.
+
+00:21:12.480 --> 00:21:18.399
+So, that is all for today.
+
+00:21:18.400 --> 00:21:20.519
+Thank you so much for listening to my talk.
+
+00:21:20.520 --> 00:21:23.079
+I'll be available for questions
+
+00:21:23.080 --> 00:21:24.919
+for the next 20 minutes or so.
+
+00:21:24.920 --> 00:21:27.959
+If there are any questions that I cannot answer,
+
+00:21:27.960 --> 00:21:29.439
+you will have a chance to ask
+
+00:21:29.440 --> 00:21:31.799
+the author of Hyperbole himself, Bob Weiner,
+
+00:21:31.800 --> 00:21:34.239
+later today after his presentation.
+
+00:21:34.240 --> 00:21:43.920
+Thanks for your attention!
diff --git a/2022/captions/emacsconf-2022-sat-open--opening-remarks--main--chapters.vtt b/2022/captions/emacsconf-2022-sat-open--opening-remarks--main--chapters.vtt
new file mode 100644
index 00000000..007fa710
--- /dev/null
+++ b/2022/captions/emacsconf-2022-sat-open--opening-remarks--main--chapters.vtt
@@ -0,0 +1,29 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:32.839
+General and Development tracks
+
+00:00:32.840 --> 00:01:02.119
+Conversations
+
+00:01:02.120 --> 00:01:30.679
+Etherpad
+
+00:01:31.600 --> 00:02:01.359
+Internet Relay Chat
+
+00:02:01.360 --> 00:02:22.439
+Accessibility and open captions
+
+00:02:22.440 --> 00:02:34.519
+status.emacsconf.org, #emacsconf-org
+
+00:02:34.520 --> 00:02:42.959
+Guidelines for conduct
+
+00:02:42.960 --> 00:03:05.359
+Recordings
+
+00:03:05.360 --> 00:03:20.720
+Let's have fun
diff --git a/2022/captions/emacsconf-2022-sat-open--opening-remarks--main.vtt b/2022/captions/emacsconf-2022-sat-open--opening-remarks--main.vtt
new file mode 100644
index 00000000..2fc69a17
--- /dev/null
+++ b/2022/captions/emacsconf-2022-sat-open--opening-remarks--main.vtt
@@ -0,0 +1,273 @@
+WEBVTT captioned by sachac
+
+NOTE General and Development tracks
+#+OUTPUT: /home/sacha/proj/emacsconf/emacsconf-2022-sat-open--opening-remarks--main.webm
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-20-35.png]]
+
+00:00:00.000 --> 00:00:03.519
+Welcome to EmacsConf 2022, where we get to find out
+
+00:00:03.520 --> 00:00:06.239
+just how crazy a text editor can get.
+
+00:00:06.240 --> 00:00:08.319
+There were so many interesting talks
+
+00:00:08.320 --> 00:00:11.319
+that we couldn't figure out how to fit them in two days,
+
+00:00:11.320 --> 00:00:14.119
+so this year we're experimenting with having two tracks.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-29-06.png]]
+
+00:00:14.120 --> 00:00:16.119
+There's a General track and a Development track,
+
+00:00:16.120 --> 00:00:17.959
+but really, you'll probably find
+
+00:00:17.960 --> 00:00:19.599
+interesting things on both tracks
+
+00:00:19.600 --> 00:00:22.159
+no matter what your level of experience is,
+
+00:00:22.160 --> 00:00:25.079
+so don't feel limited to one or the other.
+
+00:00:25.080 --> 00:00:26.999
+If we all figure out this track thing together,
+
+00:00:27.000 --> 00:00:29.879
+that could mean being able to have even more Emacs talks
+
+00:00:29.880 --> 00:00:32.839
+next year, so let's give it a try!
+
+NOTE Conversations
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-22-47.png]]
+
+00:00:32.840 --> 00:00:35.719
+The best parts of EmacsConf are the conversations.
+
+00:00:35.720 --> 00:00:38.279
+The wiki has a page on how to watch and participate,
+
+00:00:38.280 --> 00:00:40.839
+and I'll give you a quick overview as well.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-23-52.png]]
+
+00:00:40.840 --> 00:00:43.999
+You can watch both streams at live.emacsconf.org
+
+00:00:44.000 --> 00:00:46.279
+using free and open source software.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_01-00-29.png]]
+
+00:00:46.280 --> 00:00:48.199
+The schedule shows the General track on top
+
+00:00:48.200 --> 00:00:49.959
+and the Development track on the bottom,
+
+00:00:49.960 --> 00:00:52.159
+so you can see what else is going on.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-24-24.png]]
+
+00:00:52.160 --> 00:00:54.559
+The track pages have quick shortcuts so that you can
+
+00:00:54.560 --> 00:00:57.359
+find out more about talks, open the Etherpads,
+
+00:00:57.360 --> 00:01:00.799
+and join the Q&A sessions. The watch page has more tips
+
+00:01:00.800 --> 00:01:02.119
+on how to make the most of Q&A.
+
+NOTE Etherpad
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-24-44.png]]
+
+00:01:02.120 --> 00:01:05.759
+If you can, please add notes and ask questions
+
+00:01:05.760 --> 00:01:08.519
+in the Etherpad for the talk. That makes it easier
+
+00:01:08.520 --> 00:01:10.079
+for everyone to share their notes,
+
+00:01:10.080 --> 00:01:13.119
+and speakers and hosts can read the questions from there.
+
+00:01:13.120 --> 00:01:16.039
+We'll copy the notes to the talk pages afterwards.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-25-06.png]]
+
+00:01:16.040 --> 00:01:18.319
+We have one pad for each talk this year,
+
+00:01:18.320 --> 00:01:20.919
+so you can follow the links to get to the next one
+
+00:01:20.920 --> 00:01:23.959
+or go back to the schedule and get the link from there.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-25-27.png]]
+
+00:01:23.960 --> 00:01:25.599
+If you have general feedback about
+
+00:01:25.600 --> 00:01:27.759
+the conference itself, please put it in
+
+00:01:27.760 --> 00:01:30.679
+pad.emacsconf.org/2022 .
+
+NOTE Internet Relay Chat
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-25-47.png]]
+
+00:01:31.600 --> 00:01:34.479
+Internet Relay Chat or IRC can be another great way
+
+00:01:34.480 --> 00:01:37.279
+to be part of lots of conversations.
+
+NOTE
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-26-04.png]]
+
+00:01:37.280 --> 00:01:40.319
+You can use chat.emacsconf.org to join the IRC channels
+
+00:01:40.320 --> 00:01:43.199
+through your web browser. The tabs on the left can help you
+
+00:01:43.200 --> 00:01:45.239
+switch between the different channels.
+
+00:01:45.240 --> 00:01:47.719
+There's #emacsconf-gen for the General track
+
+00:01:47.720 --> 00:01:50.239
+and #emacsconf-dev for the Development track.
+
+00:01:50.240 --> 00:01:53.439
+If you need to reach us, you can join #emacsconf-org
+
+00:01:53.440 --> 00:01:57.879
+or e-mail emacsconf-org-private@gnu.org.
+
+00:01:57.880 --> 00:02:01.359
+You can use #emacsconf for hallway conversations.
+
+NOTE Accessibility and open captions
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-26-32.png]]
+
+00:02:01.360 --> 00:02:03.919
+Once again, we're going to be streaming with open captions
+
+00:02:03.920 --> 00:02:06.639
+for most of the talks this year, thanks to our speakers and
+
+00:02:06.640 --> 00:02:09.919
+captioning volunteers. The captioned talks are indicated
+
+00:02:09.920 --> 00:02:12.519
+on the schedule, and with any luck, we'll be posting
+
+00:02:12.520 --> 00:02:16.119
+transcripts on talk pages shortly after the talks start.
+
+00:02:16.120 --> 00:02:18.919
+If you need additional accommodations, please let us know
+
+00:02:18.920 --> 00:02:20.319
+in #emacsconf-org and we'll see
+
+00:02:20.320 --> 00:02:22.439
+if we can make things happen.
+
+NOTE status.emacsconf.org, #emacsconf-org
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-26-55.png]]
+
+00:02:22.440 --> 00:02:26.319
+If something goes down, we'll update status.emacsconf.org.
+
+00:02:26.320 --> 00:02:27.799
+If it doesn't look like we've noticed yet,
+
+00:02:27.800 --> 00:02:31.599
+please let us know in the #emacsconf-org IRC channel,
+
+00:02:31.600 --> 00:02:34.519
+where we will be quietly panicking.
+
+NOTE Guidelines for conduct
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-27-19.png]]
+
+00:02:34.520 --> 00:02:36.959
+In all of these conversations, please keep in mind
+
+00:02:36.960 --> 00:02:39.759
+our guidelines for conduct. You can find them on the wiki,
+
+00:02:39.760 --> 00:02:42.959
+and they basically boil down to: please be nice. Thank you!
+
+NOTE Recordings
+#+CAPTION:
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-27-53.png]]
+
+00:02:42.960 --> 00:02:47.519
+We'll be posting the prerecorded videos as soon as possible.
+
+00:02:47.520 --> 00:02:50.039
+Assuming things go well, you might be able to check out
+
+00:02:50.040 --> 00:02:52.719
+quick replays on the Toobnix channel, which you can
+
+00:02:52.720 --> 00:02:55.679
+find on the watch page in the wiki. We'll post the live
+
+00:02:55.680 --> 00:02:58.759
+talks and Q&A sessions some time after the conference.
+
+00:02:58.760 --> 00:03:01.799
+If you'd like to get an update, you can subscribe to
+
+00:03:01.800 --> 00:03:05.359
+the emacsconf-discuss mailing list.
+
+NOTE Let's have fun
+[[file:/home/sacha/screenshots/Screenshot_2022-12-03_00-28-14.png]]
+
+00:03:05.360 --> 00:03:06.599
+All right, let's get going.
+
+00:03:06.600 --> 00:03:09.639
+Leo Vivier is going to be hosting the general track,
+
+00:03:09.640 --> 00:03:12.399
+and Amin Bandali will host the development track.
+
+00:03:12.400 --> 00:03:15.319
+The other volunteers and I will run around mostly backstage,
+
+00:03:15.320 --> 00:03:18.159
+and you'll probably meet us in the closing remarks.
+
+00:03:18.160 --> 00:03:20.720
+Let's have fun at EmacsConf 2022!
diff --git a/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main--chapters.vtt b/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main--chapters.vtt
new file mode 100644
index 00000000..6c118a7b
--- /dev/null
+++ b/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main--chapters.vtt
@@ -0,0 +1,26 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:51.919
+Introduction
+
+00:00:51.920 --> 00:02:30.679
+Packages: Lectorg, Reorg, HBH
+
+00:02:30.680 --> 00:03:14.919
+Org Mode
+
+00:03:14.920 --> 00:04:18.679
+The ecosystem of Lectorg: Elisp and Python
+
+00:04:18.680 --> 00:04:49.159
+How Lectorg works
+
+00:04:49.160 --> 00:06:15.799
+Math
+
+00:06:15.800 --> 00:07:25.759
+Business
+
+00:07:25.760 --> 00:08:08.480
+Conclusion
diff --git a/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.vtt b/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.vtt
new file mode 100644
index 00000000..92b99925
--- /dev/null
+++ b/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.vtt
@@ -0,0 +1,383 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:04.879
+Taking notes on a computer can be challenging,
+
+00:00:04.880 --> 00:00:08.279
+especially if you compare computer notes
+
+00:00:08.280 --> 00:00:11.959
+with handwritten notes. When you're handwriting,
+
+00:00:11.960 --> 00:00:16.159
+you don't focus as much on taking those notes.
+
+00:00:16.160 --> 00:00:19.559
+Well, you don't focus as much on *how* you take the notes,
+
+00:00:19.560 --> 00:00:24.119
+you more so focus on what you're taking.
+
+00:00:24.120 --> 00:00:27.719
+You don't get that same experience
+
+00:00:27.720 --> 00:00:30.519
+if you're writing your notes on a computer.
+
+00:00:30.520 --> 00:00:32.119
+When writing notes on a computer,
+
+00:00:32.120 --> 00:00:38.439
+you mostly focus on typing or alignment.
+
+00:00:38.440 --> 00:00:42.159
+Those are things that are kind of solved already
+
+00:00:42.160 --> 00:00:45.359
+by certain software such as Org Mode,
+
+00:00:45.360 --> 00:00:48.599
+which is fantastic when it comes to note-taking,
+
+00:00:48.600 --> 00:00:51.919
+but I still believe it could be much better.
+
+NOTE Packages: Lectorg, Reorg, HBH
+
+00:00:51.920 --> 00:00:56.639
+That's why I've developed the package called Lectorg.
+
+00:00:56.640 --> 00:01:01.799
+It's a collection of scripts and snippets which allow you
+
+00:01:01.800 --> 00:01:04.959
+to improve your note-taking experience on the computer,
+
+00:01:04.960 --> 00:01:09.919
+of course, making you more focused on the subject
+
+00:01:09.920 --> 00:01:14.439
+rather than the process of taking notes.
+
+00:01:14.440 --> 00:01:16.559
+So why use Emacs? Well, again,
+
+00:01:16.560 --> 00:01:18.719
+if compared with other software,
+
+00:01:18.720 --> 00:01:21.799
+it has a lot more customizability
+
+00:01:21.800 --> 00:01:24.679
+and it can also unify pretty much anything you need
+
+00:01:24.680 --> 00:01:31.079
+in student life or work life into one place.
+
+00:01:31.080 --> 00:01:35.639
+The problems that Lectorg solves are kind of,
+
+00:01:35.640 --> 00:01:37.879
+as I mentioned, already solved partially
+
+00:01:37.880 --> 00:01:40.479
+by Org Mode itself.
+
+00:01:40.480 --> 00:01:44.599
+What I've done is simply make a bunch of additions
+
+00:01:44.600 --> 00:01:47.359
+to Org Mode through an external package,
+
+00:01:47.360 --> 00:01:51.279
+but I've also developed other sub-modules,
+
+00:01:51.280 --> 00:01:54.439
+one of them being HBH, which allows me
+
+00:01:54.440 --> 00:02:01.399
+to easily plan out my days HBH, hour by hour,
+
+00:02:01.400 --> 00:02:04.679
+therefore I can plan out my days on an hourly basis
+
+00:02:04.680 --> 00:02:09.439
+practically. But I've also built something called Reorg
+
+00:02:09.440 --> 00:02:11.999
+which, for those of you that are familiar
+
+00:02:12.000 --> 00:02:14.599
+with the Remarkable tablet, allows you
+
+00:02:14.600 --> 00:02:19.999
+to integrate notes from your Remarkable into Emacs--
+
+00:02:20.000 --> 00:02:22.439
+into your Org Mode notes basically.
+
+00:02:22.440 --> 00:02:25.199
+Now I believe there's already another talk on integrating
+
+00:02:25.200 --> 00:02:26.919
+handwritten notes into Emacs,
+
+00:02:26.920 --> 00:02:30.679
+so I won't get too much into that.
+
+NOTE Org Mode
+
+00:02:30.680 --> 00:02:36.079
+So again, at the heart of Lectorg is Org Mode,
+
+00:02:36.080 --> 00:02:38.479
+which for those of you that might not be familiar,
+
+00:02:38.480 --> 00:02:43.759
+Org Mode is one of the best pieces of software
+
+00:02:43.760 --> 00:02:49.039
+when it comes to basically capturing any sort of text,
+
+00:02:49.040 --> 00:02:51.559
+managing that text, exporting it
+
+00:02:51.560 --> 00:02:53.959
+into various different formats,
+
+00:02:53.960 --> 00:02:57.279
+which is perfect for taking notes
+
+00:02:57.280 --> 00:02:59.399
+because you can either export them,
+
+00:02:59.400 --> 00:03:02.119
+take them on the go if you don't have access
+
+00:03:02.120 --> 00:03:03.879
+to your computer all the time,
+
+00:03:03.880 --> 00:03:05.839
+or you can share them with friends, which...
+
+00:03:05.840 --> 00:03:11.359
+Well, that is somewhat self-explanatory
+
+00:03:11.360 --> 00:03:14.919
+in how that can help you or others.
+
+NOTE The ecosystem of Lectorg: Elisp and Python
+
+00:03:14.920 --> 00:03:16.559
+Now the ecosystem of Lectorg,
+
+00:03:16.560 --> 00:03:21.719
+it's a bit chaotic as of right now. It's a package itself,
+
+00:03:21.720 --> 00:03:25.759
+Lectorg.el, which also partially relies on
+
+00:03:25.760 --> 00:03:27.759
+a collection of Python scripts
+
+00:03:27.760 --> 00:03:30.039
+as I didn't have that much time
+
+00:03:30.040 --> 00:03:34.119
+to develop the software strictly in Elisp,
+
+00:03:34.120 --> 00:03:37.599
+but it still gets the job done,
+
+00:03:37.600 --> 00:03:43.719
+and I believe that there is no speed hindrance.
+
+00:03:43.720 --> 00:03:46.519
+Now to further improve Lectorg,
+
+00:03:46.520 --> 00:03:49.279
+I'd love to ask for your help
+
+00:03:49.280 --> 00:03:53.079
+if you have encountered any sort of issue
+
+00:03:53.080 --> 00:03:56.839
+when it comes to note-taking or academics in general,
+
+00:03:56.840 --> 00:03:59.759
+I would love to integrate your solution
+
+00:03:59.760 --> 00:04:04.399
+(or if you don't have one, we can come up with one)
+
+00:04:04.400 --> 00:04:07.519
+into Lectorg. Also, if anyone would be willing
+
+00:04:07.520 --> 00:04:13.439
+to transcribe those Python scripts
+
+00:04:13.440 --> 00:04:18.679
+into a more Lisp approach, then that'd be fabulous.
+
+NOTE How Lectorg works
+
+00:04:18.680 --> 00:04:24.319
+So let's look at how Lectorg works in practice.
+
+00:04:24.320 --> 00:04:26.039
+We'll look at two examples,
+
+00:04:26.040 --> 00:04:28.319
+one of taking notes for math
+
+00:04:28.320 --> 00:04:33.319
+and the other for business, I believe.
+
+00:04:33.320 --> 00:04:36.039
+Now I have to mention that all of the things
+
+00:04:36.040 --> 00:04:38.279
+that I do in that example
+
+00:04:38.280 --> 00:04:43.919
+do not cover all the functions and features of Lectorg.
+
+00:04:43.920 --> 00:04:49.159
+There is decent documentation on the Lectorg GitLab page,
+
+NOTE Math
+
+00:04:49.160 --> 00:04:57.519
+so do check that out for further reference.
+
+00:04:57.520 --> 00:04:59.319
+For our first example, we're going to start off
+
+00:04:59.320 --> 00:05:04.239
+with taking notes for statistics. Now what I'm doing here
+
+00:05:04.240 --> 00:05:06.479
+is opening Lectorg Hub, which allows me
+
+00:05:06.480 --> 00:05:10.879
+to associate certain resources with this particular course.
+
+00:05:10.880 --> 00:05:15.679
+Here, I've opened the book which I have associated
+
+00:05:15.680 --> 00:05:19.319
+with this course, and I'm going to go ahead
+
+00:05:19.320 --> 00:05:22.519
+and start taking some notes
+
+00:05:22.520 --> 00:05:26.639
+on the cumulative distribution function here.
+
+00:05:26.640 --> 00:05:29.999
+Now what OrgMode allows you to do
+
+00:05:30.000 --> 00:05:34.599
+is integrate LaTeX into regular text quite easily,
+
+00:05:34.600 --> 00:05:38.239
+preview it, and then later export it.
+
+00:05:38.240 --> 00:05:48.599
+Now here we can see the first usage of a snippet !m,
+
+00:05:48.600 --> 00:05:59.639
+which inserts a block for entering a LaTeX equation.
+
+00:05:59.640 --> 00:06:00.839
+What I'm trying to do here
+
+00:06:00.840 --> 00:06:04.999
+is take a screenshot of the figures in the book,
+
+00:06:05.000 --> 00:06:10.679
+which is done with org-download (not a part of Lectorg,
+
+00:06:10.680 --> 00:06:15.799
+but a very useful tool). Now that is it for math.
+
+NOTE Business
+
+00:06:15.800 --> 00:06:18.039
+Let's look at something a bit different.
+
+00:06:18.040 --> 00:06:20.199
+We're going to take a look at business,
+
+00:06:20.200 --> 00:06:24.519
+more specifically, taking notes on the product lifecycle.
+
+00:06:24.520 --> 00:06:27.559
+Here on the left, I have certain notes from class
+
+00:06:27.560 --> 00:06:31.079
+which are not complete.
+
+00:06:31.080 --> 00:06:34.679
+As you can see at the top, there's a comment
+
+00:06:34.680 --> 00:06:42.719
+also done using Lectorg which puts this file into a TODO
+
+00:06:42.720 --> 00:06:46.719
+so that I can get back to it whenever I want
+
+00:06:46.720 --> 00:06:48.879
+or schedule this TODO.
+
+00:06:48.880 --> 00:06:54.439
+Now I'm taking notes on a video lecture,
+
+00:06:54.440 --> 00:07:07.639
+which I've opened, again, through Lectorg hub.
+
+00:07:07.640 --> 00:07:09.759
+As you can see right now, I'm inserting
+
+00:07:09.760 --> 00:07:12.479
+another snippet for Plantuml,
+
+00:07:12.480 --> 00:07:15.319
+which immediately exports it to a file,
+
+00:07:15.320 --> 00:07:19.799
+and again I'm going to be using org-download here
+
+00:07:19.800 --> 00:07:25.759
+to insert another figure at the top.
+
+NOTE Conclusion
+
+00:07:25.760 --> 00:07:33.359
+I hope this demonstration was useful.
+
+00:07:33.360 --> 00:07:35.599
+Once again, it did not demonstrate everything.
+
+00:07:35.600 --> 00:07:37.839
+You can find more on GitLab.
+
+00:07:37.840 --> 00:07:44.399
+I hope some of you might consider using Lectorg
+
+00:07:44.400 --> 00:07:46.839
+in your academic life or perhaps even
+
+00:07:46.840 --> 00:07:51.319
+in some areas of business. I believe that is
+
+00:07:51.320 --> 00:07:53.759
+everything I have to demonstrate for today.
+
+00:07:53.760 --> 00:07:57.439
+Thank you for listening to this talk,
+
+00:07:57.440 --> 00:08:08.480
+have a nice rest of the day.
diff --git a/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers--chapters.vtt b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers--chapters.vtt
new file mode 100644
index 00000000..b211c55f
--- /dev/null
+++ b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers--chapters.vtt
@@ -0,0 +1,32 @@
+WEBVTT captioned by Sebastian
+
+
+00:00:00.000 --> 00:00:24.000
+Introduction
+
+00:00:24.000 --> 00:03:21.000
+Q1 - Do you use flipping notes and do you keep them in org-roam?
+
+00:03:21.000 --> 00:06:00.000
+Q2 - Does it work only for PDFs or does it work for more formats?
+
+00:06:00.000 --> 00:07:04.000
+Q3 - Why use OrgNoter in place of Zotero PDF Reader?
+
+00:07:04.000 --> 00:08:16.000
+Q4 - Thoughts on the future of Zettelkasten
+
+00:08:16.000 --> 00:12:03.000
+Q4.5 - Collaborative Zettelkasten notes
+
+00:12:03.000 --> 00:15:26.000
+Q5 - How do you find a way to get a nice overview of multiple notes to rearrange them?
+
+00:15:26.000 --> 00:18:29.000
+Q6 - Can we use Zettelkasten for coding too?
+
+00:18:29.000 --> 00:19:33.000
+Q7 - Is Zetteldesk available in Melpa? - Yes
+
+00:19:33.000 --> 00:22:03.000
+Conclusion - thoughts about Zettelkasten
diff --git a/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.vtt b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.vtt
new file mode 100644
index 00000000..6ad95d62
--- /dev/null
+++ b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.vtt
@@ -0,0 +1,1232 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:06.000
+ I'm fine. So we can start, right?
+
+00:00:06.000 --> 00:00:09.100
+ Yeah, sure. I mean, you pretty much know the drill.
+
+00:00:09.100 --> 00:00:11.050
+ Everyone watching the show now already knows the drill. V
+
+00:00:11.050 --> 00:00:13.090
+idianus is going to read the questions. If you want to read
+
+00:00:13.090 --> 00:00:16.000
+ the questions on your own, you can open up the pad.
+
+00:00:16.000 --> 00:00:18.080
+ Otherwise, Vidianus will be reading the questions and
+
+00:00:18.080 --> 00:00:20.210
+ answering them in line. And I'll be making jazz in the
+
+00:00:20.210 --> 00:00:22.780
+ background whenever something doesn't work. So Vidianus,
+
+00:00:22.780 --> 00:00:24.000
+ the floor is yours.
+
+00:00:24.000 --> 00:00:32.310
+ Okay. So do you use flitting notes as well? Do you keep
+
+00:00:32.310 --> 00:00:33.780
+ them in the org room? And flitting notes are a very
+
+00:00:33.780 --> 00:00:35.580
+ interesting subject. In the initial draft of this talk, I
+
+00:00:35.580 --> 00:00:37.330
+ wanted to include flitting notes as well, but it would take
+
+00:00:37.330 --> 00:00:40.000
+ a bit too long. So I said, let's not do it.
+
+00:00:40.000 --> 00:00:43.980
+ I'm going to add a link here to my .files in the section
+
+00:00:43.980 --> 00:00:48.350
+ for flitting notes. But I can very quickly share my screen
+
+00:00:48.350 --> 00:00:52.970
+ for a moment and show you something about it. So give me a
+
+00:00:52.970 --> 00:00:54.000
+ moment.
+
+00:00:54.000 --> 00:01:00.000
+ Yes, you can do this.
+
+00:01:00.000 --> 00:01:05.000
+ Okay. So you see the screen now, I think?
+
+00:01:05.000 --> 00:01:08.000
+ Yes, I can see it.
+
+00:01:08.000 --> 00:01:13.590
+ So I have a key binding which opens my daily note. I have
+
+00:01:13.590 --> 00:01:17.490
+ some notes from other talks in EmacsConf and talks that I'm
+
+00:01:17.490 --> 00:01:21.400
+ going to miss due to the two tracks. Don't mind them. So I
+
+00:01:21.400 --> 00:01:28.000
+ write, for example, flitting note.
+
+00:01:28.000 --> 00:01:31.890
+ And I have a command down here which will automatically
+
+00:01:31.890 --> 00:01:35.760
+ give it a to do value. So let's say, for example, I'm
+
+00:01:35.760 --> 00:01:40.000
+ crossing it. It adds a tag to the current projects node,
+
+00:01:40.000 --> 00:01:44.840
+ which is essentially a node I have for things I want to do
+
+00:01:44.840 --> 00:01:46.000
+ right now.
+
+00:01:46.000 --> 00:01:52.590
+ It makes it an org-rem node. And then I can write something
+
+00:01:52.590 --> 00:01:59.360
+ here, blah, blah, blah. And if I go on org-rem node find,
+
+00:01:59.360 --> 00:02:04.000
+ actually, I need to save it first. It will appear here.
+
+00:02:04.000 --> 00:02:10.720
+ And then once I say it's done, it is not a node anymore. It
+
+00:02:10.720 --> 00:02:16.470
+ is removed here. This allows me to archive things. I can
+
+00:02:16.470 --> 00:02:21.320
+ stop the sharing now. This allows me to archive flitting
+
+00:02:21.320 --> 00:02:22.000
+ notes.
+
+00:02:22.000 --> 00:02:26.860
+ So I don't need -- because flitting notes are not something
+
+00:02:26.860 --> 00:02:31.740
+ that needs to remain my shell custom. I want them for some
+
+00:02:31.740 --> 00:02:34.000
+ point and then deleting them.
+
+00:02:34.000 --> 00:02:38.140
+ And this is done with org-journal and not org-rem-dailys
+
+00:02:38.140 --> 00:02:41.960
+ because with org-journal I can have this -- I make it a
+
+00:02:41.960 --> 00:02:45.000
+ node and then I remove it from a node.
+
+00:02:45.000 --> 00:02:48.620
+ While I don't think you can do that with org-rem-dailys,
+
+00:02:48.620 --> 00:02:52.020
+ the code for all of this is in the section I pasted on the
+
+00:02:52.020 --> 00:02:57.000
+ etherpad. And if you have any questions, you can email me.
+
+00:02:57.000 --> 00:03:11.240
+ >> Okay. >> Sorry, just to specify, all the contact
+
+00:03:11.240 --> 00:03:11.560
+ information will be available on the talk page. So be it
+
+00:03:11.560 --> 00:03:12.020
+ the email to Vidianos, also the pads, the recording,
+
+00:03:12.020 --> 00:03:14.590
+ everything will be available after the conference as soon
+
+00:03:14.590 --> 00:03:16.000
+ as we have the bandwidth for this.
+
+00:03:16.000 --> 00:03:18.950
+ So that's where you'll be able to find contact information.
+
+00:03:18.950 --> 00:03:21.000
+ Okay. You can keep going, Vidianos. Sorry for the inter
+
+00:03:21.000 --> 00:03:21.000
+ruption.
+
+00:03:21.000 --> 00:03:25.630
+ >> Okay. So the second question is if it works for PDFs
+
+00:03:25.630 --> 00:03:31.400
+ only or Word and Excel or EPUB, websites, CWW and YouTube.
+
+00:03:31.400 --> 00:03:37.520
+ So I'm not sure. Give me a moment to look at OrgNotor and
+
+00:03:37.520 --> 00:03:41.400
+ see if it says -- because I said I didn't remember. Use it
+
+00:03:41.400 --> 00:03:43.000
+ with PDFs typically.
+
+00:03:43.000 --> 00:03:48.370
+ >> Yes. From the top of my mind, I think OrgNotor works
+
+00:03:48.370 --> 00:03:53.580
+ with EPUB file via the package that is managed I think by
+
+00:03:53.580 --> 00:03:57.250
+ -- was it by Wasamasa? I can't remember actually now. But
+
+00:03:57.250 --> 00:03:59.000
+ at some point it was managed by Wasamasa.
+
+00:03:59.000 --> 00:04:07.550
+ He was probably watching right now and probably yelling at
+
+00:04:07.550 --> 00:04:16.000
+ me in the background. So I'll keep you posted on this. But
+
+00:04:16.000 --> 00:04:16.000
+ yes, the OrgNotor allows you mostly to take notes on PDF
+
+00:04:16.000 --> 00:04:16.000
+ via PDFView, but it also allows you to take notes on EPUB.
+
+00:04:16.000 --> 00:04:16.000
+ And they're working relatively well.
+
+00:04:16.000 --> 00:04:19.000
+ But as for the other -- yeah, go on, Vidianos.
+
+00:04:19.000 --> 00:04:22.840
+ >> I opened OrgNotor and it says it also is compatible with
+
+00:04:22.840 --> 00:04:27.000
+ DocView for Office, so Word, Excel and things like that.
+
+00:04:27.000 --> 00:04:30.430
+ >> Yeah. And otherwise, if you really want to take notes on
+
+00:04:30.430 --> 00:04:33.760
+ such documents, you can probably use either OrgConvert or
+
+00:04:33.760 --> 00:04:37.210
+ Pandoc to generate a document that would be editable within
+
+00:04:37.210 --> 00:04:40.200
+ OrgNotor. It shouldn't be too difficult to do so. And
+
+00:04:40.200 --> 00:04:43.400
+ usually it's mostly PDFs when you're working on research
+
+00:04:43.400 --> 00:04:45.000
+ stuff or stuff like this.
+
+00:04:45.000 --> 00:04:47.110
+ Anyway, sorry for interrupting. This is a topic very dear
+
+00:04:47.110 --> 00:04:49.570
+ to my heart as well because as you know, I have worked a
+
+00:04:49.570 --> 00:04:52.000
+ little bit in OrgGram and OrgNotor especially.
+
+00:04:52.000 --> 00:04:58.560
+ >> Yeah. So I think you should be able to do Word, Excel
+
+00:04:58.560 --> 00:05:03.000
+ and EPUB. I don't think it works with websites and it
+
+00:05:03.000 --> 00:05:07.240
+ definitely doesn't work with videos. Not sure if there's
+
+00:05:07.240 --> 00:05:09.000
+ other solutions for those.
+
+00:05:09.000 --> 00:05:11.950
+ >> I believe there is one. Sorry, I keep inserting myself
+
+00:05:11.950 --> 00:05:15.070
+ into the discussion. This is a very interesting topic. I
+
+00:05:15.070 --> 00:05:18.290
+ think Alfred Papa developed an Org package to capture a
+
+00:05:18.290 --> 00:05:21.570
+ webpage. So it's like an OrgCapture, you know, Org protocol
+
+00:05:21.570 --> 00:05:24.000
+ that allows you to capture stuff from your browser.
+
+00:05:24.000 --> 00:05:27.410
+ It allows you to capture a page and basically Pandocs the
+
+00:05:27.410 --> 00:05:31.050
+ results into an HTML, sorry, it Pandocs from HTML to an Org
+
+00:05:31.050 --> 00:05:34.860
+ document with a structure and a hierarchy. And this way you
+
+00:05:34.860 --> 00:05:38.030
+ can actually take notes on the documents and just have all
+
+00:05:38.030 --> 00:05:41.000
+ the features you would expect in an Org document.
+
+00:05:41.000 --> 00:05:49.460
+ >> I'll shut up now. This is your talk, not mine. If I
+
+00:05:49.460 --> 00:05:58.280
+ really wanted to talk about this, I should have made a talk
+
+00:05:58.280 --> 00:06:00.000
+. Anyway, back to you.
+
+00:06:00.000 --> 00:06:04.160
+ >> Okay. So next one. I used Take Notes on PDF with OrgNot
+
+00:06:04.160 --> 00:06:08.500
+er, but Zotero PDF Reader is also very nice. So, okay. Yeah,
+
+00:06:08.500 --> 00:06:12.280
+ I have seen the Zotero PDF Reader. It does look nice as
+
+00:06:12.280 --> 00:06:16.000
+ well, I would agree, but I have two problems with it.
+
+00:06:16.000 --> 00:06:21.310
+ One, Emacs key bindings don't work, and two, it's not Emacs
+
+00:06:21.310 --> 00:06:26.330
+. Basically, I think it's nice, but I want to use things
+
+00:06:26.330 --> 00:06:31.790
+ that are outside Emacs for as little as possible. And I use
+
+00:06:31.790 --> 00:06:36.310
+ it there because I haven't found a way in Emacs to save the
+
+00:06:36.310 --> 00:06:41.000
+ article somewhere and download the PDF automatically.
+
+00:06:41.000 --> 00:06:46.170
+ I know there is DOI Utils, which was mentioned by RC a few
+
+00:06:46.170 --> 00:06:51.610
+ moments ago as well, but it hasn't worked perfectly for me
+
+00:06:51.610 --> 00:06:56.730
+ in the past when I tried it, so I use Zotero for that, but
+
+00:06:56.730 --> 00:07:01.900
+ I wouldn't use it for the PDF Reader as well because I want
+
+00:07:01.900 --> 00:07:04.000
+ to use it in Emacs.
+
+00:07:04.000 --> 00:07:07.590
+ Next one. Thanks for saying that it was a great
+
+00:07:07.590 --> 00:07:12.500
+ presentation. My thoughts on the future of Zelle Casten. I
+
+00:07:12.500 --> 00:07:18.980
+ think Zelle Casten has a bright future, personally, because
+
+00:07:18.980 --> 00:07:24.000
+ it is plain text. Plain text will never go away, basically.
+
+00:07:24.000 --> 00:07:28.610
+ You will be able to use it forever, and also, Orgrom is
+
+00:07:28.610 --> 00:07:33.630
+ open source with a very vibrant community, so that won't go
+
+00:07:33.630 --> 00:07:39.640
+ away either anytime soon, I think. So, it probably has a
+
+00:07:39.640 --> 00:07:44.000
+ future, if you mean it that way.
+
+00:07:44.000 --> 00:07:49.480
+ And I think that, in general, it is a noting method that is
+
+00:07:49.480 --> 00:07:55.040
+ very efficient. I have used it for university the past few
+
+00:07:55.040 --> 00:08:01.300
+ years, and I have right now like 850 notes on it, and they
+
+00:08:01.300 --> 00:08:05.000
+ will probably only keep increasing.
+
+00:08:05.000 --> 00:08:11.250
+ So, I don't think it's going away. If you want to ask
+
+00:08:11.250 --> 00:08:16.000
+ anything else, we can talk more about it.
+
+00:08:16.000 --> 00:08:19.970
+ Actually, I do have something to add to this particular
+
+00:08:19.970 --> 00:08:24.010
+ point, because on the topic of Zelle Casten and how useful
+
+00:08:24.010 --> 00:08:27.470
+ it can be. Now, it's been a little while since Zelle Casten
+
+00:08:27.470 --> 00:08:32.630
+ really started exploding. I think in 2020, right when COVID
+
+00:08:32.630 --> 00:08:35.200
+ started, a lot of people started getting interested in Z
+
+00:08:35.200 --> 00:08:36.000
+elle Casten methods.
+
+00:08:36.000 --> 00:08:39.570
+ And ever since, we have a lot of software that were
+
+00:08:39.570 --> 00:08:43.940
+ released, including the ones we have in Orgrom. I'm going
+
+00:08:43.940 --> 00:08:47.940
+ to use Orgrom because it's the one I'm most familiar with
+
+00:08:47.940 --> 00:08:51.700
+ as a commentator, but we also have D-Notes by Prot and
+
+00:08:51.700 --> 00:08:54.000
+ other solutions as well.
+
+00:08:54.000 --> 00:08:58.310
+ And one thing that I'm currently working on, and a key area
+
+00:08:58.310 --> 00:09:02.240
+ of interest for me, is how do we use the concept of Zelle
+
+00:09:02.240 --> 00:09:06.700
+ Casten, a collection of notes. Generally, when you think of
+
+00:09:06.700 --> 00:09:10.280
+ Zelle Casten, it's a really individual collection of notes,
+
+00:09:10.280 --> 00:09:11.000
+ right?
+
+00:09:11.000 --> 00:09:14.550
+ It's something that you have, it's the stuff that you find
+
+00:09:14.550 --> 00:09:18.280
+ during your research, during the paper that you read. But
+
+00:09:18.280 --> 00:09:21.700
+ how about trying to have a slipbox for a group of people,
+
+00:09:21.700 --> 00:09:25.060
+ so that they could start sharing notes on research that
+
+00:09:25.060 --> 00:09:26.000
+ they do.
+
+00:09:26.000 --> 00:09:29.190
+ It wouldn't be the same thing as a personal slipbox, but
+
+00:09:29.190 --> 00:09:32.100
+ you can think of it as the knowledge bank for a group of
+
+00:09:32.100 --> 00:09:35.420
+ people, where they keep track of the concept that they use
+
+00:09:35.420 --> 00:09:38.810
+ within their organization, the patterns that they like to
+
+00:09:38.810 --> 00:09:41.000
+ use when they work together.
+
+00:09:41.000 --> 00:09:44.390
+ So, we actually wanted to do a talk this year on some of
+
+00:09:44.390 --> 00:09:47.960
+ those adjacent topics, but sadly, we were a little taken by
+
+00:09:47.960 --> 00:09:51.600
+ time, and you'll have to wait for next year. But I will
+
+00:09:51.600 --> 00:09:55.540
+ agree with you, Vidianos, there's a lot of very interesting
+
+00:09:55.540 --> 00:09:59.380
+ stuff abound for Zelle Casten method, and especially Zelle
+
+00:09:59.380 --> 00:10:01.000
+ Casten inside Emacs.
+
+00:10:01.000 --> 00:10:03.000
+ All right, back to you now.
+
+00:10:03.000 --> 00:10:06.850
+ Thanks for the additions, I like them as well, and I think
+
+00:10:06.850 --> 00:10:10.240
+ that what you said about collaboration, it would be very
+
+00:10:10.240 --> 00:10:12.000
+ interesting, really.
+
+00:10:12.000 --> 00:10:14.000
+ Great.
+
+00:10:14.000 --> 00:10:18.070
+ The only problem is having other people using the same
+
+00:10:18.070 --> 00:10:19.000
+ methods with you.
+
+00:10:19.000 --> 00:10:24.420
+ Sorry, Vidianos, I'm not sure if you asked me a question, I
+
+00:10:24.420 --> 00:10:29.740
+ was at a health, whispering my ear in the background at the
+
+00:10:29.740 --> 00:10:31.000
+ same time.
+
+00:10:31.000 --> 00:10:34.870
+ I just said that I really like the idea that you said about
+
+00:10:34.870 --> 00:10:36.000
+ collaboration.
+
+00:10:36.000 --> 00:10:38.830
+ Yeah, because it is really something that is missing when
+
+00:10:38.830 --> 00:10:42.200
+ you think about it. Like, the good thing about Emacs, and
+
+00:10:42.200 --> 00:10:44.900
+ the philosophy of Emacs generally, is that we have
+
+00:10:44.900 --> 00:10:48.390
+ different modes working together, and they do one thing, or
+
+00:10:48.390 --> 00:10:51.000
+ multiple things, and they do it very well.
+
+00:10:51.000 --> 00:10:54.890
+ We have org mode for editing structured documents, we have
+
+00:10:54.890 --> 00:10:58.200
+ maggots to manage repositories, we have calc to do
+
+00:10:58.200 --> 00:11:02.000
+ calculations with a polished notation and whatnot.
+
+00:11:02.000 --> 00:11:04.960
+ It feels like we have a great tool for collaboration,
+
+00:11:04.960 --> 00:11:08.050
+ editing a singular buffer, which is CRDT, which we've
+
+00:11:08.050 --> 00:11:10.000
+ already talked about before.
+
+00:11:10.000 --> 00:11:13.420
+ I'm not sure if we did have a presentation on Emacs about
+
+00:11:13.420 --> 00:11:17.130
+ CRDT. I think, if you're more interested in this, go back
+
+00:11:17.130 --> 00:11:20.410
+ to the talk I did last year with Joe Connelly and Noura El
+
+00:11:20.410 --> 00:11:24.000
+ Hassan on Emacs Research Group.
+
+00:11:24.000 --> 00:11:26.000
+ We did demonstrate what CRDT was.
+
+00:11:26.000 --> 00:11:28.890
+ So, we have a very good tool for working on a buffer, and
+
+00:11:28.890 --> 00:11:31.000
+ we have a very good way to take notes.
+
+00:11:31.000 --> 00:11:34.220
+ Why not try to combine the two tools, like Emacs is so good
+
+00:11:34.220 --> 00:11:36.660
+ at doing? We take one mode, we take another mode, we clash
+
+00:11:36.660 --> 00:11:38.580
+ them together and we do something very interesting with
+
+00:11:38.580 --> 00:11:39.000
+ them.
+
+00:11:39.000 --> 00:11:42.430
+ Well, we should probably be doing something similar with
+
+00:11:42.430 --> 00:11:46.140
+ note-taking, so that people can actually start building
+
+00:11:46.140 --> 00:11:47.000
+ notes together.
+
+00:11:47.000 --> 00:11:51.190
+ I think that would be a really key step in the future. But
+
+00:11:51.190 --> 00:11:54.330
+ anyway, I think I'm repeating myself a little bit, and I
+
+00:11:54.330 --> 00:11:57.000
+ don't want to say too much right now.
+
+00:11:57.000 --> 00:11:59.210
+ You'll see it in the future, it's coming month or coming
+
+00:11:59.210 --> 00:12:01.000
+ year, so you're not in a rush and flus.
+
+00:12:01.000 --> 00:12:03.000
+ Okay, Vityan, it's back to you now.
+
+00:12:03.000 --> 00:12:05.350
+ Okay, so how do you find a way to get a nice overview of
+
+00:12:05.350 --> 00:12:07.000
+ multiple notes to rearrange them?
+
+00:12:07.000 --> 00:12:09.790
+ Like, basically putting many small notes on another table
+
+00:12:09.790 --> 00:12:11.000
+ and rearranging them.
+
+00:12:11.000 --> 00:12:16.930
+ So, my initial idea when I tried to make Zettle Desk was to
+
+00:12:16.930 --> 00:12:20.000
+ get as close as possible to this.
+
+00:12:20.000 --> 00:12:22.800
+ Have a lot of small notes in my table and be able to
+
+00:12:22.800 --> 00:12:24.000
+ rearrange them.
+
+00:12:24.000 --> 00:12:29.000
+ Due to Org Mode being text, this is not exactly possible.
+
+00:12:29.000 --> 00:12:33.190
+ But I don't know if this question was before the third demo
+
+00:12:33.190 --> 00:12:34.000
+ or not.
+
+00:12:34.000 --> 00:12:39.870
+ What I showed in that demo, I think, to an extent, showed
+
+00:12:39.870 --> 00:12:42.000
+ what I do for rearranging.
+
+00:12:42.000 --> 00:12:47.720
+ You add all the things you want on the Zelda scratch buffer
+
+00:12:47.720 --> 00:12:50.000
+, and then rearrange them however you want.
+
+00:12:50.000 --> 00:12:56.000
+ So, that's as close as I have been able to get to that.
+
+00:12:56.000 --> 00:13:05.230
+ It's not perfect, but I think it is alright for being text,
+
+00:13:05.230 --> 00:13:11.000
+ which making it graphically would be hard, I think.
+
+00:13:11.000 --> 00:13:17.000
+ And the next one seems to be a follow-up on that question.
+
+00:13:17.000 --> 00:13:20.260
+ Yeah, it says it's difficult or impossible to do that. Yeah
+
+00:13:20.260 --> 00:13:21.000
+, I agree.
+
+00:13:21.000 --> 00:13:27.000
+ Okay.
+
+00:13:27.000 --> 00:13:33.560
+ So, this package that you say on the next one, on the next
+
+00:13:33.560 --> 00:13:39.000
+ question, I will check this link out.
+
+00:13:39.000 --> 00:13:44.840
+ It seems very interesting for writing your notes on a big
+
+00:13:44.840 --> 00:13:46.000
+ canvas.
+
+00:13:46.000 --> 00:13:50.230
+ I think it would definitely make sense for my workflow to
+
+00:13:50.230 --> 00:13:53.260
+ use something like this, if it is what I have understood
+
+00:13:53.260 --> 00:13:54.000
+ you mean it is.
+
+00:13:54.000 --> 00:13:59.000
+ I would love to try it. And we'll get back to you.
+
+00:13:59.000 --> 00:14:03.750
+ Whoever left that message, if you want to leave any contact
+
+00:14:03.750 --> 00:14:08.000
+ information or talk to me, I would love to get back to you
+
+00:14:08.000 --> 00:14:09.000
+ about this.
+
+00:14:09.000 --> 00:14:11.000
+ Because it looks very interesting.
+
+00:14:11.000 --> 00:14:14.810
+ Yes, so again, all the contact information will be
+
+00:14:14.810 --> 00:14:17.000
+ available on the talk page.
+
+00:14:17.000 --> 00:14:18.630
+ By the way, if you're worried about the lighting changes in
+
+00:14:18.630 --> 00:14:21.370
+ my place, it's just that sometimes I have a lot of light in
+
+00:14:21.370 --> 00:14:22.000
+ my face.
+
+00:14:22.000 --> 00:14:25.000
+ And then, when I'm a little tired, I do rest like this.
+
+00:14:25.000 --> 00:14:28.000
+ And it's very different, but it's still me. Don't worry
+
+00:14:28.000 --> 00:14:28.000
+ about it.
+
+00:14:28.000 --> 00:14:30.460
+ I'm not going to turn it off, because every time it's like
+
+00:14:30.460 --> 00:14:32.000
+ a flashbang going into my eyes.
+
+00:14:32.000 --> 00:14:35.240
+ So, if you want to talk to Vidyanos afterwards, maybe do
+
+00:14:35.240 --> 00:14:38.000
+ not leave your coordinates right into the pad.
+
+00:14:38.000 --> 00:14:41.000
+ Maybe get in touch with Vidyanos instead.
+
+00:14:41.000 --> 00:14:43.380
+ Those ads are going to be public eventually, and even
+
+00:14:43.380 --> 00:14:46.000
+ though we will be reviewing all the content within them,
+
+00:14:46.000 --> 00:14:49.000
+ it means that they will be open to people for a while.
+
+00:14:49.000 --> 00:14:52.000
+ So, maybe avoid putting personal information over there.
+
+00:14:52.000 --> 00:14:54.440
+ But otherwise, you'll be able to connect after the
+
+00:14:54.440 --> 00:14:57.590
+ conference relatively easily, and Vidyanos will be able to
+
+00:14:57.590 --> 00:14:58.000
+ follow up.
+
+00:14:58.000 --> 00:15:01.000
+ Or even just on the questions, whenever you have the time.
+
+00:15:01.000 --> 00:15:03.760
+ But it might take one or two weeks for the speakers to get
+
+00:15:03.760 --> 00:15:06.000
+ back to the questions you put into the pad.
+
+00:15:06.000 --> 00:15:09.000
+ We will be asking them frequently.
+
+00:15:09.000 --> 00:15:11.890
+ We do have this policy, as you know, with Emacs, of nudging
+
+00:15:11.890 --> 00:15:13.000
+ speakers to do something.
+
+00:15:13.000 --> 00:15:15.860
+ So, we will nudge speakers towards answering your questions
+
+00:15:15.860 --> 00:15:18.510
+, but it might take us about one or two weeks to get all the
+
+00:15:18.510 --> 00:15:19.000
+ answers.
+
+00:15:19.000 --> 00:15:22.000
+ I think we don't have any more questions currently.
+
+00:15:22.000 --> 00:15:24.000
+ There is one more.
+
+00:15:24.000 --> 00:15:26.000
+ Oh, there is one more. So, please take it.
+
+00:15:26.000 --> 00:15:29.800
+ Can we use Zettelkasten for coding too, especially when
+
+00:15:29.800 --> 00:15:32.000
+ using the IDs like Visual Studio and Excel?
+
+00:15:32.000 --> 00:15:38.080
+ So, I can't say for sure if you can use it, because I'm not
+
+00:15:38.080 --> 00:15:39.000
+ in coding.
+
+00:15:39.000 --> 00:15:44.000
+ The only language I know the best for coding is Emacs Lisp.
+
+00:15:44.000 --> 00:15:48.770
+ And the only other one I know is Matlab for doing
+
+00:15:48.770 --> 00:15:54.000
+ calculations, for example, for things in university.
+
+00:15:54.000 --> 00:15:59.000
+ But I think you should be able to do that.
+
+00:15:59.000 --> 00:16:03.600
+ If you look for Zettelkasten for coding, you will probably
+
+00:16:03.600 --> 00:16:06.000
+ find some resources for it.
+
+00:16:06.000 --> 00:16:14.000
+ I don't think it breaks the Zettelkasten principles.
+
+00:16:14.000 --> 00:16:21.000
+ You can make atomic nodes for coding concepts.
+
+00:16:21.000 --> 00:16:24.000
+ So, it should work, I believe.
+
+00:16:24.000 --> 00:16:26.000
+ Yeah, and I can actually confirm this.
+
+00:16:26.000 --> 00:16:31.150
+ I did share with you before in one of the previous Q&A how
+
+00:16:31.150 --> 00:16:33.390
+ we're taking notes on this little device right here to do
+
+00:16:33.390 --> 00:16:34.000
+ lead code exercises.
+
+00:16:34.000 --> 00:16:38.400
+ The thing about lead code exercises is that, well, lead
+
+00:16:38.400 --> 00:16:40.000
+ code, sorry, let's be more vague about it.
+
+00:16:40.000 --> 00:16:42.990
+ Lead code is a platform and not a free platform as well,
+
+00:16:42.990 --> 00:16:44.000
+ and I'm not advertising them.
+
+00:16:44.000 --> 00:16:46.700
+ But the concept of data structure and algorithm is really
+
+00:16:46.700 --> 00:16:48.000
+ important to programming.
+
+00:16:48.000 --> 00:16:53.260
+ And usually when you try to solve algorithmic problems, you
+
+00:16:53.260 --> 00:16:58.000
+ rely on a number of patterns that have been developed by...
+
+00:16:58.000 --> 00:17:01.260
+ Sorry, I get people telling me to my right here that, oh,
+
+00:17:01.260 --> 00:17:02.000
+ the sim is going down.
+
+00:17:02.000 --> 00:17:06.850
+ And so my stomach is falling into my body, just, oh, what
+
+00:17:06.850 --> 00:17:08.000
+ happened?
+
+00:17:08.000 --> 00:17:10.310
+ Anyway, going back to the point, we do rely on patterns and
+
+00:17:10.310 --> 00:17:13.000
+ identification of patterns within a problem.
+
+00:17:13.000 --> 00:17:17.130
+ So, as a result, it would be very much possible to create
+
+00:17:17.130 --> 00:17:20.000
+ separate nodes for all these patterns.
+
+00:17:20.000 --> 00:17:22.630
+ And you can have different exercises and say you have an
+
+00:17:22.630 --> 00:17:25.000
+ exercise that is using two different things.
+
+00:17:25.000 --> 00:17:29.000
+ It's using a tree pattern and it's using a depth search.
+
+00:17:29.000 --> 00:17:31.640
+ If neither of those two words make any sense to you, do not
+
+00:17:31.640 --> 00:17:35.100
+ worry and be grateful because this will haunt you at night
+
+00:17:35.100 --> 00:17:36.000
+ otherwise.
+
+00:17:36.000 --> 00:17:38.730
+ But it would be very, I think it would be a prime candidate
+
+00:17:38.730 --> 00:17:42.000
+ really for atomization and linking within a Zettelkasten.
+
+00:17:42.000 --> 00:17:44.780
+ Because it would make it so much easier to structure your
+
+00:17:44.780 --> 00:17:47.730
+ knowledge in a way that is organic rather than hierarchical
+
+00:17:47.730 --> 00:17:48.000
+.
+
+00:17:48.000 --> 00:17:52.030
+ So, yeah, this was a very good question and I'd be happy to
+
+00:17:52.030 --> 00:17:56.390
+ encourage the asker to try it on their own and maybe make a
+
+00:17:56.390 --> 00:17:58.000
+ presentation next year at the next EMACS Conf.
+
+00:17:58.000 --> 00:18:01.210
+ Vidyanos, before we continue, I just want to give up the
+
+00:18:01.210 --> 00:18:02.000
+ heads up.
+
+00:18:02.000 --> 00:18:05.230
+ So, we have opened the room currently. If you want to join
+
+00:18:05.230 --> 00:18:10.000
+ the room with Vidyanos, we have posted the link on ISC.
+
+00:18:10.000 --> 00:18:12.400
+ And if you go to the talk page of Vidyanos talk, you will
+
+00:18:12.400 --> 00:18:14.000
+ be able to join the room as well.
+
+00:18:14.000 --> 00:18:16.650
+ We did have quite a number of questions. So, feel free to
+
+00:18:16.650 --> 00:18:17.000
+ join.
+
+00:18:17.000 --> 00:18:19.530
+ In about four minutes, we'll need to move on to the next
+
+00:18:19.530 --> 00:18:20.000
+ talk.
+
+00:18:20.000 --> 00:18:23.000
+ But, well, actually, I give you about three more minutes.
+
+00:18:23.000 --> 00:18:26.000
+ Do we have any more questions on the pad, Vidyanos?
+
+00:18:26.000 --> 00:18:29.000
+ On the pad, no. I'm looking on IRC.
+
+00:18:29.000 --> 00:18:34.000
+ Someone says if Zeldas.dl will be available in Melpa.
+
+00:18:34.000 --> 00:18:39.000
+ It is on Melpa right now. You can find it.
+
+00:18:39.000 --> 00:18:44.390
+ Right. And you just have to -- sorry, my voice is getting
+
+00:18:44.390 --> 00:18:45.000
+ raspier.
+
+00:18:45.000 --> 00:18:47.680
+ It's only the first day of EMACS Conf. It's not even lunch
+
+00:18:47.680 --> 00:18:49.000
+ and I'm already losing my voice.
+
+00:18:49.000 --> 00:18:51.000
+ This is not booting well for the rest.
+
+00:18:51.000 --> 00:18:54.100
+ But, yeah, you should be able to find it pretty easily by
+
+00:18:54.100 --> 00:19:00.080
+ looking on doc.go for Melpa and space and zeldacaster.el,
+
+00:19:00.080 --> 00:19:01.000
+ the name of the package.
+
+00:19:01.000 --> 00:19:03.000
+ You'll be able to find it. And we can put it on the page.
+
+00:19:03.000 --> 00:19:04.600
+ I'm pretty sure it's already on your talk page, Vidyanos,
+
+00:19:04.600 --> 00:19:05.000
+ as well.
+
+00:19:05.000 --> 00:19:07.000
+ Yeah, it is on the talk page.
+
+00:19:07.000 --> 00:19:09.000
+ Yeah, you'll be able to find it really quickly.
+
+00:19:09.000 --> 00:19:11.000
+ So we have about two more minutes.
+
+00:19:11.000 --> 00:19:12.670
+ Did you see any other question that you'd like to answer as
+
+00:19:12.670 --> 00:19:13.000
+ well?
+
+00:19:13.000 --> 00:19:17.800
+ I'm scrolling on IRC since the talk started to see if there
+
+00:19:17.800 --> 00:19:19.000
+ is anything else.
+
+00:19:19.000 --> 00:19:21.000
+ I don't see anything else.
+
+00:19:21.000 --> 00:19:28.000
+ If anyone has a room here, I would love to continue.
+
+00:19:28.000 --> 00:19:33.000
+ If not, then I think we've already answered enough things.
+
+00:19:33.000 --> 00:19:38.000
+ Sure, I would concur. You have covered a lot of ground.
+
+00:19:38.000 --> 00:19:41.240
+ I am personally happy to be seeing so many talks about Zeld
+
+00:19:41.240 --> 00:19:42.000
+acaster.
+
+00:19:42.000 --> 00:19:44.430
+ It feels like I was a little bit of a forerunner at EMACS
+
+00:19:44.430 --> 00:19:46.000
+ Conf talking about Zeldacaster.
+
+00:19:46.000 --> 00:19:48.450
+ And now, we are two years later and we're still talking
+
+00:19:48.450 --> 00:19:49.000
+ about it.
+
+00:19:49.000 --> 00:19:51.170
+ I know a lot of people are getting a little tired of
+
+00:19:51.170 --> 00:19:53.000
+ hearing about Zeldacaster all the time.
+
+00:19:53.000 --> 00:19:59.050
+ But if you part all the communication, if you focus on what
+
+00:19:59.050 --> 00:20:00.000
+ it actually does,
+
+00:20:00.000 --> 00:20:03.000
+ and I keep saying it's just notes and it's just links,
+
+00:20:03.000 --> 00:20:05.000
+ it's actually quite amazing what you can do with it.
+
+00:20:05.000 --> 00:20:07.000
+ It's just a mental model, really.
+
+00:20:07.000 --> 00:20:11.690
+ So I would kind of use the, you know, sorry for the voxing
+
+00:20:11.690 --> 00:20:12.000
+ here.
+
+00:20:12.000 --> 00:20:16.460
+ But if you have been interested in Zeldacaster at some
+
+00:20:16.460 --> 00:20:17.000
+ point,
+
+00:20:17.000 --> 00:20:20.000
+ or if you are frustrated by all the talk about Zeldacaster,
+
+00:20:20.000 --> 00:20:22.000
+ that seems to be kind of like a cult at some point,
+
+00:20:22.000 --> 00:20:27.460
+ well, I would encourage you maybe to try, not necessarily
+
+00:20:27.460 --> 00:20:28.000
+ try it for yourself,
+
+00:20:28.000 --> 00:20:31.000
+ but try to understand really the simple stuff behind it.
+
+00:20:31.000 --> 00:20:34.340
+ Because honestly, there's nothing very revolutionary about
+
+00:20:34.340 --> 00:20:36.000
+ this note-taking method.
+
+00:20:36.000 --> 00:20:39.370
+ It's just that it used to be done with paper, and now it's
+
+00:20:39.370 --> 00:20:40.000
+ done with computers,
+
+00:20:40.000 --> 00:20:42.000
+ and it makes it a little more easier.
+
+00:20:42.000 --> 00:20:45.500
+ Personally, what I find the most helpful in this type of
+
+00:20:45.500 --> 00:20:48.000
+ note-taking is how organic everything feels.
+
+00:20:48.000 --> 00:20:50.650
+ You do not need to be thinking about the structure from the
+
+00:20:50.650 --> 00:20:51.000
+ get-go,
+
+00:20:51.000 --> 00:20:53.000
+ and this is extremely freeing.
+
+00:20:53.000 --> 00:20:56.000
+ OK, Vidyanos, we are about out of time.
+
+00:20:56.000 --> 00:20:58.240
+ Thank you so much for taking the time to answer the
+
+00:20:58.240 --> 00:20:59.000
+ questions.
+
+00:20:59.000 --> 00:21:01.690
+ We will be in touch in the future, and we'll be looking
+
+00:21:01.690 --> 00:21:04.000
+ forward to having more presentations about Zeldacaster,
+
+00:21:04.000 --> 00:21:08.000
+ and perhaps maybe one by you in the future.
+
+00:21:08.000 --> 00:21:11.000
+ So, well, thank you so much.
+
+00:21:11.000 --> 00:21:13.470
+ And, Vidyanos, I don't see anyone in the room, so feel free
+
+00:21:13.470 --> 00:21:15.000
+ to leave the room after we're done.
+
+00:21:15.000 --> 00:21:18.410
+ So in about one minute, we're going to go with the next
+
+00:21:18.410 --> 00:21:19.000
+ talk.
+
+00:21:19.000 --> 00:21:23.000
+ We might go a little bit quiet until the top of the minute.
+
+00:21:23.000 --> 00:21:26.000
+ I need to drink, and I need to rest my voice.
+
+00:21:26.000 --> 00:21:28.000
+ But in one minute, we'll be starting the next talk.
+
+00:21:28.000 --> 00:21:30.000
+ Vidyanos, thank you so much, and see you next time.
+
+00:21:30.000 --> 00:21:32.000
+ Bye.
+
+00:21:32.000 --> 00:21:35.000
+ (Break)
+
+00:21:37.000 --> 00:21:37.000
+
+
+00:21:37.000 --> 00:21:40.000
+ (Break)
+
+00:21:42.000 --> 00:21:42.000
+
+
+00:21:42.000 --> 00:21:45.000
+ (Break)
+
+00:21:47.000 --> 00:21:47.000
+
+
+00:21:47.000 --> 00:21:50.000
+ (Break)
+
+00:21:50.000 --> 00:21:53.000
+ (Break)
+
+00:21:55.000 --> 00:21:55.000
+
+
+00:21:55.000 --> 00:21:58.000
+ (Break)
+
+00:22:00.000 --> 00:22:00.000
+
+
+00:22:00.000 --> 00:22:03.000
+ (Break)
+
diff --git a/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main--chapters.vtt b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main--chapters.vtt
new file mode 100644
index 00000000..2fa99c0c
--- /dev/null
+++ b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main--chapters.vtt
@@ -0,0 +1,55 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:28.320
+My second brain
+
+00:00:28.320 --> 00:01:40.560
+Contents of the talk
+
+00:01:40.560 --> 00:02:35.200
+Bibliography management
+
+00:02:35.200 --> 00:03:04.960
+Creating literature notes: ivy-bibtex-edit-notes
+
+00:03:04.960 --> 00:04:40.160
+org-roam reference template
+
+00:04:40.160 --> 00:05:40.840
+Demo
+
+00:05:40.840 --> 00:06:44.240
+Annotating with org-noter
+
+00:06:44.240 --> 00:07:02.120
+Annotating in English
+
+00:07:02.120 --> 00:07:30.200
+Afterthoughts on an article
+
+00:07:30.200 --> 00:08:21.480
+Adding a note
+
+00:08:21.480 --> 00:09:01.680
+Creating permanent notes from reference material
+
+00:09:01.680 --> 00:09:21.520
+The organization problem
+
+00:09:21.520 --> 00:10:43.600
+zetteldesk.el
+
+00:10:43.600 --> 00:11:45.040
+The zetteldesk-desktop
+
+00:11:45.040 --> 00:12:09.840
+Filtering with ivy-bibtex
+
+00:12:09.840 --> 00:13:46.200
+Inserting literature
+
+00:13:46.200 --> 00:15:19.160
+Composing the final article
+
+00:15:19.160 --> 00:16:44.480
+Thanks
diff --git a/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.vtt b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.vtt
new file mode 100644
index 00000000..6b098ba9
--- /dev/null
+++ b/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.vtt
@@ -0,0 +1,1153 @@
+WEBVTT captioned by hannah
+
+00:00:00.000 --> 00:00:02.039
+Hello everyone, I'm Vidianos.
+
+00:00:02.040 --> 00:00:03.079
+Today I'm going to show you
+
+00:00:03.080 --> 00:00:04.079
+how I write and organize
+
+00:00:04.080 --> 00:00:06.439
+my literature notes using Emacs.
+
+00:00:06.440 --> 00:00:08.719
+I take my notes using Zettelkasten,
+
+00:00:08.720 --> 00:00:11.079
+which you may or may not have heard.
+
+00:00:11.080 --> 00:00:13.839
+It is about taking small atomic notes
+
+00:00:13.840 --> 00:00:14.999
+and linking them one another
+
+00:00:15.000 --> 00:00:17.599
+to create your so-called second brain.
+
+00:00:17.600 --> 00:00:19.159
+Here is mine.
+
+00:00:19.160 --> 00:00:20.719
+This is a graph of all the notes
+
+00:00:20.720 --> 00:00:22.879
+I have accumulated the last few years.
+
+00:00:22.880 --> 00:00:25.199
+It has various types of notes,
+
+00:00:25.200 --> 00:00:25.959
+but we're mainly going to focus on
+
+00:00:25.960 --> 00:00:28.319
+literature notes today.
+
+00:00:28.320 --> 00:00:29.639
+Here are the contents of my talk.
+
+00:00:29.640 --> 00:00:30.439
+We're going to start
+
+00:00:30.440 --> 00:00:31.919
+with bibliography management,
+
+00:00:31.920 --> 00:00:33.319
+which is how I take bibliography
+
+00:00:33.320 --> 00:00:35.959
+from the web and import it to Emacs.
+
+00:00:35.960 --> 00:00:37.079
+Then we're going to talk about
+
+00:00:37.080 --> 00:00:38.879
+how I create literature notes
+
+00:00:38.880 --> 00:00:42.759
+using a custom org-roam-bibtex template I have.
+
+00:00:42.760 --> 00:00:43.919
+And after talking about that,
+
+00:00:43.920 --> 00:00:46.359
+we can talk about how I write literature notes,
+
+00:00:46.360 --> 00:00:48.239
+which is through annotating an article
+
+00:00:48.240 --> 00:00:51.319
+using org-noter. Org-noter is a package
+
+00:00:51.320 --> 00:00:53.439
+that allows you to annotate PDFs
+
+00:00:53.440 --> 00:00:54.999
+using the Org format
+
+00:00:55.000 --> 00:00:59.559
+and creates a supplementary Org file to your PDF.
+
+00:00:59.560 --> 00:01:00.879
+Then we're going to talk about
+
+00:01:00.880 --> 00:01:03.519
+adding the literature to your Zettelkasten,
+
+00:01:03.520 --> 00:01:06.279
+which is a simple but important topic,
+
+00:01:06.280 --> 00:01:08.599
+and how you can write permanent notes
+
+00:01:08.600 --> 00:01:11.719
+based on the info you obtain from this literature.
+
+00:01:11.720 --> 00:01:13.319
+Lastly, we're going to focus on
+
+00:01:13.320 --> 00:01:14.999
+the organization problem
+
+00:01:15.000 --> 00:01:17.719
+one might find when having a lot of literature
+
+00:01:17.720 --> 00:01:21.439
+for an assignment or an article or something,
+
+00:01:21.440 --> 00:01:22.959
+and how I have tried to solve this
+
+00:01:22.960 --> 00:01:24.839
+with my package Zetteldesk.
+
+00:01:24.840 --> 00:01:26.359
+This isn't the perfect solution,
+
+00:01:26.360 --> 00:01:29.799
+but it is what I have, and I really like it.
+
+00:01:29.800 --> 00:01:30.839
+Finally, we're going to talk about
+
+00:01:30.840 --> 00:01:33.559
+how to compose the final article
+
+00:01:33.560 --> 00:01:35.199
+that you want to produce
+
+00:01:35.200 --> 00:01:36.799
+using this literature
+
+00:01:36.800 --> 00:01:38.639
+with the technique described
+
+00:01:38.640 --> 00:01:40.559
+in the rest of this talk.
+
+00:01:40.560 --> 00:01:42.239
+So let's begin the talk
+
+00:01:42.240 --> 00:01:44.239
+with bibliography management.
+
+00:01:44.240 --> 00:01:47.239
+Zotero is the bibliography manager I use.
+
+00:01:47.240 --> 00:01:49.399
+It is very simple to store articles with it,
+
+00:01:49.400 --> 00:01:50.679
+and it exports to .bib,
+
+00:01:50.680 --> 00:01:52.079
+integrating with packages
+
+00:01:52.080 --> 00:01:54.959
+such as org-roam-bibtex and ivy-bibtex.
+
+00:01:54.960 --> 00:01:56.679
+When researching, I typically find
+
+00:01:56.680 --> 00:02:00.039
+a long list of articles from a search engine.
+
+00:02:00.040 --> 00:02:03.439
+I open the titles which have interesting titles
+
+00:02:03.440 --> 00:02:05.039
+through their abstracts
+
+00:02:05.040 --> 00:02:07.799
+and save to Zotero those whose abstracts
+
+00:02:07.800 --> 00:02:10.319
+are the most relevant to what I want.
+
+00:02:10.320 --> 00:02:11.799
+From these articles,
+
+00:02:11.800 --> 00:02:13.359
+I typically won't read all of them
+
+00:02:13.360 --> 00:02:14.519
+because they're a lot,
+
+00:02:14.520 --> 00:02:17.759
+but I will select a few,
+
+00:02:17.760 --> 00:02:21.639
+once I have collected as many as I want.
+
+00:02:21.640 --> 00:02:24.079
+Zotero acts as a way to store everything
+
+00:02:24.080 --> 00:02:25.479
+that might be interesting,
+
+00:02:25.480 --> 00:02:28.519
+while Emacs and my Zettelkasten
+
+00:02:28.520 --> 00:02:30.959
+stores everything that is definitely interesting,
+
+00:02:30.960 --> 00:02:35.199
+and I have read it already.
+
+00:02:35.200 --> 00:02:36.359
+And then we can move to
+
+00:02:36.360 --> 00:02:38.559
+how I create literature notes.
+
+00:02:38.560 --> 00:02:41.119
+I set the default action of ivy-bibtex
+
+00:02:41.120 --> 00:02:43.599
+to ivy-bibtex-edit-notes,
+
+00:02:43.600 --> 00:02:44.919
+which will prompt-- which
+
+00:02:44.920 --> 00:02:46.479
+with org-roam-bibtex-mode active,
+
+00:02:46.480 --> 00:02:48.839
+prompts you for an org-capture template
+
+00:02:48.840 --> 00:02:50.799
+when selecting something
+
+00:02:50.800 --> 00:02:52.319
+if the node doesn't exist,
+
+00:02:52.320 --> 00:02:54.959
+or takes you to the existing node.
+
+00:02:54.960 --> 00:02:58.439
+And obviously you need to have this here,
+
+00:02:58.440 --> 00:03:00.799
+to set the default action
+
+00:03:00.800 --> 00:03:02.599
+that was already there
+
+00:03:02.600 --> 00:03:04.959
+to a letter.
+
+00:03:04.960 --> 00:03:08.039
+Then we can move to my org-roam reference template,
+
+00:03:08.040 --> 00:03:11.159
+using org-roam-bibtex.
+
+00:03:11.160 --> 00:03:12.439
+This isn't so complicated,
+
+00:03:12.440 --> 00:03:14.119
+but it has some important stuff
+
+00:03:14.120 --> 00:03:14.879
+I want to highlight.
+
+00:03:14.880 --> 00:03:17.399
+Save it to the ref directory,
+
+00:03:17.400 --> 00:03:19.719
+so I can remember where it is,
+
+00:03:19.720 --> 00:03:23.559
+and it's classified as a literature note.
+
+00:03:23.560 --> 00:03:25.119
+The file name is the cite key,
+
+00:03:25.120 --> 00:03:27.759
+which is easy and small,
+
+00:03:27.760 --> 00:03:30.079
+but the title is the actual article's title.
+
+00:03:30.080 --> 00:03:32.319
+Give it a tag of the entry-type;
+
+00:03:32.320 --> 00:03:35.039
+this is typically "article,"
+
+00:03:35.040 --> 00:03:37.479
+but it's easy to sort things this way
+
+00:03:37.480 --> 00:03:41.399
+because not all literature notes are articles.
+
+00:03:41.400 --> 00:03:43.159
+And then give the keywords
+
+00:03:43.160 --> 00:03:47.359
+that are given by Zotero, because why not?
+
+00:03:47.360 --> 00:03:51.479
+Tags here are tags from Zettelkasten.
+
+00:03:51.480 --> 00:03:53.639
+These are the links to
+
+00:03:53.640 --> 00:03:55.359
+other files which are relevant,
+
+00:03:55.360 --> 00:03:58.079
+but its initialization is empty, obviously.
+
+00:03:58.080 --> 00:03:59.839
+And then this heading is where
+
+00:03:59.840 --> 00:04:00.839
+all the magic happens.
+
+00:04:00.840 --> 00:04:04.719
+The name is just not really so relevant;
+
+00:04:04.720 --> 00:04:07.559
+I just needed something that made sense.
+
+00:04:07.560 --> 00:04:10.399
+The properties are what matters,
+
+00:04:10.400 --> 00:04:12.239
+and mainly this one here.
+
+00:04:12.240 --> 00:04:18.879
+The ${file} attribute finds
+
+00:04:18.880 --> 00:04:24.799
+the file of this specific literature
+
+00:04:24.800 --> 00:04:27.519
+and makes sure that org-noter works
+
+00:04:27.520 --> 00:04:29.639
+by default here.
+
+00:04:29.640 --> 00:04:32.559
+As I'm going to show you in a moment,
+
+00:04:32.560 --> 00:04:34.599
+this way [of] initializing the literature note,
+
+00:04:34.600 --> 00:04:36.999
+org-noter works by default.
+
+00:04:37.000 --> 00:04:40.159
+That's all, basically, for the template.
+
+00:04:40.160 --> 00:04:42.759
+This is the point of the talk
+
+00:04:42.760 --> 00:04:44.039
+where we reach the first demo.
+
+00:04:44.040 --> 00:04:47.079
+This is about opening ivy-bibtex,
+
+00:04:47.080 --> 00:04:50.239
+selecting an article I want to annotate,
+
+00:04:50.240 --> 00:04:52.999
+initializing the literature note.
+
+00:04:53.000 --> 00:04:54.999
+We can see that everything
+
+00:04:55.000 --> 00:04:56.479
+is inserted in for me,
+
+00:04:56.480 --> 00:05:01.079
+and if I open org-noter on this heading,
+
+00:05:01.080 --> 00:05:03.759
+it opens the article, as expected.
+
+00:05:03.760 --> 00:05:06.199
+I can read the article,
+
+00:05:06.200 --> 00:05:08.439
+I can say I want to
+
+00:05:08.440 --> 00:05:10.720
+annotate something here.
+
+00:05:20.720 --> 00:05:24.119
+Obviously, annotation is not that simple as here,
+
+00:05:24.120 --> 00:05:26.479
+but I don't really have the time
+
+00:05:26.480 --> 00:05:28.599
+to actually annotate an article live.
+
+00:05:28.600 --> 00:05:34.039
+But you can keep going, and it's a good setup.
+
+00:05:34.040 --> 00:05:39.879
+Then close org-noter,
+
+00:05:39.880 --> 00:05:40.839
+and let's go presentation again.
+
+00:05:40.840 --> 00:05:44.359
+Moving on, this section is some stuff
+
+00:05:44.360 --> 00:05:45.799
+about my annotation process.
+
+00:05:45.800 --> 00:05:49.479
+As I said, there is not enough time for me
+
+00:05:49.480 --> 00:05:51.119
+to actually annotate an article live,
+
+00:05:51.120 --> 00:05:52.999
+but here are some things about it.
+
+00:05:53.000 --> 00:05:55.479
+First, is that I annotate with org-noter,
+
+00:05:55.480 --> 00:05:56.719
+which I absolutely love.
+
+00:05:56.720 --> 00:05:59.599
+It is great for annotations
+
+00:05:59.600 --> 00:06:02.519
+because you do them in org,
+
+00:06:02.520 --> 00:06:03.879
+which is an amazing format
+
+00:06:03.880 --> 00:06:05.879
+and gives you a lot of flexibility,
+
+00:06:05.880 --> 00:06:07.839
+such as adding to the Zettelkasten,
+
+00:06:07.840 --> 00:06:11.319
+being initialized by a capture template,
+
+00:06:11.320 --> 00:06:13.119
+and other things.
+
+00:06:13.120 --> 00:06:15.959
+But also, you don't need to look for
+
+00:06:15.960 --> 00:06:17.359
+the notes inside the PDF,
+
+00:06:17.360 --> 00:06:19.519
+which is a problem you can have
+
+00:06:19.520 --> 00:06:20.959
+if you annotate on the PDF,
+
+00:06:20.960 --> 00:06:23.079
+and it is very annoying in my opinion.
+
+00:06:23.080 --> 00:06:26.439
+So I prefer having these notes,
+
+00:06:26.440 --> 00:06:27.879
+and I can only focus on them,
+
+00:06:27.880 --> 00:06:29.759
+but I can also see where they refer.
+
+00:06:29.760 --> 00:06:33.199
+The other scenarios are not so good.
+
+00:06:33.200 --> 00:06:35.519
+Annotating on the PDF,
+
+00:06:35.520 --> 00:06:36.479
+you search for it,
+
+00:06:36.480 --> 00:06:41.199
+and if you don't know which section it refers to,
+
+00:06:41.200 --> 00:06:42.759
+then you need to look about it,
+
+00:06:42.760 --> 00:06:44.239
+and that is very tiring.
+
+00:06:44.240 --> 00:06:48.359
+Also, I am always annotating in English.
+
+00:06:48.360 --> 00:06:50.199
+This is not my mother tongue,
+
+00:06:50.200 --> 00:06:52.039
+but it helps me avoid
+
+00:06:52.040 --> 00:06:53.679
+the necessary mental overhead
+
+00:06:53.680 --> 00:06:55.199
+of translating while reading.
+
+00:06:55.200 --> 00:06:57.559
+I want to pay attention to what I read
+
+00:06:57.560 --> 00:06:59.679
+and not to translate stuff.
+
+00:06:59.680 --> 00:07:02.119
+I will translate later.
+
+00:07:02.120 --> 00:07:05.039
+And when finishing an article,
+
+00:07:05.040 --> 00:07:07.719
+I write a mini-abstract myself,
+
+00:07:07.720 --> 00:07:10.119
+which contains what I think about the article.
+
+00:07:10.120 --> 00:07:11.639
+It doesn't need to be much,
+
+00:07:11.640 --> 00:07:13.999
+it's usually like 3 or 4 paragraphs,
+
+00:07:14.000 --> 00:07:18.319
+and it shows things that are useful in the article,
+
+00:07:18.320 --> 00:07:21.159
+and what is mentioned that matters to me.
+
+00:07:21.160 --> 00:07:22.599
+So I can look back at it,
+
+00:07:22.600 --> 00:07:24.919
+and it is very easy for me to find
+
+00:07:24.920 --> 00:07:26.599
+what I got from this article,
+
+00:07:26.600 --> 00:07:30.199
+so where I will cite it on my actual project.
+
+00:07:30.200 --> 00:07:33.879
+Then last thing you need to do
+
+00:07:33.880 --> 00:07:35.479
+is add a note to your Zettelkasten.
+
+00:07:35.480 --> 00:07:38.039
+This is very easy due to it being in an org format.
+
+00:07:38.040 --> 00:07:41.799
+You can just have it in the org-roam directory,
+
+00:07:41.800 --> 00:07:43.639
+which it automatically goes to,
+
+00:07:43.640 --> 00:07:46.559
+and link it to other relevant notes,
+
+00:07:46.560 --> 00:07:48.519
+which is its index
+
+00:07:48.520 --> 00:07:50.559
+because everything in my Zettelkasten
+
+00:07:50.560 --> 00:07:51.719
+(at least) has an index,
+
+00:07:51.720 --> 00:07:54.519
+but also every other permanent note
+
+00:07:54.520 --> 00:07:56.759
+whose contents are in one way or another
+
+00:07:56.760 --> 00:07:58.079
+mentioned inside the article.
+
+00:07:58.080 --> 00:08:00.359
+This way the article is in a network with notes
+
+00:08:00.360 --> 00:08:02.039
+that are similar to it.
+
+00:08:02.040 --> 00:08:05.359
+Then we move on to the second demo,
+
+00:08:05.360 --> 00:08:08.039
+which is about a full-fledged literature note.
+
+00:08:08.040 --> 00:08:11.119
+We can go on org-roam-node-find,
+
+00:08:11.120 --> 00:08:13.159
+search for references,
+
+00:08:13.160 --> 00:08:15.559
+go to this, and you can see
+
+00:08:15.560 --> 00:08:17.759
+it is linked to other notes.
+
+00:08:17.760 --> 00:08:20.039
+And here is the mini-abstract,
+
+00:08:20.040 --> 00:08:21.479
+and here are my notes on it.
+
+00:08:21.480 --> 00:08:27.519
+The last thing you need to do
+
+00:08:27.520 --> 00:08:29.119
+when creating a literature note,
+
+00:08:29.120 --> 00:08:31.319
+is obviously create permanent notes
+
+00:08:31.320 --> 00:08:32.279
+based on what you read.
+
+00:08:32.280 --> 00:08:35.679
+If you never create these literature notes,
+
+00:08:35.680 --> 00:08:37.679
+you will never get new information.
+
+00:08:37.680 --> 00:08:40.439
+So for your Zettelkasten to grow,
+
+00:08:40.440 --> 00:08:42.359
+you need to create such notes.
+
+00:08:42.360 --> 00:08:45.879
+This means that the subject you are researching
+
+00:08:45.880 --> 00:08:47.799
+is not just literature notes
+
+00:08:47.800 --> 00:08:50.279
+but has well-structured permanent notes,
+
+00:08:50.280 --> 00:08:52.799
+which is what you will actually read.
+
+00:08:52.800 --> 00:08:55.159
+You typically only read literature notes
+
+00:08:55.160 --> 00:08:57.159
+to see what gets cited where.
+
+00:08:57.160 --> 00:08:58.759
+What you will mostly read
+
+00:08:58.760 --> 00:08:59.839
+is these permanent notes
+
+00:08:59.840 --> 00:09:01.679
+that you create from this knowledge.
+
+00:09:01.680 --> 00:09:05.239
+So finally we are at the last part of the talk,
+
+00:09:05.240 --> 00:09:07.359
+which is about organizing literature notes.
+
+00:09:07.360 --> 00:09:09.559
+And this is in my opinion
+
+00:09:09.560 --> 00:09:10.879
+the most interesting part
+
+00:09:10.880 --> 00:09:12.199
+because it is very unique.
+
+00:09:12.200 --> 00:09:14.719
+It uses a package I wrote myself,
+
+00:09:14.720 --> 00:09:18.319
+and it doesn't have as much usage
+
+00:09:18.320 --> 00:09:21.519
+as the rest of the things I described so far.
+
+00:09:21.520 --> 00:09:24.799
+So what is the problem you might find?
+
+00:09:24.800 --> 00:09:27.959
+Indeed, if you read a lot of things,
+
+00:09:27.960 --> 00:09:30.959
+you have a large collection of notes,
+
+00:09:30.960 --> 00:09:33.919
+and it's not the only thing you will think about.
+
+00:09:33.920 --> 00:09:36.079
+However, you do need to
+
+00:09:36.080 --> 00:09:37.799
+justify everything with citations,
+
+00:09:37.800 --> 00:09:39.879
+so you need to remember everything
+
+00:09:39.880 --> 00:09:41.119
+you read in these notes.
+
+00:09:41.120 --> 00:09:43.519
+You have done a lot of work,
+
+00:09:43.520 --> 00:09:45.919
+but there is still a lot for you
+
+00:09:45.920 --> 00:09:47.319
+to reach your final manuscript.
+
+00:09:47.320 --> 00:09:50.359
+Except if there was a handy little way
+
+00:09:50.360 --> 00:09:52.879
+to combine everything
+
+00:09:52.880 --> 00:09:55.879
+and sort it in a very easy way.
+
+00:09:55.880 --> 00:09:56.959
+Well, there is,
+
+00:09:56.960 --> 00:10:00.119
+and I think it came out pretty well.
+
+00:10:00.120 --> 00:10:01.799
+It's zetteldesk.el.
+
+00:10:01.800 --> 00:10:05.039
+It was inspired by this quote here
+
+00:10:05.040 --> 00:10:06.479
+from How to Take Smart Notes.
+
+00:10:06.480 --> 00:10:09.799
+Sönke Ahrens here talked about a desktop,
+
+00:10:09.800 --> 00:10:13.079
+which you have all the literature
+
+00:10:13.080 --> 00:10:16.239
+you want in that desktop,
+
+00:10:16.240 --> 00:10:20.079
+and you try to bring it in order.
+
+00:10:20.080 --> 00:10:22.599
+And by doing that,
+
+00:10:22.600 --> 00:10:24.839
+you can improve your ideas
+
+00:10:24.840 --> 00:10:27.519
+and have a structure
+
+00:10:27.520 --> 00:10:30.919
+so that your manuscript will then be
+
+00:10:30.920 --> 00:10:33.879
+very, very easy to write.
+
+00:10:33.880 --> 00:10:36.279
+And as I say here, in trying to do this,
+
+00:10:36.280 --> 00:10:38.919
+I made something much more general
+
+00:10:38.920 --> 00:10:41.559
+than it needed to be, so yeah,
+
+00:10:41.560 --> 00:10:43.599
+you can use it for many other things.
+
+00:10:43.600 --> 00:10:46.959
+But before I show you some things about it,
+
+00:10:46.960 --> 00:10:49.879
+I want to introduce you to what a desktop is.
+
+00:10:49.880 --> 00:10:53.159
+It's essentially a collection of the knowledge
+
+00:10:53.160 --> 00:10:54.839
+you want to be able to see.
+
+00:10:54.840 --> 00:10:57.999
+You add things to your Zetteldesk,
+
+00:10:58.000 --> 00:11:01.679
+and using filter functions,
+
+00:11:01.680 --> 00:11:04.919
+you only see these notes and nothing else,
+
+00:11:04.920 --> 00:11:07.359
+which in my opinion is very handy.
+
+00:11:07.360 --> 00:11:10.319
+So having said that,
+
+00:11:10.320 --> 00:11:12.479
+we can see these things in action
+
+00:11:12.480 --> 00:11:14.399
+for the final demo of the talk.
+
+00:11:14.400 --> 00:11:15.839
+This is the third one.
+
+00:11:15.840 --> 00:11:20.879
+I will go to an index file of mine.
+
+00:11:20.880 --> 00:11:21.959
+This is 3D printing,
+
+00:11:21.960 --> 00:11:23.479
+an assignment I had last semester.
+
+00:11:23.480 --> 00:11:27.039
+And this has 28 backlinks,
+
+00:11:27.040 --> 00:11:30.399
+so a lot of things that I looked at
+
+00:11:30.400 --> 00:11:31.799
+for this assignment.
+
+00:11:31.800 --> 00:11:33.519
+I can say I want to add
+
+00:11:33.520 --> 00:11:35.799
+the current note's backlinks to the Zetteldesk,
+
+00:11:35.800 --> 00:11:38.239
+and now I have a filtered version
+
+00:11:38.240 --> 00:11:40.119
+of org-roam-node-find defined,
+
+00:11:40.120 --> 00:11:41.999
+which only lists these 29 notes.
+
+00:11:42.000 --> 00:11:45.039
+Very nice, right?
+
+00:11:45.040 --> 00:11:49.159
+I can also filter just the literature notes,
+
+00:11:49.160 --> 00:11:55.999
+which can also use other UIs beside org-roam,
+
+00:11:56.000 --> 00:11:57.439
+such as, for example,
+
+00:11:57.440 --> 00:12:00.039
+one I use a lot is the ivy-bibtex command.
+
+00:12:00.040 --> 00:12:03.239
+This takes a lot of time,
+
+00:12:03.240 --> 00:12:04.599
+much longer than the org-roam one,
+
+00:12:04.600 --> 00:12:06.479
+but has them in this UI,
+
+00:12:06.480 --> 00:12:09.839
+which in a lot of cases is more useful for me.
+
+00:12:09.840 --> 00:12:15.719
+The other very important thing is inserting these.
+
+00:12:15.720 --> 00:12:19.999
+For example, say I want to insert a permanent note,
+
+00:12:20.000 --> 00:12:21.759
+such as this.
+
+00:12:21.760 --> 00:12:25.399
+Its title will become a top-level heading,
+
+00:12:25.400 --> 00:12:29.319
+and everything else will be inserted as expected.
+
+00:12:29.320 --> 00:12:35.399
+But the most important thing for us
+
+00:12:35.400 --> 00:12:37.159
+is inserting literature, right?
+
+00:12:37.160 --> 00:12:39.519
+This is done with this command,
+
+00:12:39.520 --> 00:12:42.719
+and let's say I want to insert this.
+
+00:12:42.720 --> 00:12:48.239
+The title again becomes a heading,
+
+00:12:48.240 --> 00:12:50.839
+and this is the article title also.
+
+00:12:50.840 --> 00:12:53.039
+I store the cite key here,
+
+00:12:53.040 --> 00:12:56.319
+and everything else about it is also here.
+
+00:12:56.320 --> 00:12:58.239
+And I can add others,
+
+00:12:58.240 --> 00:13:01.199
+for example, this and this.
+
+00:13:01.200 --> 00:13:09.039
+And we have all of them here.
+
+00:13:09.040 --> 00:13:11.279
+I see it says this is the basic,
+
+00:13:11.280 --> 00:13:12.799
+so let's put it at the top.
+
+00:13:12.800 --> 00:13:18.839
+And then maybe I want to put this last.
+
+00:13:18.840 --> 00:13:24.159
+And this way, you can sort things,
+
+00:13:24.160 --> 00:13:26.319
+and typically, on the other side,
+
+00:13:26.320 --> 00:13:27.719
+I have a manuscript,
+
+00:13:27.720 --> 00:13:29.999
+and I look at what order
+
+00:13:30.000 --> 00:13:31.159
+I want to have things in
+
+00:13:31.160 --> 00:13:34.799
+and sort the articles and the permanent notes
+
+00:13:34.800 --> 00:13:38.359
+in a way so that each section can have
+
+00:13:38.360 --> 00:13:41.799
+its own citations and its own notes,
+
+00:13:41.800 --> 00:13:46.199
+which makes writing, again, very easy, in my opinion.
+
+00:13:46.200 --> 00:13:53.719
+Finally, let's go to composing the final article.
+
+00:13:53.720 --> 00:13:57.279
+This is our goal: we wrote and organized
+
+00:13:57.280 --> 00:13:58.359
+all these literature notes
+
+00:13:58.360 --> 00:14:00.399
+to put them in your final project.
+
+00:14:00.400 --> 00:14:01.879
+This might be an assignment
+
+00:14:01.880 --> 00:14:04.439
+or an actual scientific article.
+
+00:14:04.440 --> 00:14:07.479
+It is apparent that you have done
+
+00:14:07.480 --> 00:14:09.079
+a lot of work for this so far,
+
+00:14:09.080 --> 00:14:12.279
+but you don't need to do a lot more.
+
+00:14:12.280 --> 00:14:14.079
+In my opinion, this is the easiest part
+
+00:14:14.080 --> 00:14:15.519
+of the whole workflow.
+
+00:14:15.520 --> 00:14:19.279
+People consider final article composition hard,
+
+00:14:19.280 --> 00:14:21.239
+but if you've done all these steps,
+
+00:14:21.240 --> 00:14:23.439
+you already have everything you want
+
+00:14:23.440 --> 00:14:25.639
+to add in the article from your notes.
+
+00:14:25.640 --> 00:14:27.719
+It's already there,
+
+00:14:27.720 --> 00:14:30.759
+a lot of things are copy-pasted,
+
+00:14:30.760 --> 00:14:34.039
+it's all in a coherent order,
+
+00:14:34.040 --> 00:14:38.439
+connections are to an extent already there,
+
+00:14:38.440 --> 00:14:41.599
+and you know what citation goes where,
+
+00:14:41.600 --> 00:14:44.199
+so you can justify everything you write.
+
+00:14:44.200 --> 00:14:46.799
+The actual draft isn't there,
+
+00:14:46.800 --> 00:14:48.519
+but it is very easy
+
+00:14:48.520 --> 00:14:52.599
+because now you just write things as you see them
+
+00:14:52.600 --> 00:14:54.439
+in your desktop and connect them.
+
+00:14:54.440 --> 00:14:56.959
+Connections are basic--
+
+00:14:56.960 --> 00:14:59.439
+connections and making the article good, obviously,
+
+00:14:59.440 --> 00:15:02.399
+are basically the only thing you need to worry,
+
+00:15:02.400 --> 00:15:05.919
+but those are very important
+
+00:15:05.920 --> 00:15:09.039
+because others will only see the final manuscript,
+
+00:15:09.040 --> 00:15:11.079
+so if that's not good,
+
+00:15:11.080 --> 00:15:14.079
+then the whole assignment is not good, obviously.
+
+00:15:14.080 --> 00:15:17.519
+So it's not like your work is done,
+
+00:15:17.520 --> 00:15:19.159
+it's just very easy.
+
+00:15:19.160 --> 00:15:23.279
+And with that, I hope you liked my talk
+
+00:15:23.280 --> 00:15:25.519
+because it is coming to an end now.
+
+00:15:25.520 --> 00:15:27.919
+I want to thank you for your time;
+
+00:15:27.920 --> 00:15:29.679
+I hope you enjoyed it.
+
+00:15:29.680 --> 00:15:32.519
+You can feel free to email me at this address;
+
+00:15:32.520 --> 00:15:35.639
+it has also been on every slide since the beginning.
+
+00:15:35.640 --> 00:15:40.239
+I also have the GitHub for zetteldesk.el here,
+
+00:15:40.240 --> 00:15:42.519
+and I will be available for questions.
+
+00:15:42.520 --> 00:15:44.999
+I will be viewing both the pad and the IRC
+
+00:15:45.000 --> 00:15:49.159
+and will do a live Q&A after this. See you.
+
+00:15:49.160 --> 00:15:51.279
+Actually, before I go,
+
+00:15:51.280 --> 00:15:54.199
+let's show you the GitHub for zetteldesk.el.
+
+00:15:54.200 --> 00:15:57.119
+Here's the README; if you're interested on it,
+
+00:15:57.120 --> 00:15:58.519
+you can see more about it,
+
+00:15:58.520 --> 00:16:02.559
+and also I have a very in-depth wiki about it
+
+00:16:02.560 --> 00:16:06.519
+with 11 pages, and talking about everything
+
+00:16:06.520 --> 00:16:08.079
+that happens here.
+
+00:16:08.080 --> 00:16:11.759
+A lot of what we discussed is in this section
+
+00:16:11.760 --> 00:16:12.919
+about literature notes.
+
+00:16:12.920 --> 00:16:17.199
+These documents go a lot more in-depth
+
+00:16:17.200 --> 00:16:22.799
+in how Zetteldesk works, and also how to use it,
+
+00:16:22.800 --> 00:16:27.719
+so if you're interested, feel free to read them,
+
+00:16:27.720 --> 00:16:30.239
+and if you have any problems,
+
+00:16:30.240 --> 00:16:31.839
+you can open an issue about it;
+
+00:16:31.840 --> 00:16:44.480
+I will be very active. Thank you.
diff --git a/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.vtt b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.vtt
new file mode 100644
index 00000000..8391419c
--- /dev/null
+++ b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.vtt
@@ -0,0 +1,1535 @@
+WEBVTT
+
+00:00:02.000 --> 00:00:02.000
+
+
+00:00:02.000 --> 00:00:05.780
+ All right. I think we're live. Thank you, Andrew, for the
+
+00:00:05.780 --> 00:00:06.480
+ great talk.
+
+00:00:06.480 --> 00:00:09.040
+ Folks, if you'd like to ask your questions, please post
+
+00:00:09.040 --> 00:00:11.280
+ them on the pad. And at some point
+
+00:00:11.280 --> 00:00:13.340
+ in like a minute or two, we'll also open this big blue
+
+00:00:13.340 --> 00:00:14.560
+ button room if you'd like to
+
+00:00:14.560 --> 00:00:17.480
+ join here directly and ask questions here. Take it away,
+
+00:00:17.480 --> 00:00:18.000
+ Andrew.
+
+00:00:18.000 --> 00:00:25.200
+ Yeah, thanks. So should I be reading the questions from the
+
+00:00:25.200 --> 00:00:26.880
+ pad? Yeah.
+
+00:00:26.880 --> 00:00:28.400
+ Yeah, that would be great.
+
+00:00:29.040 --> 00:00:34.760
+ OK, so I see there's a question about is this built into Em
+
+00:00:34.760 --> 00:00:37.440
+acs? I guess that refers to SQLite.
+
+00:00:37.440 --> 00:00:41.630
+ And is it possible to have multiple schemas, multiple
+
+00:00:41.630 --> 00:00:43.840
+ databases? Yes, you could do all that
+
+00:00:43.840 --> 00:00:48.270
+ with Emacs 29. SQLite is built in. You can open up multiple
+
+00:00:48.270 --> 00:00:50.000
+ databases simultaneously and do just
+
+00:00:50.000 --> 00:00:53.460
+ the normal things that you can do with databases. You can
+
+00:00:53.460 --> 00:00:54.640
+ create whatever tables you want.
+
+00:00:55.440 --> 00:01:00.720
+ You can create-- you can have transactions. So it's pretty
+
+00:01:00.720 --> 00:01:04.000
+ full featured. With SQLite,
+
+00:01:04.000 --> 00:01:08.270
+ there's also a notion of additions. You could kind of
+
+00:01:08.270 --> 00:01:10.880
+ compile new things into it. And I'm not
+
+00:01:10.880 --> 00:01:14.560
+ exactly sure to the extent that that is possible as well.
+
+00:01:14.560 --> 00:01:16.400
+ So it's like how full featured of a
+
+00:01:16.400 --> 00:01:19.540
+ SQLite is it? I'm not sure. But the basic stuff, you can
+
+00:01:19.540 --> 00:01:21.680
+ certainly do. And that basic stuff is
+
+00:01:21.680 --> 00:01:26.860
+ fantastic. Next question is, what about collaborative
+
+00:01:26.860 --> 00:01:29.920
+ editing with this? Can you
+
+00:01:29.920 --> 00:01:35.070
+ have multiple computers with multiple Emacs with org mode?
+
+00:01:35.070 --> 00:01:37.840
+ I think it sort of depends. Yes,
+
+00:01:37.840 --> 00:01:41.640
+ I mean, databases are fantastic for having multiple users
+
+00:01:41.640 --> 00:01:44.080
+ doing multiple things at the same time.
+
+00:01:44.080 --> 00:01:48.990
+ And they're really designed for this use case. So I would
+
+00:01:48.990 --> 00:01:51.760
+ say, yes, you could have multiple
+
+00:01:51.760 --> 00:01:56.810
+ editing of the database, multiple editing, whereas you see
+
+00:01:56.810 --> 00:02:04.160
+ some [AUDIO OUT] probably not the best
+
+00:02:04.160 --> 00:02:06.830
+ solution. I suspect it might be possible, but I wouldn't
+
+00:02:06.830 --> 00:02:08.720
+ want to try it. I think it's better for,
+
+00:02:08.720 --> 00:02:12.660
+ like, oh, you can have multiple processes, multiple users,
+
+00:02:12.660 --> 00:02:14.400
+ perhaps contributing to the
+
+00:02:14.400 --> 00:02:17.610
+ same database. And you're growing the database, but not
+
+00:02:17.610 --> 00:02:20.080
+ such tight synchronous interactivity that
+
+00:02:20.080 --> 00:02:24.520
+ I think you might be imagining here. What about using this
+
+00:02:24.520 --> 00:02:26.880
+ on multiple computers? How do you
+
+00:02:26.880 --> 00:02:31.140
+ synchronize your data? I don't know. I need to figure that
+
+00:02:31.140 --> 00:02:33.040
+ out. I think there's a-- like,
+
+00:02:33.040 --> 00:02:36.470
+ yes, you can synchronize your database in the same [AUDIO
+
+00:02:36.470 --> 00:02:38.320
+ OUT] Emacs doesn't have any great
+
+00:02:38.320 --> 00:02:43.000
+ solutions for this. That is, like, when-- let's say I want
+
+00:02:43.000 --> 00:02:45.680
+ to synchronize the things I'm editing
+
+00:02:45.680 --> 00:02:49.280
+ on Emacs with my phone. There's all sorts of various
+
+00:02:49.280 --> 00:02:52.320
+ solutions. You could use Dropbox, Google
+
+00:02:52.320 --> 00:02:56.930
+ Drive, these kinds of things. The database makes that a
+
+00:02:56.930 --> 00:02:59.600
+ little bit harder in the sense that it's
+
+00:02:59.600 --> 00:03:04.400
+ one giant database. I suspect there are interesting ways to
+
+00:03:04.400 --> 00:03:06.560
+ do this, but I haven't explored this area
+
+00:03:06.560 --> 00:03:09.180
+ yet. I think it's a great question, though, and I would
+
+00:03:09.180 --> 00:03:10.800
+ like to investigate this further.
+
+00:03:10.800 --> 00:03:16.640
+ Are you planning to further-- this is a new other question.
+
+00:03:16.640 --> 00:03:18.720
+ Are you planning to further develop EKG?
+
+00:03:18.720 --> 00:03:22.330
+ It's highly [AUDIO OUT] me, and I do prefer SQLite over
+
+00:03:22.330 --> 00:03:23.920
+ Text. Thank you for buying into
+
+00:03:25.200 --> 00:03:29.280
+ the vision. I really like to hear that. Yeah, I am
+
+00:03:29.280 --> 00:03:32.080
+ personally using EKG. I am developing it.
+
+00:03:32.080 --> 00:03:36.940
+ I don't think it's ready for general use yet. I'd like to
+
+00:03:36.940 --> 00:03:39.680
+ get it to a state where it is ready
+
+00:03:39.680 --> 00:03:43.410
+ for general use probably by the end of the month. I think I
+
+00:03:43.410 --> 00:03:45.600
+'ll have a lot of time. There's a pretty
+
+00:03:45.600 --> 00:03:50.500
+ slow month. So that would be really nice. I've just added a
+
+00:03:50.500 --> 00:03:52.160
+ bunch of stuff to it.
+
+00:03:53.360 --> 00:03:55.970
+ I'm exploring. I think the difficult thing is not
+
+00:03:55.970 --> 00:03:58.000
+ necessarily to make it production,
+
+00:03:58.000 --> 00:04:01.800
+ like to make it stable and everything like that and to do
+
+00:04:01.800 --> 00:04:04.320
+ all the developer things that you want
+
+00:04:04.320 --> 00:04:09.380
+ to see in the state of the art era, but really, it's a
+
+00:04:09.380 --> 00:04:12.240
+ different model of how to have notes.
+
+00:04:12.240 --> 00:04:16.860
+ I'm still thinking about some of these fundamental concepts
+
+00:04:16.860 --> 00:04:18.080
+. It took me a long
+
+00:04:18.080 --> 00:04:22.030
+ time to iterate on various designs before I came up with EK
+
+00:04:22.030 --> 00:04:24.240
+G, which I think is [AUDIO OUT]
+
+00:04:24.240 --> 00:04:27.200
+ and so we're going to really see how this goes. But yes,
+
+00:04:27.200 --> 00:04:29.920
+ look for it soon. I'll probably announce it
+
+00:04:29.920 --> 00:04:39.410
+ and maybe on email. And then I will make it available
+
+00:04:39.410 --> 00:04:40.960
+ probably maybe on
+
+00:04:42.000 --> 00:04:46.780
+ new alpha is what I would like to do. Is it possible to
+
+00:04:46.780 --> 00:04:47.760
+ combine the
+
+00:04:47.760 --> 00:04:51.610
+ triples database with some custom tables in the same SQLite
+
+00:04:51.610 --> 00:04:56.240
+ file? Yes. I'm sorry. Let me continue
+
+00:04:56.240 --> 00:04:59.670
+ reading. You need to build a log table next to the triples
+
+00:04:59.670 --> 00:05:02.080
+ table or a quick query of event data.
+
+00:05:02.080 --> 00:05:04.270
+ Yeah, you certainly could do that. And I've been thinking
+
+00:05:04.270 --> 00:05:04.720
+ of adding,
+
+00:05:05.520 --> 00:05:09.210
+ like, just having a record of changes might be an
+
+00:05:09.210 --> 00:05:12.720
+ interesting thing. But yeah, it's just one table
+
+00:05:12.720 --> 00:05:17.840
+ and you really could use this one table called triples, the
+
+00:05:17.840 --> 00:05:22.000
+ triples table, in any other database
+
+00:05:22.000 --> 00:05:24.230
+ or with any other database. It's kind of designed to be its
+
+00:05:24.230 --> 00:05:26.080
+ own database though. But yeah, you could
+
+00:05:26.080 --> 00:05:28.500
+ certainly add things to the side and I can imagine people
+
+00:05:28.500 --> 00:05:29.840
+ writing extensions that do
+
+00:05:30.560 --> 00:05:34.000
+ add some tables to the side to do whatever. It's just that
+
+00:05:34.000 --> 00:05:37.680
+ I think you want to be careful because
+
+00:05:37.680 --> 00:05:42.660
+ that once you start doing that, you might want to, you don
+
+00:05:42.660 --> 00:05:45.040
+'t want to kind of duplicate information or
+
+00:05:45.040 --> 00:05:47.490
+ start having things go out of sync. It's kind of nice just
+
+00:05:47.490 --> 00:05:49.600
+ to have one kind of data. But I think
+
+00:05:49.600 --> 00:05:52.090
+ in certain circumstances, like the kind you're thinking
+
+00:05:52.090 --> 00:05:54.320
+ about, it'd be appropriate. Yeah, so
+
+00:05:54.320 --> 00:06:00.010
+ seems like a good idea. And then I see this final question
+
+00:06:00.010 --> 00:06:02.800
+ here, final for now. What are your
+
+00:06:02.800 --> 00:06:05.270
+ thoughts on adding a timestamp attribute to triple so that
+
+00:06:05.270 --> 00:06:07.280
+ the database becomes append-only and by
+
+00:06:07.280 --> 00:06:10.570
+ default you return the latest fact for a subject-object
+
+00:06:10.570 --> 00:06:13.360
+ pair? Oh, really interesting question.
+
+00:06:13.360 --> 00:06:19.560
+ Let's just say I haven't thought of that and I'll have to
+
+00:06:19.560 --> 00:06:21.680
+ think about it. I don't think,
+
+00:06:21.680 --> 00:06:26.110
+ I haven't seen other triples databases do this. I'd be
+
+00:06:26.110 --> 00:06:28.000
+ interested in what you thought
+
+00:06:28.000 --> 00:06:33.610
+ would be some of the, what you thought might be some of the
+
+00:06:33.610 --> 00:06:34.960
+ interesting
+
+00:06:34.960 --> 00:06:39.440
+ things that come out of this. Yes, you can maybe go back in
+
+00:06:39.440 --> 00:06:41.760
+ time, which is nice,
+
+00:06:41.760 --> 00:06:45.620
+ but then it seems hard to do things like deletes. I guess
+
+00:06:45.620 --> 00:06:48.000
+ you could have tombstones or something
+
+00:06:48.000 --> 00:06:51.110
+ like that, but it becomes a little bit more complicated.
+
+00:06:51.110 --> 00:06:52.880
+ And also just one thing is like,
+
+00:06:52.880 --> 00:06:55.390
+ these kind of databases, I didn't really talk about this in
+
+00:06:55.390 --> 00:06:57.120
+ the talk, but they take up a little
+
+00:06:57.120 --> 00:06:59.870
+ bit of room and I'm a little bit reluctant to have them
+
+00:06:59.870 --> 00:07:01.760
+ even more kind of heavyweight.
+
+00:07:01.760 --> 00:07:05.380
+ On the other hand, perhaps this would go well with the
+
+00:07:05.380 --> 00:07:07.680
+ question about synchronization. If you
+
+00:07:07.680 --> 00:07:11.840
+ were to do as you suggest and have timestamped triples,
+
+00:07:11.840 --> 00:07:14.080
+ synchronization actually becomes pretty
+
+00:07:14.080 --> 00:07:18.110
+ easy. So definitely an interesting thought that I'll have
+
+00:07:18.110 --> 00:07:19.600
+ to think a little bit more about. I
+
+00:07:19.600 --> 00:07:23.970
+ would love to solve the synchronization problem. All right.
+
+00:07:23.970 --> 00:07:29.520
+ I don't see any other, oh yeah,
+
+00:07:29.520 --> 00:07:33.740
+ I don't see any other questions, but you can ask on this,
+
+00:07:33.740 --> 00:07:38.160
+ on the big blue button or type in any
+
+00:07:38.160 --> 00:07:42.730
+ other questions. Otherwise I think we might be done. Cool.
+
+00:07:42.730 --> 00:07:45.280
+ And I will add that. I think we still
+
+00:07:45.280 --> 00:07:48.590
+ have about like, I guess, 15 minutes or so of live Q&A talk
+
+00:07:48.590 --> 00:07:52.320
+ for this talk on stream. If there are no
+
+00:07:52.320 --> 00:07:54.790
+ questions, you're welcome to cut it short, but otherwise we
+
+00:07:54.790 --> 00:07:56.320
+ have plenty of time. So yeah, if
+
+00:07:56.320 --> 00:07:59.910
+ people want to get more questions in, please do. I'm just
+
+00:07:59.910 --> 00:08:01.680
+ going to sit back and wait for the
+
+00:08:01.680 --> 00:08:06.000
+ questions to roll in then. Sounds good. Thank you.
+
+00:08:06.000 --> 00:08:35.920
+ All right. I see another question pop up.
+
+00:08:37.040 --> 00:08:37.040
+
+
+00:08:37.040 --> 00:08:41.400
+ With EKG, what about views like org-roam-node-mindmap-views
+
+00:08:41.400 --> 00:08:44.080
+? Yeah. I personally have
+
+00:08:44.080 --> 00:08:47.280
+ not found those views to be super helpful, but I know
+
+00:08:47.280 --> 00:08:49.680
+ people like them a lot. I don't see any
+
+00:08:49.680 --> 00:08:52.800
+ reason why you couldn't do this. It just would be a
+
+00:08:52.800 --> 00:08:56.000
+ slightly different implementation. Like this
+
+00:08:56.000 --> 00:09:02.940
+ stuff forms a graph. You can do whatever you, you know, you
+
+00:09:02.940 --> 00:09:05.920
+ could easily transform it like that same
+
+00:09:05.920 --> 00:09:09.560
+ org-roam UI. You just have to have like another sort of
+
+00:09:09.560 --> 00:09:12.160
+ translation layer basically to kind of
+
+00:09:12.160 --> 00:09:16.450
+ like figure out how to deal with the stuff in EKG or really
+
+00:09:16.450 --> 00:09:19.520
+ anything with triples. Like fundamentally
+
+00:09:19.520 --> 00:09:23.240
+ it's a graph database, so it lends itself naturally to
+
+00:09:23.240 --> 00:09:25.680
+ things that you're going to be doing,
+
+00:09:25.680 --> 00:09:30.080
+ that anything you're going to be doing with the triples
+
+00:09:30.080 --> 00:09:30.800
+ library.
+
+00:09:32.400 --> 00:09:32.400
+
+
+00:09:32.400 --> 00:09:52.480
+ [silence]
+
+00:09:52.480 --> 00:09:46.220
+ I see another question. Can ordinary Lisp data types, Lisp
+
+00:09:46.220 --> 00:09:59.440
+ symbols, etc. be stored in the
+
+00:09:59.440 --> 00:10:04.760
+ database? Yes, they can. In fact, it's primarily like if
+
+00:10:04.760 --> 00:10:07.120
+ you don't specify anything, it kind of
+
+00:10:07.120 --> 00:10:10.900
+ defaults to a list. That's sort of, I'm not exactly sure
+
+00:10:10.900 --> 00:10:13.520
+ that's the right design choice, but that's
+
+00:10:13.520 --> 00:10:19.230
+ kind of, it seems like a lot of the times it, this kind of
+
+00:10:19.230 --> 00:10:24.000
+ makes sense. Like what if I just added
+
+00:10:24.000 --> 00:10:27.000
+ like a title, I think, if I remember. I did add a title,
+
+00:10:27.000 --> 00:10:29.360
+ but I'm trying to remember. If I just added
+
+00:10:29.360 --> 00:10:33.770
+ the notion of like having a title to EKG and I believe that
+
+00:10:33.770 --> 00:10:36.240
+'s a list. Because you think about it,
+
+00:10:36.240 --> 00:10:39.160
+ you could maybe have alternate titles or multiple titles.
+
+00:10:39.160 --> 00:10:40.880
+ So these are ordered lists and so it kind
+
+00:10:40.880 --> 00:10:44.380
+ of stores it. So basically what happens is you store in the
+
+00:10:44.380 --> 00:10:46.560
+ list of like, but each list item is
+
+00:10:46.560 --> 00:10:49.910
+ a separate row in the table and it has, we call them tri
+
+00:10:49.910 --> 00:10:52.880
+ples, but there's actually one more column
+
+00:10:52.880 --> 00:10:54.720
+ that I don't talk about a lot because it just confuses the
+
+00:10:54.720 --> 00:10:56.160
+ story. But in this case it's relevant
+
+00:10:56.160 --> 00:10:59.040
+ because there you just say what the index is of the item
+
+00:10:59.040 --> 00:11:01.120
+ that you're doing it. So like you'd be
+
+00:11:01.120 --> 00:11:09.150
+ subject and then the predicate would be title in a sense.
+
+00:11:09.150 --> 00:11:12.400
+ And then title one and then like,
+
+00:11:12.400 --> 00:11:15.860
+ okay, that's index one on the fourth column. And then same
+
+00:11:15.860 --> 00:11:17.200
+ thing with the other items.
+
+00:11:17.840 --> 00:11:24.090
+ You can store symbols, SQLite and Emac SQL allow you to
+
+00:11:24.090 --> 00:11:27.920
+ sort of kind of, well, Emac SQL kind of
+
+00:11:27.920 --> 00:11:31.130
+ naturally lets you store lots of different things. And SQL
+
+00:11:31.130 --> 00:11:33.840
+ite, I kind of had to do something that
+
+00:11:33.840 --> 00:11:39.790
+ was very similar to Emac SQL. Emac SQL, in SQL, you have to
+
+00:11:39.790 --> 00:11:43.120
+ just, in your database, it basically
+
+00:11:43.120 --> 00:11:47.000
+ has to be string. Like almost everything besides the predic
+
+00:11:47.000 --> 00:11:49.120
+ates, like the object has to be a string
+
+00:11:49.120 --> 00:11:52.250
+ because it could really be anything. And the subject has to
+
+00:11:52.250 --> 00:11:53.840
+ be a string because it could be
+
+00:11:53.840 --> 00:12:00.490
+ anything. And because of that, we kind of have to make sure
+
+00:12:00.490 --> 00:12:04.080
+ that we kind of have to just store
+
+00:12:04.080 --> 00:12:06.840
+ things in a certain way. Like symbols are just strings and
+
+00:12:06.840 --> 00:12:10.720
+ lists. You could even have a list,
+
+00:12:12.640 --> 00:12:17.810
+ you could have really any list expression as a subject,
+
+00:12:17.810 --> 00:12:21.600
+ right? But it gets just written to a
+
+00:12:21.600 --> 00:12:27.720
+ string and then it gets, when it gets read, it basically,
+
+00:12:27.720 --> 00:12:30.960
+ if it's just a string, it gets read
+
+00:12:30.960 --> 00:12:36.370
+ basically as a list symbol or expression. And if it's a
+
+00:12:36.370 --> 00:12:39.840
+ string, it's a string with a string inside,
+
+00:12:39.840 --> 00:12:44.130
+ that is like the string actually has quotes on either end.
+
+00:12:44.130 --> 00:12:46.000
+ Then we say it's actually a string.
+
+00:12:46.000 --> 00:12:48.770
+ That's how kind of the internal implementation works. And
+
+00:12:48.770 --> 00:12:50.320
+ that's what Emac SQL does as well.
+
+00:12:50.320 --> 00:12:55.040
+ For those who are not familiar, Emac SQL is like this other
+
+00:12:55.040 --> 00:12:58.560
+ way to kind of interact with SQL in
+
+00:12:58.560 --> 00:13:02.210
+ your databases and it works well with SQLite and allows you
+
+00:13:02.210 --> 00:13:04.400
+ to do things like store numbers and
+
+00:13:05.600 --> 00:13:08.960
+ lists as well. And it does this exact same thing. So we try
+
+00:13:08.960 --> 00:13:10.320
+ to keep compatibility.
+
+00:13:10.320 --> 00:13:18.910
+ So you could start a database in Emacs 28 using Emacs SQL
+
+00:13:18.910 --> 00:13:23.440
+ and then you could read it with Emacs 29
+
+00:13:23.440 --> 00:13:27.430
+ using the built in SQLite. That's the hope. I mean, I have
+
+00:13:27.430 --> 00:13:28.720
+ tests, but I don't think anyone
+
+00:13:28.720 --> 00:13:35.050
+ has actually tried to do that exact thing yet. Let's see.
+
+00:13:35.050 --> 00:13:39.040
+ Are there any other new questions?
+
+00:13:39.040 --> 00:13:44.240
+ Oh, there are some. Beyond note taking, what kind of
+
+00:13:44.240 --> 00:13:45.360
+ packages do you
+
+00:13:45.360 --> 00:13:49.680
+ think would benefit from a triple library? I think,
+
+00:13:49.680 --> 00:13:53.830
+ I mean, I think it's generally just an easy way to store
+
+00:13:53.830 --> 00:13:54.880
+ things. So
+
+00:13:56.800 --> 00:14:03.200
+ anything in which you, think of packages that have to store
+
+00:14:03.200 --> 00:14:03.440
+ like
+
+00:14:03.440 --> 00:14:09.440
+ list expressions on the side. Like for example, like BBDB,
+
+00:14:09.440 --> 00:14:11.200
+ if you've used that,
+
+00:14:11.200 --> 00:14:14.110
+ it's just a, it is a database. It's the big brother
+
+00:14:14.110 --> 00:14:17.200
+ database. It's not in a database because
+
+00:14:17.200 --> 00:14:19.890
+ it was written before. Like there was an easy way to use
+
+00:14:19.890 --> 00:14:22.480
+ databases in Emacs. Like that should,
+
+00:14:22.480 --> 00:14:24.640
+ that could definitely, like you don't need the triples
+
+00:14:24.640 --> 00:14:26.160
+ library, but you could easily do this
+
+00:14:26.160 --> 00:14:31.120
+ in the triples library. And I would kind of think triples,
+
+00:14:31.120 --> 00:14:33.120
+ you know, just takes care of a lot of
+
+00:14:33.120 --> 00:14:37.280
+ things and gives a little option over everything. So I mean
+
+00:14:37.280 --> 00:14:39.760
+, there's all sorts of things like,
+
+00:14:39.760 --> 00:14:42.210
+ as I, as I kind of demoed like bookmarks, like why are book
+
+00:14:42.210 --> 00:14:43.920
+marks not in the database? They should be.
+
+00:14:43.920 --> 00:14:48.150
+ So I think if you just look around and look at all these,
+
+00:14:48.150 --> 00:14:50.640
+ all these things as,
+
+00:14:51.280 --> 00:14:55.680
+ as just, just dumping, dumping list expressions to a file,
+
+00:14:55.680 --> 00:14:57.440
+ those probably
+
+00:14:57.440 --> 00:15:01.870
+ SQLite and, and, you know, maybe triples would be a useful
+
+00:15:01.870 --> 00:15:03.200
+ way to do that.
+
+00:15:03.200 --> 00:15:08.720
+ Are you, another question, are you trying to PIM? I think
+
+00:15:08.720 --> 00:15:11.120
+ that means personal information management
+
+00:15:11.120 --> 00:15:16.160
+ with EKG. And what information do you want to manage? I'm
+
+00:15:16.160 --> 00:15:17.120
+ kind of wondering
+
+00:15:18.720 --> 00:15:21.400
+ how I, what I want to do, but like, as I just said in the
+
+00:15:21.400 --> 00:15:23.440
+ previous question, like, I think
+
+00:15:23.440 --> 00:15:26.960
+ you should be storing everything. Yeah. Like libraries,
+
+00:15:26.960 --> 00:15:28.880
+ like, yeah, actually, yeah. BBBB,
+
+00:15:28.880 --> 00:15:32.180
+ you can store contacts and email addresses. And I would
+
+00:15:32.180 --> 00:15:34.320
+ like to, you know, why, if you're storing
+
+00:15:34.320 --> 00:15:37.110
+ that, then it's kind of natural, like, oh, well, you know,
+
+00:15:37.110 --> 00:15:38.880
+ sometimes I want to have a annotation.
+
+00:15:38.880 --> 00:15:41.380
+ I want to write something about this person and, you know,
+
+00:15:41.380 --> 00:15:44.000
+ maybe I want to have something and have,
+
+00:15:46.400 --> 00:15:48.930
+ you know, maybe I want to tag this person. Maybe I want to,
+
+00:15:48.930 --> 00:15:53.200
+ maybe I want to have notes that refer
+
+00:15:53.200 --> 00:15:55.700
+ to this person. So like, it all starts to look like one
+
+00:15:55.700 --> 00:15:57.280
+ giant database when I, when you kind
+
+00:15:57.280 --> 00:16:01.120
+ of think about it a lot, which is kind of why in a, if you
+
+00:16:01.120 --> 00:16:04.800
+ look at the develop, develop branch of
+
+00:16:04.800 --> 00:16:08.290
+ triples, I, I'm work, I think what's going to be in the
+
+00:16:08.290 --> 00:16:10.400
+ next version is, is going to be a
+
+00:16:10.400 --> 00:16:14.110
+ standardized place to, to have a database. That is, you can
+
+00:16:14.110 --> 00:16:17.360
+ just connect to a, to a, the standard
+
+00:16:17.360 --> 00:16:19.360
+ database and you don't have to worry about where the
+
+00:16:19.360 --> 00:16:21.280
+ database is. We'll keep track of that for you.
+
+00:16:21.280 --> 00:16:27.540
+ And, and then everything should be working very easily and
+
+00:16:27.540 --> 00:16:30.320
+ like allow this kind of collaborative
+
+00:16:30.320 --> 00:16:32.770
+ use of, of these things. So like, yeah, it could be a
+
+00:16:32.770 --> 00:16:34.720
+ personal information manager that has all
+
+00:16:34.720 --> 00:16:37.330
+ sorts of information because I think that's what people
+
+00:16:37.330 --> 00:16:39.440
+ tend to use Emacs for is that, you know,
+
+00:16:39.440 --> 00:16:43.610
+ I have my own notes, my own contacts, my own tasks, you
+
+00:16:43.610 --> 00:16:46.080
+ know, why aren't tasks in, tasks should
+
+00:16:46.080 --> 00:16:49.820
+ also perhaps be in, in, in the database. Like, yeah, it's
+
+00:16:49.820 --> 00:16:52.000
+ kind of, org mode is completely awesome,
+
+00:16:52.000 --> 00:16:56.110
+ like really incredible. And it's, it's nice to mix to do's
+
+00:16:56.110 --> 00:16:58.480
+ with things with text, but sometimes
+
+00:16:58.480 --> 00:17:01.850
+ maybe you just want to do's that are not with text and
+
+00:17:01.850 --> 00:17:04.160
+ maybe those could be also in the database.
+
+00:17:04.160 --> 00:17:06.050
+ I don't know. It's just things I, things I'm thinking about
+
+00:17:06.050 --> 00:17:07.200
+. I'm not sure how far I want to
+
+00:17:07.200 --> 00:17:12.160
+ take that. Another question. What about using other
+
+00:17:12.160 --> 00:17:16.000
+ database programs like Postgres, MonoDB?
+
+00:17:16.000 --> 00:17:27.550
+ You, so I think you could, yes, you could do that. I don't
+
+00:17:27.550 --> 00:17:29.920
+ see it's a, I don't know why you,
+
+00:17:29.920 --> 00:17:32.720
+ I don't know if there's any advantage to doing this. Like
+
+00:17:32.720 --> 00:17:35.280
+ SQLite is kind of nice because it is
+
+00:17:35.280 --> 00:17:38.490
+ light. It is kind of, it is built into Emacs and we don't
+
+00:17:38.490 --> 00:17:39.760
+ really need anything incredibly
+
+00:17:39.760 --> 00:17:42.210
+ sophisticated here. Just having a database is like such a
+
+00:17:42.210 --> 00:17:43.680
+ higher level of sophistication than
+
+00:17:43.680 --> 00:17:47.500
+ what we've been doing in Emacs are so far. Then you know, I
+
+00:17:47.500 --> 00:17:50.000
+ think the other stuff might be overkill,
+
+00:17:50.000 --> 00:17:52.800
+ but I see no reason why it wouldn't work. I just don't
+
+00:17:52.800 --> 00:17:54.640
+ really see if there's really any big
+
+00:17:54.640 --> 00:18:00.620
+ advantages. What is your preferred reference to underscan
+
+00:18:00.620 --> 00:18:04.960
+ triples graph DBs? To sort of think
+
+00:18:04.960 --> 00:18:07.330
+ about better schema design? Oh, that's a really awesome
+
+00:18:07.330 --> 00:18:12.480
+ question. And I would, I don't, I don't
+
+00:18:12.480 --> 00:18:15.570
+ think I can answer that immediately. I kind of know all
+
+00:18:15.570 --> 00:18:17.520
+ this stuff from talking to people
+
+00:18:17.520 --> 00:18:21.730
+ basically, instead of like reading things. And like in my
+
+00:18:21.730 --> 00:18:25.040
+ work, I use these triples. That is,
+
+00:18:25.040 --> 00:18:28.100
+ that's kind of like, you know, I kind of work on a
+
+00:18:28.100 --> 00:18:30.560
+ knowledge graph. So I just have a, from,
+
+00:18:30.560 --> 00:18:35.860
+ you know, working knowledge of how these things work. So,
+
+00:18:35.860 --> 00:18:38.400
+ but it is an awesome question that let
+
+00:18:38.400 --> 00:18:41.530
+ me, let me look into it after I kind of finished this and I
+
+00:18:41.530 --> 00:18:43.440
+'ll, I'll try to fill it in, in the,
+
+00:18:43.440 --> 00:18:47.210
+ in the either pad that is connected to this talk. So thank
+
+00:18:47.210 --> 00:18:49.200
+ you for that great question.
+
+00:18:49.200 --> 00:18:53.960
+ So another question, will it slow down with the growth of a
+
+00:18:53.960 --> 00:18:56.960
+ database? Yeah, I need to do
+
+00:18:56.960 --> 00:19:00.040
+ tests about this. Cause I'd like to see like how much, how
+
+00:19:00.040 --> 00:19:01.360
+ much the database blows up,
+
+00:19:01.360 --> 00:19:05.120
+ how much it slows down for sure. Triples is not the most
+
+00:19:05.120 --> 00:19:07.360
+ efficient way. It's not even close
+
+00:19:07.360 --> 00:19:10.650
+ to being a greatly efficient way to store data for doing
+
+00:19:10.650 --> 00:19:13.120
+ any arbitrary things. But what it is,
+
+00:19:13.120 --> 00:19:17.510
+ it you're trading off standardization, which is, so you get
+
+00:19:17.510 --> 00:19:19.600
+ standardization, but you lose,
+
+00:19:19.600 --> 00:19:24.880
+ you lose the power of getting things in one SQL expression.
+
+00:19:24.880 --> 00:19:26.480
+ So you often have to kind of like do
+
+00:19:26.480 --> 00:19:31.400
+ a bunch of round trips and that's slow. However, I I'm
+
+00:19:31.400 --> 00:19:36.320
+ using this now. I have a bunch of data
+
+00:19:36.320 --> 00:19:40.440
+ and you know, quite a bit. I've, I kind of poured it over
+
+00:19:40.440 --> 00:19:42.720
+ my old org Rome to, to EKG.
+
+00:19:42.720 --> 00:19:45.860
+ And you know, I've been accumulating stuff in our room for
+
+00:19:45.860 --> 00:19:47.920
+ like, you know, two years now,
+
+00:19:47.920 --> 00:19:52.510
+ and it's pretty big, but it's very fast, really just no, no
+
+00:19:52.510 --> 00:19:55.200
+ problems at all. So yes, I'm sure
+
+00:19:55.200 --> 00:20:00.750
+ that there is a, a size in which it's too big to be fast.
+
+00:20:00.750 --> 00:20:04.400
+ But I haven't hit it. And I suspect for
+
+00:20:04.400 --> 00:20:09.230
+ most ordinary uses of, of, of Emacs, I doubt other people
+
+00:20:09.230 --> 00:20:12.160
+ will hit it as well. I mean, it's kind of
+
+00:20:12.160 --> 00:20:14.380
+ similar to, you know, when people think about org Rome and
+
+00:20:14.380 --> 00:20:15.760
+ things like, well, you know, you're
+
+00:20:15.760 --> 00:20:17.980
+ storing everything in one database, like how many notes
+
+00:20:17.980 --> 00:20:19.520
+ could have possibly hold, like that's also
+
+00:20:19.520 --> 00:20:25.980
+ going to get slow. Right. So yeah, it's, it's I think these
+
+00:20:25.980 --> 00:20:29.760
+ limits exist, but people tend not to
+
+00:20:29.760 --> 00:20:32.480
+ hit them and it's like, yes, this is going to get slow, but
+
+00:20:32.480 --> 00:20:34.320
+ it'll certainly do better. I think that
+
+00:20:34.320 --> 00:20:38.850
+ files in the file system. What are the, here's another
+
+00:20:38.850 --> 00:20:41.920
+ question. What are your thoughts on
+
+00:20:41.920 --> 00:20:47.130
+ allowing for a true graph DB backend? Whatever the current
+
+00:20:47.130 --> 00:20:50.480
+ best free software alternative to Neo4j
+
+00:20:50.480 --> 00:20:54.710
+ is, I guess. Okay. Great question. I've actually, yeah, I
+
+00:20:54.710 --> 00:20:57.360
+ actually used graph databases and several
+
+00:20:57.360 --> 00:21:00.580
+ companies I used to work for and you know, but we always
+
+00:21:00.580 --> 00:21:03.040
+ ended up switching to SQL. I like it's,
+
+00:21:03.040 --> 00:21:08.000
+ it's I can't, it's just at least for serious applications,
+
+00:21:08.000 --> 00:21:10.080
+ they tended to be slow and
+
+00:21:10.880 --> 00:21:14.310
+ lend themselves to a use that was not, that was very iter
+
+00:21:14.310 --> 00:21:16.480
+ative and not very well thought out.
+
+00:21:16.480 --> 00:21:23.880
+ So however, I don't think it's as I said, with the last
+
+00:21:23.880 --> 00:21:28.720
+ question for the way people want to,
+
+00:21:28.720 --> 00:21:31.090
+ you know, the kind of data I think Emacs users will want, I
+
+00:21:31.090 --> 00:21:32.480
+ think a graph database would work
+
+00:21:32.480 --> 00:21:36.610
+ quite well. I don't know if there would be like, what are
+
+00:21:36.610 --> 00:21:38.720
+ the advantages over triples
+
+00:21:38.720 --> 00:21:41.700
+ aside from sort of just a more, you don't have to kind of
+
+00:21:41.700 --> 00:21:43.440
+ even deal with the SQL layer, but like,
+
+00:21:43.440 --> 00:21:46.040
+ I'm kind of, I'm kind of building, you know, with triples,
+
+00:21:46.040 --> 00:21:47.760
+ we're sort of like, don't even worry about
+
+00:21:47.760 --> 00:21:50.220
+ what the layer is, right? It's just, you don't even have to
+
+00:21:50.220 --> 00:21:51.920
+ worry about SQL if you're just using
+
+00:21:51.920 --> 00:21:57.040
+ kind of the normal functionality. So you can yeah. So, you
+
+00:21:57.040 --> 00:22:00.160
+ know, maybe there are interesting
+
+00:22:00.160 --> 00:22:02.670
+ implications for using a graph database, but I can't really
+
+00:22:02.670 --> 00:22:03.680
+ think of any right now.
+
+00:22:03.680 --> 00:22:09.910
+ It's a good question though. Thank you. - And I'll quickly
+
+00:22:09.910 --> 00:22:10.880
+ add that we have about,
+
+00:22:10.880 --> 00:22:14.850
+ I think two more minutes ish on this live stream. And then
+
+00:22:14.850 --> 00:22:17.120
+ folks are welcome to either join here for
+
+00:22:17.120 --> 00:22:19.560
+ continuing the Q and A or keep posting questions on the pad
+
+00:22:19.560 --> 00:22:21.040
+ and you can continue here in this room
+
+00:22:21.040 --> 00:22:24.000
+ after the stream moves on. - Okay. In that case, I'll,
+
+00:22:24.000 --> 00:22:28.320
+ I will stick around until I don't get any more questions
+
+00:22:28.320 --> 00:22:30.080
+ for a few minutes, then I'll probably
+
+00:22:31.200 --> 00:22:33.440
+ log off. - Sounds great. Thank you.
+
+00:22:33.440 --> 00:22:35.440
+ - Yeah.
+
+00:22:58.960 --> 00:23:02.640
+ - I'm hungry. Did I get writing and recording this? So I
+
+00:23:02.640 --> 00:23:06.560
+ actually did a month ago. So like,
+
+00:23:06.560 --> 00:23:10.530
+ I don't even, I hardly even remember what it was, what that
+
+00:23:10.530 --> 00:23:12.160
+ time was like, but yes, it's,
+
+00:23:12.160 --> 00:23:14.480
+ it took a long time. These things, you know, these
+
+00:23:14.480 --> 00:23:16.480
+ recordings are a little bit challenging. And in
+
+00:23:16.480 --> 00:23:18.780
+ fact, I only kind of screwed up in several instances of the
+
+00:23:18.780 --> 00:23:20.240
+ recording. And like, I just,
+
+00:23:20.240 --> 00:23:22.240
+ I just don't have energy to kind of keep redoing. It's like
+
+00:23:22.240 --> 00:23:23.760
+, it's a long recording. It's also,
+
+00:23:23.760 --> 00:23:26.000
+ I think I chopped it up into three bits. I'm not sure if it
+
+00:23:26.000 --> 00:23:27.600
+ was that, is that obvious, but like,
+
+00:23:27.600 --> 00:23:31.860
+ I guess, notes for people doing future sessions, it's like,
+
+00:23:31.860 --> 00:23:35.680
+ make sure you have natural pauses that
+
+00:23:35.680 --> 00:23:39.860
+ you can sort of just like record a segment because
+
+00:23:39.860 --> 00:23:42.880
+ something would inevitably go wrong. And then like,
+
+00:23:42.880 --> 00:23:45.200
+ if you're trying to repeat a 20 minute talk, it just takes
+
+00:23:45.200 --> 00:23:48.720
+ forever. Yes. Oh yeah. The recipes.
+
+00:23:48.720 --> 00:23:54.230
+ That's right. Yeah. I, well, yes, I'm glad you enjoyed the
+
+00:23:54.230 --> 00:23:56.480
+ recipe. This is great. You put the
+
+00:23:56.480 --> 00:23:59.800
+ recipes in there. Like one thing that I think is, is useful
+
+00:23:59.800 --> 00:24:01.840
+ for, you know, regardless of what
+
+00:24:01.840 --> 00:24:06.110
+ thing you're using in org-roam or EKG or whatever, you know
+
+00:24:06.110 --> 00:24:08.240
+, when you're making a recipe,
+
+00:24:08.240 --> 00:24:11.230
+ you know, record in your daily diary, like, you know, when
+
+00:24:11.230 --> 00:24:12.800
+ you, what you did it, if it worked,
+
+00:24:12.800 --> 00:24:16.160
+ like what, what, you know, what adjustments you had to make
+
+00:24:16.160 --> 00:24:17.760
+, how it turned out, how it could be
+
+00:24:17.760 --> 00:24:21.320
+ better. Then like, if it's linked to the recipe, then you
+
+00:24:21.320 --> 00:24:23.040
+ have a kind of a record of like, oh,
+
+00:24:23.040 --> 00:24:25.720
+ these are, you know, not just the recipe, but like your
+
+00:24:25.720 --> 00:24:27.840
+ experiences making the recipe. I think
+
+00:24:27.840 --> 00:24:32.140
+ it's really powerful because then you can see how, you know
+
+00:24:32.140 --> 00:24:34.480
+, you can kind of refine, refine and
+
+00:24:34.480 --> 00:24:37.030
+ refine. It's really hard to do this in other ways. Like if
+
+00:24:37.030 --> 00:24:38.640
+ just, you're just using your memory,
+
+00:24:38.640 --> 00:24:40.730
+ you're, you're kind of like, well, it's, I can't remember
+
+00:24:40.730 --> 00:24:42.000
+ what I did the last time I made this
+
+00:24:42.000 --> 00:24:45.940
+ recipe, but like, you know, it seems a little bit extreme,
+
+00:24:45.940 --> 00:24:48.240
+ but I think it's quite useful to use
+
+00:24:48.240 --> 00:25:01.720
+ these note-taking applications for this use case. Okay. I
+
+00:25:01.720 --> 00:25:03.440
+ think the stream has moved on, but again,
+
+00:25:03.440 --> 00:25:05.620
+ you're all welcome to stay here and continue to Q&A as long
+
+00:25:05.620 --> 00:25:06.720
+ as there are any questions.
+
+00:25:06.720 --> 00:25:13.440
+ Thank you for your moderation.
+
+00:25:15.120 --> 00:25:19.920
+ Cheers. Happy to. Thanks for the great talk.
+
+00:25:21.200 --> 00:25:21.200
+
+
+00:25:21.200 --> 00:25:23.200
+ [end of transcript]
+
+00:25:46.080 --> 00:25:49.120
+ While I see if there's any more questions, I'm going to
+
+00:25:49.120 --> 00:25:50.320
+ fill in, I think not, not all
+
+00:25:50.320 --> 00:25:52.710
+ the replies are filled in. So I'm going to start filling in
+
+00:25:52.710 --> 00:25:53.200
+ this, you know,
+
+00:25:53.200 --> 00:25:56.240
+ the pad that's associated with this.
+
+00:25:56.400 --> 00:25:56.400
+
+
+00:25:56.400 --> 00:25:58.400
+ [end of transcript]
+
+00:26:00.160 --> 00:26:00.160
+
+
+00:26:00.160 --> 00:26:00.560
+ Okay.
+
+00:26:02.560 --> 00:26:02.560
+
+
+00:26:02.560 --> 00:26:04.560
+ [end of transcript]
+
+00:26:04.560 --> 00:26:14.560
+ Okay.
+
+00:26:16.560 --> 00:26:16.560
+
+
+00:26:16.560 --> 00:26:18.560
+ [end of transcript]
+
+00:26:20.560 --> 00:26:20.560
+
+
+00:26:20.560 --> 00:26:20.560
+ Okay.
+
+00:26:22.560 --> 00:26:22.560
+
+
+00:26:22.560 --> 00:26:22.560
+ Okay.
+
+00:26:24.560 --> 00:26:24.560
+
+
+00:26:24.560 --> 00:26:24.560
+ Okay.
+
+00:26:26.560 --> 00:26:26.560
+
+
+00:26:26.560 --> 00:26:26.560
+ Okay.
+
+00:26:28.560 --> 00:26:28.560
+
+
+00:26:28.560 --> 00:26:28.560
+ Okay.
+
+00:26:30.560 --> 00:26:30.560
+
+
+00:26:30.560 --> 00:26:30.560
+ Okay.
+
+00:26:32.560 --> 00:26:32.560
+
+
+00:26:32.560 --> 00:26:32.560
+ Okay.
+
+00:26:34.560 --> 00:26:34.560
+
+
+00:26:34.560 --> 00:26:34.560
+ Okay.
+
+00:26:36.560 --> 00:26:36.560
+
+
+00:26:36.560 --> 00:26:36.560
+ Okay.
+
+00:26:36.560 --> 00:26:46.560
+ Okay.
+
+00:26:46.560 --> 00:26:56.560
+ Okay.
+
+00:26:56.560 --> 00:27:06.560
+ Okay.
+
+00:27:06.560 --> 00:27:16.560
+ Okay.
+
+00:27:16.560 --> 00:27:26.560
+ Okay.
+
+00:27:26.560 --> 00:27:36.560
+ Okay.
+
+00:27:36.560 --> 00:27:46.560
+ Okay.
+
+00:27:46.560 --> 00:27:56.560
+ Okay.
+
+00:27:56.560 --> 00:28:06.560
+ Okay.
+
+00:28:06.560 --> 00:28:16.560
+ Okay.
+
+00:28:16.560 --> 00:28:26.560
+ Okay.
+
+00:28:26.560 --> 00:28:36.560
+ Okay.
+
+00:28:36.560 --> 00:28:46.560
+ Okay.
+
+00:28:46.560 --> 00:28:56.560
+ Okay.
+
+00:28:56.560 --> 00:29:06.560
+ Okay.
+
+00:29:06.560 --> 00:29:16.560
+ Okay.
+
+00:29:16.560 --> 00:29:26.560
+ Okay.
+
+00:29:26.560 --> 00:29:36.560
+ Okay.
+
+00:29:36.560 --> 00:29:46.560
+ Okay.
+
+00:29:46.560 --> 00:29:56.560
+ Okay.
+
+00:29:56.560 --> 00:30:06.560
+ Okay.
+
+00:30:06.560 --> 00:30:16.560
+ Okay.
+
+00:30:16.560 --> 00:30:26.560
+ Okay.
+
+00:30:26.560 --> 00:30:30.560
+ All right. I, there's no one here and I don't like any
+
+00:30:30.560 --> 00:30:35.360
+ other questions. So I am going to log out. Thank you
+
+00:30:35.360 --> 00:30:36.560
+ everyone for your questions.
+
+00:30:36.560 --> 00:30:38.560
+ [end of transcript]
+
+00:30:40.560 --> 00:30:40.560
+
+
diff --git a/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main--chapters.vtt b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main--chapters.vtt
new file mode 100644
index 00000000..c5caa435
--- /dev/null
+++ b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main--chapters.vtt
@@ -0,0 +1,38 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:56.220
+Introduction
+
+00:00:56.220 --> 00:02:29.869
+Why SQLite
+
+00:02:29.870 --> 00:04:50.208
+The triples package
+
+00:04:50.209 --> 00:07:40.740
+Exercise: Emacs bookmarks
+
+00:07:40.740 --> 00:09:31.365
+Creating bookmarks
+
+00:09:31.366 --> 00:11:10.033
+Retrieving bookmarks
+
+00:11:10.034 --> 00:13:59.380
+Backlinks
+
+00:13:59.380 --> 00:15:57.007
+Extensible entities
+
+00:15:57.008 --> 00:18:12.771
+EKG package
+
+00:18:12.772 --> 00:19:43.780
+The code
+
+00:19:43.780 --> 00:20:52.146
+Renaming tags
+
+00:20:52.147 --> 00:21:17.660
+Conclusion
diff --git a/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt
new file mode 100644
index 00000000..4c3792aa
--- /dev/null
+++ b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt
@@ -0,0 +1,1309 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:08.555
+Hello. I'm Andrew Hyatt. I've been working on Emacs,
+
+00:00:08.556 --> 00:00:10.539
+with Emacs, and to some extent
+
+00:00:10.540 --> 00:00:15.272
+on Emacs for a while. I've written the WebSockets library
+
+00:00:15.273 --> 00:00:20.045
+and Emacs calc tutorials. I've enjoyed use of
+
+00:00:20.046 --> 00:00:24.640
+many of everyone's incredible packages.
+
+00:00:24.640 --> 00:00:27.132
+So my thesis for this talk, why I'm giving this talk,
+
+00:00:27.133 --> 00:00:29.060
+is that I'm interested in SQLite.
+
+00:00:29.061 --> 00:00:34.953
+I think we should be exploring SQLite for applications
+
+00:00:34.954 --> 00:00:37.482
+in ways I think the community has shied away from.
+
+00:00:37.483 --> 00:00:41.950
+I'd like to introduce the triples package as a way,
+
+00:00:41.951 --> 00:00:47.664
+both easy and with interesting functionality,
+
+00:00:47.665 --> 00:00:49.153
+that will allow us to build extensible databases
+
+00:00:49.154 --> 00:00:52.582
+in a way that is, I think,
+
+00:00:52.583 --> 00:00:56.220
+a little bit unusual and perhaps compelling, I hope.
+
+00:00:56.220 --> 00:00:59.226
+So first of all, why SQLite?
+
+00:00:59.227 --> 00:01:06.080
+Why is this good? Well, SQLite is now built into Emacs.
+
+00:01:06.080 --> 00:01:12.216
+So you get a few things out of this when you use it for data.
+
+00:01:12.217 --> 00:01:14.580
+First of all, it's a database.
+
+00:01:14.580 --> 00:01:16.369
+It's extremely good for data, of course.
+
+00:01:16.370 --> 00:01:19.918
+There's a simplicity to data manipulation
+
+00:01:19.919 --> 00:01:22.027
+using a database, compared to data manipulation,
+
+00:01:22.028 --> 00:01:25.196
+that is, manipulating data in a text file.
+
+00:01:25.197 --> 00:01:31.033
+Text files are really not built for data.
+
+00:01:31.034 --> 00:01:33.140
+So when typically when you need to do this,
+
+00:01:33.140 --> 00:01:35.026
+like I know Org Mode is--
+
+00:01:35.027 --> 00:01:38.116
+which I'm a huge, huge Org Mode fan--
+
+00:01:38.117 --> 00:01:41.044
+it's all about sort of data in text.
+
+00:01:41.045 --> 00:01:45.375
+It does work, but you certainly would be
+
+00:01:45.376 --> 00:01:47.360
+hard pressed to make sweeping changes
+
+00:01:47.360 --> 00:01:51.953
+to your database that is represented in text.
+
+00:01:51.954 --> 00:01:53.060
+It's just not well suited for this sort of thing.
+
+00:01:53.061 --> 00:01:54.963
+It would take a long time,
+
+00:01:54.964 --> 00:02:00.220
+where the speed of SQL is incredibly impressive.
+
+00:02:00.220 --> 00:02:04.429
+I think certainly Emacs is not known
+
+00:02:04.430 --> 00:02:06.752
+for being extremely speedy.
+
+00:02:06.753 --> 00:02:11.905
+I think the overuse of text
+
+00:02:11.906 --> 00:02:14.613
+is part of this. Of course, text and using text,
+
+00:02:14.614 --> 00:02:18.467
+using files has awesome advantages as well.
+
+00:02:18.468 --> 00:02:20.510
+I'm really here to talk about
+
+00:02:20.511 --> 00:02:22.717
+the other side of the coin, right?
+
+00:02:22.718 --> 00:02:23.961
+Everyone can judge
+
+00:02:23.962 --> 00:02:24.645
+those advantages and disadvantages
+
+00:02:24.646 --> 00:02:25.416
+and make their own trade-offs,
+
+00:02:25.417 --> 00:02:26.020
+but I want to kind of
+
+00:02:26.021 --> 00:02:29.869
+make the pitch for SQLite.
+
+00:02:29.870 --> 00:02:32.860
+So let's talk about the triples package.
+
+00:02:32.860 --> 00:02:35.488
+The triples package is a package
+
+00:02:35.489 --> 00:02:40.419
+that is designed to give you a very generic schema.
+
+00:02:40.420 --> 00:02:42.005
+You don't have to do,
+
+00:02:42.006 --> 00:02:43.291
+for most of the common operations,
+
+00:02:43.292 --> 00:02:45.516
+you don't have to write SQL yourself.
+
+00:02:45.517 --> 00:02:47.924
+A lot of stuff is built in
+
+00:02:47.925 --> 00:02:51.035
+and is based on a very generic schema.
+
+00:02:51.036 --> 00:02:53.840
+That is, it's a single table.
+
+00:02:53.840 --> 00:02:55.229
+That table has, of course, fixed schema.
+
+00:02:55.230 --> 00:02:57.478
+It basically has three columns.
+
+00:02:57.479 --> 00:03:00.867
+It actually has four columns.
+
+00:03:00.868 --> 00:03:01.193
+In this talk, I'm not going to get into
+
+00:03:01.194 --> 00:03:04.123
+the fourth column and why, but it's useful.
+
+00:03:04.124 --> 00:03:07.710
+So the three columns are subject, predicate,
+
+00:03:07.711 --> 00:03:10.361
+and object. This is what it's related to
+
+00:03:10.362 --> 00:03:13.908
+what we call an RDF format.
+
+00:03:13.909 --> 00:03:17.139
+These things basically describe a link.
+
+00:03:17.140 --> 00:03:20.007
+The link is from the subject to the object.
+
+00:03:20.008 --> 00:03:23.955
+The link type is a predicate.
+
+00:03:23.956 --> 00:03:26.085
+That sounds overly theoretical,
+
+00:03:26.086 --> 00:03:28.032
+but the point is that you can describe
+
+00:03:28.033 --> 00:03:32.005
+a lot of things with this format.
+
+00:03:32.006 --> 00:03:33.329
+You probably describe everything with it.
+
+00:03:33.330 --> 00:03:39.226
+It's very simple because the schema is fixed.
+
+00:03:39.227 --> 00:03:42.773
+It's only this kind of data. That means
+
+00:03:42.774 --> 00:03:44.140
+for your application, you define a schema
+
+00:03:44.140 --> 00:03:47.326
+in subject, predicate, object format.
+
+00:03:47.327 --> 00:03:50.072
+That defines what data you can use,
+
+00:03:50.073 --> 00:03:56.069
+what types there are, what properties they have,
+
+00:03:56.070 --> 00:03:57.214
+how you can use the system,
+
+00:03:57.215 --> 00:04:01.006
+and what is legal to do. And this is stored as data.
+
+00:04:01.007 --> 00:04:03.890
+I think as Lisp people,
+
+00:04:03.891 --> 00:04:07.540
+I think we're all very onboard
+
+00:04:07.540 --> 00:04:13.912
+with the fact that you have a simple way
+
+00:04:13.913 --> 00:04:17.660
+to express everything, and you don't have these
+
+00:04:17.660 --> 00:04:18.924
+two systems. In this way,
+
+00:04:18.925 --> 00:04:20.871
+you don't have to have code as a system.
+
+00:04:20.872 --> 00:04:24.825
+Do you have to load code to use the triples package
+
+00:04:24.826 --> 00:04:27.916
+to make sure your schema is obeyed?
+
+00:04:27.917 --> 00:04:35.213
+No, it's all just built in to this database.
+
+00:04:35.214 --> 00:04:37.036
+I'll describe this. As I said,
+
+00:04:37.037 --> 00:04:39.860
+it's a little bit abstract right now,
+
+00:04:39.860 --> 00:04:42.048
+but it will become a lot clearer
+
+00:04:42.049 --> 00:04:46.778
+when we go through an example,
+
+00:04:46.779 --> 00:04:50.208
+which we're going to do now.
+
+00:04:50.209 --> 00:04:56.660
+As an exercise, let's create Emacs bookmarks,
+
+00:04:56.660 --> 00:04:57.345
+which basically are three things:
+
+00:04:57.346 --> 00:05:01.038
+a name, a file, and an annotation.
+
+00:05:01.039 --> 00:05:02.364
+I may be missing out on functionality.
+
+00:05:02.365 --> 00:05:04.772
+Of course, everything in Emacs,
+
+00:05:04.773 --> 00:05:05.140
+everything has lots and lots of functionality,
+
+00:05:05.140 --> 00:05:08.049
+but let's just start with this simple thing.
+
+00:05:08.050 --> 00:05:11.100
+First of all, we're going to open up a database.
+
+00:05:11.100 --> 00:05:12.103
+Pretty simple.
+
+00:05:12.104 --> 00:05:15.014
+I think there's nothing to explain there.
+
+00:05:15.015 --> 00:05:19.106
+But here on this line that I'm on right now,
+
+00:05:19.107 --> 00:05:21.432
+we are saying, okay, there's going to be
+
+00:05:21.433 --> 00:05:24.839
+a type called bookmark.
+
+00:05:24.840 --> 00:05:26.826
+It's going to have the following properties.
+
+00:05:26.827 --> 00:05:29.178
+First, a file, which is unique and a string.
+
+00:05:29.179 --> 00:05:31.764
+The second is an annotation,
+
+00:05:31.765 --> 00:05:34.317
+which is again unique and a string.
+
+00:05:34.318 --> 00:05:37.864
+Then we're going to have another type called named.
+
+00:05:37.865 --> 00:05:39.808
+First of all, why is it named as part of bookmark?
+
+00:05:39.809 --> 00:05:45.562
+As I'll get into, it's interesting
+
+00:05:45.563 --> 00:05:48.511
+when you start sharing this database
+
+00:05:48.512 --> 00:05:51.365
+with other things, not just bookmarks, but other types.
+
+00:05:51.366 --> 00:05:54.616
+Bookmarks are very similar to many other things
+
+00:05:54.617 --> 00:05:56.723
+that you might want to expand into.
+
+00:05:56.724 --> 00:05:57.086
+Those other things have names,
+
+00:05:57.087 --> 00:05:58.269
+but they're not bookmarks.
+
+00:05:58.270 --> 00:06:04.123
+It's nice to separate these concerns out
+
+00:06:04.124 --> 00:06:08.372
+and just have another type called named,
+
+00:06:08.373 --> 00:06:12.780
+which just basically has a name.
+
+00:06:12.780 --> 00:06:15.746
+We can execute this.
+
+00:06:15.747 --> 00:06:21.798
+It's not interesting to look at these.
+
+00:06:21.440 --> 00:06:25.907
+that is not all that useful for anything,
+
+00:06:21.799 --> 00:06:21.439
+It outputs something
+
+00:06:25.908 --> 00:06:28.014
+but that's okay. What's done is, actually,
+
+00:06:28.015 --> 00:06:32.262
+it's created a database
+
+00:06:32.263 --> 00:06:34.045
+and it's populated it with the schema.
+
+00:06:34.046 --> 00:06:41.478
+We can look at this.
+
+00:06:41.479 --> 00:06:43.602
+We won't go through all of this
+
+00:06:43.603 --> 00:06:44.188
+because it's a little bit too much
+
+00:06:44.189 --> 00:06:46.036
+for a short presentation like this,
+
+00:06:46.037 --> 00:06:48.185
+but you could see that there's something here
+
+00:06:48.186 --> 00:06:52.500
+that's like, oh, we have a subject bookmark.
+
+00:06:52.500 --> 00:06:56.031
+We have a property base/type.
+
+00:06:56.032 --> 00:06:58.878
+That just means that there's a property
+
+00:06:58.879 --> 00:07:00.562
+that's defined by the base.
+
+00:07:00.563 --> 00:07:02.248
+This means this is from the triples package itself.
+
+00:07:02.249 --> 00:07:08.940
+It's not some other package.
+
+00:07:08.940 --> 00:07:11.525
+Third is, what is the type of this object?
+
+00:07:11.526 --> 00:07:17.060
+It's a schema. This thing could be many types.
+
+00:07:17.060 --> 00:07:19.150
+As I said, if you have a--
+
+00:07:19.151 --> 00:07:20.235
+we haven't seen an example yet,
+
+00:07:20.236 --> 00:07:21.100
+but if you have a bookmark,
+
+00:07:21.100 --> 00:07:23.686
+it's going to have a name type
+
+00:07:23.687 --> 00:07:25.694
+and a bookmark type.
+
+00:07:25.695 --> 00:07:26.719
+Everything is multi-typed
+
+00:07:26.720 --> 00:07:28.146
+and that's kind of a feature
+
+00:07:28.147 --> 00:07:32.137
+of this kind of storage system.
+
+00:07:32.138 --> 00:07:33.140
+I'm not going to go through everything,
+
+00:07:33.140 --> 00:07:35.865
+but you can see it's all there in triples,
+
+00:07:35.866 --> 00:07:40.740
+the whole schema, everything we just did.
+
+00:07:40.740 --> 00:07:42.645
+Let's create a bookmark. Again,
+
+00:07:42.646 --> 00:07:46.997
+we're going to connect to our database
+
+00:07:46.998 --> 00:07:49.246
+and we're going to basically set
+
+00:07:49.247 --> 00:07:52.552
+an entire subject.
+
+00:07:52.553 --> 00:07:54.239
+The subject is, it's basically like an entity.
+
+00:07:54.240 --> 00:07:56.105
+We're going to define a whole entity
+
+00:07:56.106 --> 00:08:00.676
+or you could refer to it as an object.
+
+00:08:00.677 --> 00:08:03.909
+That's a perfectly fine way to look at it, I think.
+
+00:08:03.910 --> 00:08:04.356
+It's going to have some identifier.
+
+00:08:04.357 --> 00:08:06.723
+That identifier could be anything.
+
+00:08:06.724 --> 00:08:07.431
+It doesn't have to be a string.
+
+00:08:07.432 --> 00:08:09.260
+It could really be anything, but we're going
+
+00:08:09.260 --> 00:08:11.369
+to give it a string called emacs-init.
+
+00:08:11.370 --> 00:08:13.298
+It does not matter what this identifier is,
+
+00:08:13.299 --> 00:08:17.808
+at least for our purposes.
+
+00:08:17.809 --> 00:08:19.914
+It does matter when you're linking to it,
+
+00:08:19.915 --> 00:08:22.263
+but I think nothing that I'm about to show you.
+
+00:08:22.264 --> 00:08:25.830
+This could truly be anything
+
+00:08:25.831 --> 00:08:28.180
+because it has a separate name.
+
+00:08:28.180 --> 00:08:32.131
+I'm giving it a name here, which is init.
+
+00:08:32.133 --> 00:08:34.917
+I'm just specifying the named type here
+
+00:08:34.918 --> 00:08:38.047
+and I'm specifying the bookmark type here
+
+00:08:38.048 --> 00:08:43.219
+and its values. We're going to do that.
+
+00:08:43.220 --> 00:08:47.769
+Now, if we look, we see everything we saw before,
+
+00:08:47.770 --> 00:08:52.246
+but now we have subject emacs-init.
+
+00:08:52.247 --> 00:08:55.973
+It has a type and it's named.
+
+00:08:55.974 --> 00:08:57.220
+We also see the same thing two lines down.
+
+00:08:57.220 --> 00:08:58.264
+This type is also a bookmark,
+
+00:08:58.265 --> 00:09:02.819
+but the name is init in the named/name,
+
+00:09:02.820 --> 00:09:05.966
+which is like the type is name, named,
+
+00:09:05.967 --> 00:09:08.752
+and the property is name. It's init.
+
+00:09:08.753 --> 00:09:12.661
+As you can see, this is just
+
+00:09:12.662 --> 00:09:16.331
+how everything looks.
+
+00:09:16.332 --> 00:09:18.356
+It's pretty straightforward
+
+00:09:18.357 --> 00:09:19.318
+and you can retrieve it.
+
+00:09:19.319 --> 00:09:21.603
+Now, we're looking at the database,
+
+00:09:21.604 --> 00:09:22.689
+but you don't really have to
+
+00:09:22.690 --> 00:09:23.218
+look at the database for... In fact,
+
+00:09:23.219 --> 00:09:24.222
+I think we're done looking
+
+00:09:24.223 --> 00:09:25.105
+at the triples format,
+
+00:09:25.106 --> 00:09:29.718
+because I think it's very simple.
+
+00:09:29.719 --> 00:09:31.365
+You've already got the hang of it, I think.
+
+00:09:31.366 --> 00:09:33.069
+Let's retrieve that just to make sure, yes,
+
+00:09:33.070 --> 00:09:37.980
+we can retrieve it.
+
+00:09:37.981 --> 00:09:38.247
+We're going to retrieve it and say, okay,
+
+00:09:38.248 --> 00:09:43.286
+what do we get when we load the emacs-init subject?
+
+00:09:43.287 --> 00:09:48.697
+Well, we get a plist of all of its properties,
+
+00:09:48.698 --> 00:09:55.630
+which then you can use in your application.
+
+00:09:55.631 --> 00:09:57.455
+There's many more ways to retrieve
+
+00:09:57.456 --> 00:09:59.379
+and there's many more ways to save.
+
+00:09:59.380 --> 00:10:01.904
+In fact, I think the way I did it here
+
+00:10:01.905 --> 00:10:04.015
+with set subject is probably not
+
+00:10:04.016 --> 00:10:06.781
+the right way to do it most of the time.
+
+00:10:06.782 --> 00:10:08.127
+It's usually because it'll erase everything.
+
+00:10:08.128 --> 00:10:13.740
+It's only really to be used when
+
+00:10:13.740 --> 00:10:15.710
+you're sure you control all the data,
+
+00:10:15.711 --> 00:10:16.399
+but you're never sure because there could be
+
+00:10:16.400 --> 00:10:19.610
+other packages that are also using this database,
+
+00:10:19.611 --> 00:10:20.695
+they could have their own data.
+
+00:10:20.696 --> 00:10:21.342
+You don't want to erase
+
+00:10:21.343 --> 00:10:25.014
+all the other Emacs init subject data.
+
+00:10:25.015 --> 00:10:27.699
+In this case, we did because
+
+00:10:27.700 --> 00:10:30.810
+we are confident it was a new entity,
+
+00:10:30.811 --> 00:10:31.335
+but in most cases, the right thing to do is
+
+00:10:31.336 --> 00:10:34.289
+just set it by type. Just say,
+
+00:10:34.290 --> 00:10:36.676
+we're just going to set the bookmark type,
+
+00:10:36.677 --> 00:10:37.222
+which is... The properties are this,
+
+00:10:37.223 --> 00:10:38.104
+and then the name type
+
+00:10:38.105 --> 00:10:42.814
+and the properties are that.
+
+00:10:42.815 --> 00:10:44.900
+That's a way that you could do things.
+
+00:10:44.900 --> 00:10:48.526
+There's also many retrieval types.
+
+00:10:48.527 --> 00:10:53.755
+The retrieval types:
+
+00:10:53.756 --> 00:10:56.403
+you can retrieve by a number of different ways,
+
+00:10:56.404 --> 00:10:58.869
+which I'm not going to get into,
+
+00:10:58.870 --> 00:11:01.241
+but you can read about in either the source
+
+00:11:01.242 --> 00:11:10.033
+or the readme in the package.
+
+00:11:10.034 --> 00:11:14.539
+We have backlinks as well.
+
+00:11:14.540 --> 00:11:15.862
+Let me explain what backlinks are.
+
+00:11:15.863 --> 00:11:17.172
+There's another feature of the triples.
+
+00:11:17.173 --> 00:11:19.860
+As I mentioned, these things
+
+00:11:19.861 --> 00:11:21.849
+can be thought about as links,
+
+00:11:21.850 --> 00:11:23.797
+but what could be a link in one direction
+
+00:11:23.798 --> 00:11:25.804
+could also be a link in the other direction,
+
+00:11:25.805 --> 00:11:28.395
+and we basically get this for free.
+
+00:11:28.396 --> 00:11:33.807
+Here's an example where we are again
+
+00:11:33.808 --> 00:11:35.752
+connecting toward bookmark. Here we're going to
+
+00:11:35.753 --> 00:11:38.223
+add a new type called tagged.
+
+00:11:38.224 --> 00:11:41.613
+We're going to give everything in tags.
+
+00:11:41.614 --> 00:11:45.524
+Here we're saying, okay, there's a type called tagged
+
+00:11:45.525 --> 00:11:49.234
+and it has a property called tags.
+
+00:11:49.235 --> 00:11:52.060
+This is not unique, so it's a list basically.
+
+00:11:52.060 --> 00:11:54.326
+It's a list of string.
+
+00:11:54.327 --> 00:11:58.675
+There also is a type called tag.
+
+00:11:58.676 --> 00:12:01.402
+This is for things that are tags themselves.
+
+00:12:01.403 --> 00:12:06.127
+Then it has a type called numbers
+
+00:12:06.128 --> 00:12:18.003
+and it has what we call a virtual reversed property.
+
+00:12:18.004 --> 00:12:21.075
+It's virtual because it's not actually stored.
+
+00:12:21.076 --> 00:12:23.741
+We just compute it by reversing
+
+00:12:23.742 --> 00:12:24.306
+the subject and the object.
+
+00:12:24.307 --> 00:12:29.260
+This is on tagged tags. When we query this,
+
+00:12:29.260 --> 00:12:32.006
+we can just say, okay,
+
+00:12:32.007 --> 00:12:33.268
+what are all the subjects
+
+00:12:33.269 --> 00:12:38.859
+that have tagged tags of me, the tag?
+
+00:12:38.860 --> 00:12:39.365
+In fact, let me demonstrate that for you.
+
+00:12:39.366 --> 00:12:42.139
+We're going to set the type on emacs-init.
+
+00:12:42.140 --> 00:12:45.070
+We're going to add the "tagged" type.
+
+00:12:45.071 --> 00:12:47.017
+This is the alternate way of setting data
+
+00:12:47.018 --> 00:12:48.740
+that I mentioned.
+
+00:12:48.740 --> 00:12:49.924
+This won't erase anything else.
+
+00:12:49.925 --> 00:12:51.752
+We're just adding something here.
+
+00:12:51.753 --> 00:12:54.742
+We're adding this type "tagged"
+
+00:12:54.743 --> 00:12:59.953
+to our previous bookmark emacs-init.
+
+00:12:59.954 --> 00:13:01.058
+We're going to add emacs and config
+
+00:13:01.059 --> 00:13:06.866
+as the tags. We're going to then
+
+00:13:06.867 --> 00:13:11.095
+set emacs as a tag and config as a tag.
+
+00:13:11.096 --> 00:13:15.385
+That just lets us have this virtual property.
+
+00:13:15.386 --> 00:13:16.389
+You have to do something.
+
+00:13:16.390 --> 00:13:18.733
+You can't get it out of thin air.
+
+00:13:18.734 --> 00:13:23.426
+The design decision we've made is:
+
+00:13:23.427 --> 00:13:25.508
+you at least need to tag it
+
+00:13:25.509 --> 00:13:32.660
+before you get the free property.
+
+00:13:32.660 --> 00:13:35.631
+What you should see... Let's try it out.
+
+00:13:35.632 --> 00:13:36.037
+We got the subject config,
+
+00:13:36.038 --> 00:13:37.261
+which we've set no data on.
+
+00:13:37.262 --> 00:13:40.668
+You can tell we're not sending any data.
+
+00:13:40.669 --> 00:13:44.820
+If I get that subject, the result is that
+
+00:13:44.821 --> 00:13:46.068
+it says its members are emacs-init.
+
+00:13:46.069 --> 00:13:49.878
+That's what a virtual reverse property.
+
+00:13:49.879 --> 00:13:53.606
+As we tag more things, this just
+
+00:13:53.607 --> 00:13:55.151
+continues to work because it's just doing
+
+00:13:55.152 --> 00:13:59.380
+a SQL query here.
+
+00:13:59.380 --> 00:14:01.985
+Besides showing off the backlinks function,
+
+00:14:01.986 --> 00:14:04.175
+this also shows off the general way
+
+00:14:04.176 --> 00:14:07.863
+you can have extensible entities.
+
+00:14:07.864 --> 00:14:09.391
+That is, it's possible that someone writes
+
+00:14:09.392 --> 00:14:13.062
+a bookmarks package that stores everything
+
+00:14:13.063 --> 00:14:18.054
+in a database, in the triples database,
+
+00:14:18.055 --> 00:14:21.521
+but then someone else can come and say,
+
+00:14:21.522 --> 00:14:23.590
+okay, I'm going to define my own types
+
+00:14:23.591 --> 00:14:25.739
+that's meant to work with this database,
+
+00:14:25.740 --> 00:14:28.507
+just like someone could do what I did here,
+
+00:14:28.508 --> 00:14:30.874
+just to add simple tagging.
+
+00:14:30.875 --> 00:14:32.900
+It's very easy to do.
+
+00:14:32.901 --> 00:14:35.931
+This stuff is not that easy to do otherwise.
+
+00:14:35.932 --> 00:14:38.961
+To do this in Lisp, I would say it's a little awkward.
+
+00:14:38.962 --> 00:14:42.673
+With databases, again, it's not only possible,
+
+00:14:42.674 --> 00:14:43.498
+it's relatively trivial,
+
+00:14:43.499 --> 00:14:49.828
+especially with this kind of database.
+
+00:14:49.829 --> 00:14:53.056
+The benefit is it's super easy to work with.
+
+00:14:53.057 --> 00:14:56.041
+With this kind of generic database,
+
+00:14:56.042 --> 00:15:00.311
+the drawback is it's not all that efficient
+
+00:15:00.312 --> 00:15:04.381
+as a special purpose table
+
+00:15:04.382 --> 00:15:06.191
+that is really built for efficiencies.
+
+00:15:06.192 --> 00:15:08.820
+A lot of times you have to do multiple lookups
+
+00:15:08.820 --> 00:15:09.442
+and things like that.
+
+00:15:09.443 --> 00:15:11.985
+Again, it's a trade-off for various things.
+
+00:15:11.986 --> 00:15:19.900
+As you can see, this is like
+
+00:15:19.901 --> 00:15:22.066
+one database for everything.
+
+00:15:22.067 --> 00:15:29.178
+That means that we don't have to all
+
+00:15:29.179 --> 00:15:31.944
+contribute to one giant database.
+
+00:15:31.945 --> 00:15:33.052
+All the packages that use triples,
+
+00:15:33.053 --> 00:15:35.180
+it doesn't have to be one database,
+
+00:15:35.180 --> 00:15:37.086
+but it's cool if it does.
+
+00:15:37.087 --> 00:15:39.393
+I don't know what I want to happen
+
+00:15:39.394 --> 00:15:41.220
+or what I expect to happen,
+
+00:15:41.220 --> 00:15:43.068
+but I think an interesting property is that
+
+00:15:43.069 --> 00:15:45.400
+this is a way for lots of data to live together
+
+00:15:45.400 --> 00:15:49.606
+and build off each other in ways that I think
+
+00:15:49.607 --> 00:15:55.780
+are hard to do with other forms of table layouts
+
+00:15:55.780 --> 00:15:57.007
+and things like that.
+
+00:15:57.008 --> 00:15:59.653
+Let's talk about a use of it,
+
+00:15:59.654 --> 00:16:02.643
+which is the EKG package.
+
+00:16:02.644 --> 00:16:04.589
+The EKG package is something I've written
+
+00:16:04.590 --> 00:16:07.780
+to demonstrate the triples library
+
+00:16:07.780 --> 00:16:09.409
+and use it for something I think is interesting,
+
+00:16:09.410 --> 00:16:12.420
+which is personal knowledge management systems
+
+00:16:12.420 --> 00:16:14.384
+of the same type, of the same genre
+
+00:16:14.385 --> 00:16:15.286
+that Org Roam is,
+
+00:16:15.287 --> 00:16:18.433
+but with different design decisions.
+
+00:16:18.434 --> 00:16:26.531
+I'll show it in action for a little bit.
+
+00:16:26.532 --> 00:16:28.359
+Let's just look at... it's all tag-based,
+
+00:16:28.360 --> 00:16:30.185
+same kind of tags we saw before
+
+00:16:30.186 --> 00:16:32.232
+when we were playing around
+
+00:16:32.233 --> 00:16:35.560
+with the bookmarks example application,
+
+00:16:35.224 --> 00:16:37.475
+What I want to show is: I can look at a tag.
+
+00:16:35.560 --> 00:16:35.223
+but everything here is...
+
+00:16:37.476 --> 00:16:40.287
+I could see notes with that tag.
+
+00:16:40.288 --> 00:16:42.632
+Everything you see here is in the database,
+
+00:16:42.633 --> 00:16:43.198
+no files involved.
+
+00:16:43.199 --> 00:16:46.404
+All of this is just a thing
+
+00:16:46.405 --> 00:16:49.390
+that's an entire object, the entire string.
+
+00:16:49.391 --> 00:16:56.081
+It works. It has tags.
+
+00:16:56.082 --> 00:16:59.229
+You can see not only this tag,
+
+00:16:59.230 --> 00:17:01.354
+but all the other tags associated with it
+
+00:17:01.355 --> 00:17:04.860
+and their notes.
+
+00:17:04.860 --> 00:17:10.255
+It's kind of an interesting way to do things.
+
+00:17:10.256 --> 00:17:12.260
+When you capture it, I think it's interesting.
+
+00:17:12.260 --> 00:17:22.275
+There's a lot of interesting design elements here.
+
+00:17:22.276 --> 00:17:25.819
+This tags thing is not part of the buffer.
+
+00:17:25.819 --> 00:17:28.751
+It's not like Org Roam.
+
+00:17:28.752 --> 00:17:29.116
+You see here in this other tags,
+
+00:17:29.117 --> 00:17:31.924
+these are things I've imported from Org Roam.
+
+00:17:31.925 --> 00:17:32.230
+This is why they look like they do.
+
+00:17:32.231 --> 00:17:34.020
+They have their own titles because
+
+00:17:34.020 --> 00:17:37.889
+I just wrote them all in Org Roam.
+
+00:17:37.890 --> 00:17:39.457
+What it looks like, really, for these notes
+
+00:17:39.458 --> 00:17:41.023
+is that it's just text.
+
+00:17:41.024 --> 00:17:44.615
+You really don't have to bother with this metadata.
+
+00:17:44.616 --> 00:17:46.282
+If I want another tag like pancakes,
+
+00:17:46.283 --> 00:17:53.654
+I can just add it here. Again, these tags
+
+00:17:53.655 --> 00:17:56.740
+will turn into data, triple data.
+
+00:17:56.740 --> 00:17:59.825
+The text is just a triple date[??] as well,
+
+00:17:59.826 --> 00:18:01.969
+but different to triple data.
+
+00:18:01.970 --> 00:18:08.362
+All these things are like that.
+
+00:18:08.363 --> 00:18:12.771
+You can open up any of these things, et cetera.
+
+00:18:12.772 --> 00:18:16.682
+I think the interesting thing here
+
+00:18:16.683 --> 00:18:22.596
+is to see the code. It's not super interesting
+
+00:18:22.597 --> 00:18:23.980
+to look at code for too long,
+
+00:18:23.980 --> 00:18:26.991
+but we don't have that long.
+
+00:18:26.992 --> 00:18:27.654
+Whenever we connect--
+
+00:18:27.655 --> 00:18:28.819
+I just want to point out a few things.
+
+00:18:28.820 --> 00:18:29.205
+Whenever we connect, we have a schema.
+
+00:18:29.206 --> 00:18:31.175
+We just do this. Every time we connect,
+
+00:18:31.176 --> 00:18:33.163
+we just make sure it has the right schema.
+
+00:18:33.164 --> 00:18:36.314
+This way, the user is up to date.
+
+00:18:36.315 --> 00:18:38.300
+This schema just looks exactly like
+
+00:18:38.301 --> 00:18:41.687
+stuff I showed you in the triples
+
+00:18:41.688 --> 00:18:43.532
+when we were looking at bookmarks.
+
+00:18:43.533 --> 00:18:45.100
+It's not complicated.
+
+00:18:45.100 --> 00:18:48.210
+I even have stuff here with people
+
+00:18:48.211 --> 00:18:51.538
+to use this as a person database.
+
+00:18:51.539 --> 00:18:52.104
+I haven't figured out how I'm going to use this yet,
+
+00:18:52.105 --> 00:18:54.273
+but you can see just to do this,
+
+00:18:54.274 --> 00:19:01.913
+it's really trivial and it's pretty easy.
+
+00:19:01.914 --> 00:19:02.498
+Let's show a few other things,
+
+00:19:02.499 --> 00:19:05.844
+like getting all the tags.
+
+00:19:05.845 --> 00:19:07.990
+Here, we could just say,
+
+00:19:07.991 --> 00:19:10.379
+let's get the subjects of type tag.
+
+00:19:10.380 --> 00:19:12.902
+We have all the triples,
+
+00:19:12.903 --> 00:19:15.849
+all the ones that are of type tag,
+
+00:19:15.850 --> 00:19:18.777
+all the things that have a subject.
+
+00:19:18.778 --> 00:19:22.145
+All the subjects that have links,
+
+00:19:22.146 --> 00:19:28.337
+that have this type, this tag in it,
+
+00:19:28.338 --> 00:19:30.660
+we can return them all.
+
+00:19:30.426 --> 00:19:32.674
+of all these objects.
+
+00:19:30.660 --> 00:19:30.425
+Basically, it just gives you a list
+
+00:19:32.675 --> 00:19:33.243
+Again, you can think of these things as objects.
+
+00:19:33.244 --> 00:19:35.433
+All the objects of type tag,
+
+00:19:35.434 --> 00:19:37.320
+we'll just get them all. Super, super simple.
+
+00:19:37.321 --> 00:19:39.585
+Triples gives you this functionality
+
+00:19:39.586 --> 00:19:43.780
+out of the box. It's not that complicated.
+
+00:19:43.780 --> 00:19:45.167
+What I would like to show,
+
+00:19:45.168 --> 00:19:49.518
+and that shows my thesis for this whole talk,
+
+00:19:49.519 --> 00:19:52.785
+is this rename tag. Now, think about
+
+00:19:52.786 --> 00:19:54.150
+how you would rename a tag in Org Roam
+
+00:19:54.151 --> 00:20:03.013
+or anything where the tag is part of the files.
+
+00:20:03.014 --> 00:20:05.280
+It's like how you would re-tag everything
+
+00:20:05.280 --> 00:20:09.869
+in Org Mode. It's complicated and error-prone
+
+00:20:09.870 --> 00:20:12.556
+and slow. This is anything,
+
+00:20:12.557 --> 00:20:14.763
+this is instantaneous and super easy.
+
+00:20:14.764 --> 00:20:17.255
+Look, that's it. There's not that many places
+
+00:20:17.256 --> 00:20:19.540
+for an error to live here.
+
+00:20:19.540 --> 00:20:21.507
+One thing I would like to point out
+
+00:20:21.508 --> 00:20:23.337
+is that we are doing direct,
+
+00:20:23.338 --> 00:20:24.320
+not everything has to go through
+
+00:20:24.321 --> 00:20:28.292
+the triples package. Maybe it should,
+
+00:20:28.293 --> 00:20:31.660
+but the triples package is a fixed format,
+
+00:20:31.660 --> 00:20:33.906
+which is why it's okay--
+
+00:20:33.907 --> 00:20:34.069
+whether it's a good idea, I'm not sure,
+
+00:20:34.070 --> 00:20:39.863
+but it's okay for client packages
+
+00:20:39.864 --> 00:20:42.833
+to just directly manipulate the tables.
+
+00:20:42.834 --> 00:20:43.937
+Here, we're just doing it just to
+
+00:20:43.938 --> 00:20:45.265
+update all the tags
+
+00:20:45.266 --> 00:20:47.891
+and then remove and set types
+
+00:20:47.892 --> 00:20:49.119
+so that the correct thing happens.
+
+00:20:49.120 --> 00:20:52.146
+As you can see, it's super, super simple.
+
+00:20:52.147 --> 00:20:55.374
+I think this proves my thesis about
+
+00:20:55.375 --> 00:21:01.526
+the advantages of applications with SQLite.
+
+00:21:01.527 --> 00:21:02.430
+Thank you for listening.
+
+00:21:02.431 --> 00:21:05.876
+I hope this puts ideas in your minds
+
+00:21:05.877 --> 00:21:09.827
+about taking advantage of this functionality.
+
+00:21:09.828 --> 00:21:11.935
+I hope to see more things
+
+00:21:11.936 --> 00:21:12.180
+using the triples library
+
+00:21:12.180 --> 00:21:16.017
+or otherwise that take advantage of this.
+
+00:21:16.018 --> 00:21:17.660
+Thank you for your time.
diff --git a/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main--chapters.vtt b/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main--chapters.vtt
new file mode 100644
index 00000000..ba390789
--- /dev/null
+++ b/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main--chapters.vtt
@@ -0,0 +1,68 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:26.039
+Introduction
+
+00:00:26.040 --> 00:01:54.359
+The 2020 Emacs User Survey
+
+00:01:54.360 --> 00:03:18.559
+The design of the survey
+
+00:03:18.560 --> 00:04:01.020
+Survey frameworks
+
+00:04:01.021 --> 00:05:40.199
+Writing a new survey framework in Julia
+
+00:05:40.200 --> 00:06:50.559
+In practice
+
+00:06:50.560 --> 00:07:39.599
+Results
+
+00:07:39.600 --> 00:09:11.159
+Going forward
+
+00:09:11.160 --> 00:11:16.999
+Responses
+
+00:11:17.000 --> 00:12:32.279
+Geography
+
+00:12:32.280 --> 00:14:04.439
+Gender
+
+00:14:04.440 --> 00:16:11.319
+Occupations
+
+00:16:11.320 --> 00:17:02.439
+Free and open source software
+
+00:17:02.440 --> 00:17:56.359
+Emacs versions
+
+00:17:56.360 --> 00:19:25.799
+Languages
+
+00:19:25.800 --> 00:20:03.399
+Prose
+
+00:20:03.400 --> 00:21:04.919
+Packages
+
+00:21:04.920 --> 00:21:38.439
+Documentation
+
+00:21:38.440 --> 00:22:44.199
+Moving forward
+
+00:22:44.200 --> 00:23:26.199
+Time
+
+00:23:26.200 --> 00:24:25.199
+How long the survey is open for
+
+00:24:25.200 --> 00:25:36.960
+Plan going forward
diff --git a/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.vtt b/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.vtt
new file mode 100644
index 00000000..62844b3d
--- /dev/null
+++ b/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.vtt
@@ -0,0 +1,1614 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:06.839
+Hello everyone and thanks for tuning in. I'm Timothy,
+
+00:00:06.840 --> 00:00:08.559
+and in this talk, we'll be going over
+
+00:00:08.560 --> 00:00:11.342
+the 2022 Emacs User Survey.
+
+00:00:11.970 --> 00:00:15.078
+Since this is the first time we're discussing this,
+
+00:00:15.079 --> 00:00:18.399
+we'll be going over the survey itself a bit,
+
+00:00:18.400 --> 00:00:21.199
+how it's being put together and run,
+
+00:00:21.200 --> 00:00:24.199
+and then we'll have a little taste of the results
+
+00:00:24.200 --> 00:00:26.039
+with more analysis to be published in the future.
+
+NOTE The 2020 Emacs User Survey
+
+00:00:26.040 --> 00:00:32.399
+To start with though, a bit of background.
+
+00:00:32.400 --> 00:00:36.679
+So in 2020, we had an Emacs User Survey
+
+00:00:36.680 --> 00:00:38.839
+run by Adrien Brochard.
+
+00:00:38.840 --> 00:00:41.359
+Now this is, to the best of my knowledge,
+
+00:00:41.360 --> 00:00:45.559
+the first time that a large-scale Emacs User Survey
+
+00:00:45.560 --> 00:00:48.039
+has actually been run.
+
+00:00:48.040 --> 00:00:50.439
+About 7,000 people responded to the survey,
+
+00:00:50.440 --> 00:00:53.239
+so in many respects, it was quite successful.
+
+00:00:53.240 --> 00:00:56.519
+And what's significant about this is that
+
+00:00:56.520 --> 00:00:57.679
+with this being the first time
+
+00:00:57.680 --> 00:00:59.999
+that a large-scale survey has been run,
+
+00:01:00.000 --> 00:01:01.719
+it actually provided some insight
+
+00:01:01.720 --> 00:01:06.719
+into questions about how the community is using Emacs
+
+00:01:06.720 --> 00:01:09.959
+that allow for much better guesses
+
+00:01:09.960 --> 00:01:15.359
+than just speculation based on the small number of people
+
+00:01:15.360 --> 00:01:16.919
+who respond on the mailing list usually.
+
+00:01:16.920 --> 00:01:24.879
+So, why are we doing another survey? Well, to start with,
+
+00:01:24.880 --> 00:01:28.799
+in order to get the most value out of an Emacs User Survey,
+
+00:01:28.800 --> 00:01:32.519
+it's quite helpful if the information in it is recent.
+
+00:01:32.520 --> 00:01:35.439
+Furthermore, we can actually get some more value
+
+00:01:35.440 --> 00:01:38.039
+if we can examine trends,
+
+00:01:38.040 --> 00:01:41.199
+shifts in the way that people are using Emacs,
+
+00:01:41.200 --> 00:01:42.919
+where the pain points lie,
+
+00:01:42.920 --> 00:01:45.479
+what people are enjoying the most, etc.
+
+00:01:45.480 --> 00:01:46.520
+So in both of these respects,
+
+00:01:46.521 --> 00:01:49.599
+it's to our benefit if the survey
+
+00:01:49.600 --> 00:01:51.519
+is actually a regular event,
+
+00:01:51.520 --> 00:01:54.359
+instead of just something that's run once.
+
+NOTE The design of the survey
+
+00:01:54.360 --> 00:01:57.159
+Now, with this in mind,
+
+00:01:57.160 --> 00:02:00.959
+we ran the 2022 Emacs User Survey with the plan
+
+00:02:00.960 --> 00:02:05.079
+that this will actually become an annual event.
+
+00:02:05.080 --> 00:02:08.999
+In the design of the survey, there are a few goals here.
+
+00:02:09.000 --> 00:02:11.520
+The main one is of the user community.
+
+00:02:11.521 --> 00:02:14.520
+Now, user community is a rather nebulous phrase.
+
+00:02:14.521 --> 00:02:17.520
+In this case, what's meant in particular
+
+00:02:17.521 --> 00:02:21.020
+is value in questions, for example,
+
+00:02:21.021 --> 00:02:23.839
+things like pain points with Emacs,
+
+00:02:23.840 --> 00:02:27.119
+which versions people are using,
+
+00:02:27.120 --> 00:02:30.239
+which capabilities people are making the most use of,
+
+00:02:30.240 --> 00:02:34.519
+which could potentially be helpful to both emacs-devel
+
+00:02:34.520 --> 00:02:36.520
+but also our collection of Emacs package maintainers
+
+00:02:36.521 --> 00:02:38.020
+and the whole community.
+
+00:02:38.021 --> 00:02:40.799
+Actually, I think going beyond just the packages,
+
+00:02:40.800 --> 00:02:46.039
+we've also got the people who develop tutorials, guides,
+
+00:02:46.040 --> 00:02:49.279
+and all of that sort of surrounding activity,
+
+00:02:49.280 --> 00:02:51.020
+which can benefit from a clear understanding
+
+00:02:51.021 --> 00:02:56.020
+of how Emacs users use Emacs.
+
+00:02:56.021 --> 00:02:58.519
+Separately to that,
+
+00:02:58.520 --> 00:03:01.639
+I think as an Emacs user myself,
+
+00:03:01.640 --> 00:03:02.839
+that it's rather interesting to see
+
+00:03:02.840 --> 00:03:04.479
+how other people are using Emacs
+
+00:03:04.480 --> 00:03:07.079
+and what their experience is. So yes, basically,
+
+00:03:07.080 --> 00:03:08.559
+you've got utility and interest
+
+00:03:08.560 --> 00:03:10.719
+as the two separate driving factors
+
+00:03:10.720 --> 00:03:14.020
+as we try to pick questions, which actually can give us
+
+00:03:14.021 --> 00:03:16.520
+all of this without taking up too much
+
+00:03:16.521 --> 00:03:18.559
+of the respondents time.
+
+NOTE Survey frameworks
+
+00:03:18.560 --> 00:03:24.399
+Now, last time in 2020, the Emacs survey that Adrien ran
+
+00:03:24.400 --> 00:03:27.079
+used, I think Google Forms, if I recall correctly,
+
+00:03:27.080 --> 00:03:28.799
+with an option to send in responses manually.
+
+00:03:28.800 --> 00:03:33.159
+This worked, but it's not great,
+
+00:03:33.160 --> 00:03:35.079
+particularly given that this is for a survey
+
+00:03:35.080 --> 00:03:37.199
+being run in an ardently FOSS community.
+
+00:03:37.200 --> 00:03:38.959
+Ideally, we actually want
+
+00:03:38.960 --> 00:03:40.799
+to find a survey framework
+
+00:03:40.800 --> 00:03:44.319
+that respects the priorities of users, is open source,
+
+00:03:44.320 --> 00:03:46.359
+ideally free and open source,
+
+00:03:46.360 --> 00:03:49.999
+and is a relatively pleasant experience.
+
+00:03:50.000 --> 00:03:53.079
+Unfortunately, looking at available options,
+
+00:03:53.080 --> 00:03:56.879
+it seems that one always has to compromise on at least one,
+
+00:03:56.880 --> 00:03:58.020
+if not all of those criteria,
+
+00:03:58.021 --> 00:04:01.020
+which is quite far from ideal.
+
+NOTE Writing a new survey framework in Julia
+
+00:04:01.021 --> 00:04:04.359
+So what's the obvious solution?
+
+00:04:04.360 --> 00:04:06.639
+Okay, we should just write a new survey framework.
+
+00:04:06.640 --> 00:04:10.679
+Obviously, this is easier said than done.
+
+00:04:10.680 --> 00:04:12.239
+But around a year ago,
+
+00:04:12.240 --> 00:04:13.639
+I actually started doing exactly this.
+
+00:04:13.640 --> 00:04:17.679
+I've used the programming language Julia quite a bit
+
+00:04:17.680 --> 00:04:21.020
+on a day to day basis. And there just so happens to be
+
+00:04:21.021 --> 00:04:23.199
+a web framework for that called Genie.
+
+00:04:23.200 --> 00:04:24.719
+So I thought I'd give it a shot.
+
+00:04:24.720 --> 00:04:26.559
+And well, here we are today.
+
+00:04:26.560 --> 00:04:28.479
+I ended up putting something together,
+
+00:04:28.480 --> 00:04:34.279
+which could take a set of questions written in Julia
+
+00:04:34.280 --> 00:04:35.839
+and using a survey library,
+
+00:04:35.840 --> 00:04:38.799
+actually pass that into this helpful structure
+
+00:04:38.800 --> 00:04:44.119
+and then construct HTML forms based on that,
+
+00:04:44.120 --> 00:04:47.020
+and ingest results from the HTML forms,
+
+00:04:47.021 --> 00:04:48.520
+and just sort of handle that altogether.
+
+00:04:48.521 --> 00:04:52.439
+Now, all of this ends up being fed into an SQLite DB.
+
+00:04:52.440 --> 00:04:55.159
+So everything's there, even part responses.
+
+00:04:55.160 --> 00:04:57.599
+One of the goals with the actual design of this has been
+
+00:04:57.600 --> 00:05:01.119
+to just minimize what's actually done on the client side.
+
+00:05:01.120 --> 00:05:05.559
+So that means JavaScript, cookies, the whole lot.
+
+00:05:05.560 --> 00:05:08.759
+Basically, as far as this could reasonably be taken,
+
+00:05:08.760 --> 00:05:14.599
+we've just got static HTML being shoved to the user,
+
+00:05:14.600 --> 00:05:16.719
+or respondent rather. And then we just
+
+00:05:16.720 --> 00:05:18.519
+take an HTTP post request back
+
+00:05:18.520 --> 00:05:20.919
+and update the results that way.
+
+00:05:20.920 --> 00:05:24.239
+Now by doing things like actually paging the survey,
+
+00:05:24.240 --> 00:05:26.559
+we can allow for incremental saving of results
+
+00:05:26.560 --> 00:05:30.559
+and a few other niceties while essentially preserving
+
+00:05:30.560 --> 00:05:36.319
+an experience that doesn't really require any data
+
+00:05:36.320 --> 00:05:37.319
+of any particular capabilities, which is sort of
+
+00:05:37.320 --> 00:05:40.199
+a nice, clean, minimal experience as far as I'm concerned.
+
+NOTE In practice
+
+00:05:40.200 --> 00:05:45.679
+So how does this actually look like in practice?
+
+00:05:45.680 --> 00:05:48.119
+Well, one of the nice things about this is
+
+00:05:48.120 --> 00:05:51.479
+because the question itself is written in Julia,
+
+00:05:51.480 --> 00:05:54.279
+we can get some nice features like custom validators
+
+00:05:54.280 --> 00:05:57.919
+and other fancy behavior and directly specify
+
+00:05:57.920 --> 00:06:01.119
+how we actually want questions to be registered
+
+00:06:01.120 --> 00:06:04.439
+in the database. So here we have, for example,
+
+00:06:04.440 --> 00:06:06.679
+two questions we had from this email survey.
+
+00:06:06.680 --> 00:06:09.959
+One is a multi-select. Another one is just putting in
+
+00:06:09.960 --> 00:06:14.399
+the number of years people have used Emacs for.
+
+00:06:14.400 --> 00:06:16.159
+I think this gives a brief overview of the capabilities.
+
+00:06:16.160 --> 00:06:19.599
+One of the things I'd like to draw particular attention
+
+00:06:19.600 --> 00:06:20.759
+to here is in the multi-select,
+
+00:06:20.760 --> 00:06:22.199
+you'll see an array of options,
+
+00:06:22.200 --> 00:06:24.319
+the first one of which actually maps for different value
+
+00:06:24.320 --> 00:06:25.879
+to be stored for convenience.
+
+00:06:25.880 --> 00:06:29.119
+And then the final one is a special one, :other,
+
+00:06:29.120 --> 00:06:30.359
+and you can see that's a bit different to the rest
+
+00:06:30.360 --> 00:06:32.599
+where it's got that colon function,
+
+00:06:32.600 --> 00:06:33.719
+it's a symbol, not a string.
+
+00:06:33.720 --> 00:06:37.639
+And this is quite a nice one because the way
+
+00:06:37.640 --> 00:06:39.279
+that this framework's been designed,
+
+00:06:39.280 --> 00:06:41.759
+when we have an :other value like that,
+
+00:06:41.760 --> 00:06:44.199
+instead of it just being a sort of tick box "Other",
+
+00:06:44.200 --> 00:06:47.199
+it actually provides the option to write
+
+00:06:47.200 --> 00:06:50.559
+your own different response to all of the above.
+
+NOTE Results
+
+00:06:50.560 --> 00:06:55.319
+Okay, so at the very end, we've now got
+
+00:06:55.320 --> 00:06:58.519
+a completely FOSS survey framework, rather nice.
+
+00:06:58.520 --> 00:07:00.020
+So the set of what were these...
+
+00:07:00.021 --> 00:07:01.119
+Decent array of input types.
+
+00:07:01.120 --> 00:07:02.639
+It would be nice to expand, but at the moment
+
+00:07:02.640 --> 00:07:04.599
+I think we could just about describe it as a rich set.
+
+00:07:04.600 --> 00:07:07.159
+Zero JavaScript required, but a little bit useful
+
+00:07:07.160 --> 00:07:08.079
+for progressive enhancement.
+
+00:07:08.080 --> 00:07:12.759
+As demonstrated, we can get some fancy validation going on.
+
+00:07:12.760 --> 00:07:16.679
+And then because we've got the results
+
+00:07:16.680 --> 00:07:18.559
+tied into this quite nicely,
+
+00:07:18.560 --> 00:07:20.999
+we can actually have them available live
+
+00:07:21.000 --> 00:07:22.999
+and in quite a number of formats.
+
+00:07:23.000 --> 00:07:25.439
+I'm not sure how much you saw in the architecture diagram,
+
+00:07:25.440 --> 00:07:27.079
+but we've got all sorts of things here.
+
+00:07:27.080 --> 00:07:29.679
+CSV, TSV, plain text, JSON,
+
+00:07:29.680 --> 00:07:32.119
+just grab a copy of the SQLite database,
+
+00:07:32.120 --> 00:07:33.319
+but only the relevant bits.
+
+00:07:33.320 --> 00:07:35.879
+Or something called JLD2,
+
+00:07:35.880 --> 00:07:37.999
+which preserves a lot of type information
+
+00:07:38.000 --> 00:07:39.599
+and a few other nice things.
+
+NOTE Going forward
+
+00:07:39.600 --> 00:07:43.799
+Now, what are we going to do going forward from here?
+
+00:07:43.800 --> 00:07:46.159
+Well, there are a few minor issues here.
+
+00:07:46.160 --> 00:07:48.599
+For example, there's a memory leak issue which is going on,
+
+00:07:48.600 --> 00:07:51.839
+resulting in the service being restarted,
+
+00:07:51.840 --> 00:07:54.519
+I think every day or two, while the survey was running.
+
+00:07:54.520 --> 00:07:56.159
+I actually have the suspicion
+
+00:07:56.160 --> 00:07:57.639
+that that's largely responsible for
+
+00:07:57.640 --> 00:08:01.479
+about 1% of respondents, which is about 75 people,
+
+00:08:01.480 --> 00:08:04.399
+who described the survey experience as not great.
+
+00:08:04.400 --> 00:08:08.199
+Overall though, the feedback has been quite positive.
+
+00:08:08.200 --> 00:08:09.919
+There's been some detailed written feedback,
+
+00:08:09.920 --> 00:08:12.799
+but just from the quick great/okay/not great options,
+
+00:08:12.800 --> 00:08:14.839
+we had about two-thirds of people saying
+
+00:08:14.840 --> 00:08:16.839
+that the user experience was great,
+
+00:08:16.840 --> 00:08:19.199
+which is really nice to hear the first time being run.
+
+00:08:19.200 --> 00:08:22.839
+A few other things would be nice to add, for example,
+
+00:08:22.840 --> 00:08:25.759
+in future control flow. By this, I mean
+
+00:08:25.760 --> 00:08:27.879
+the option to present different questions
+
+00:08:27.880 --> 00:08:28.999
+based on previous answers
+
+00:08:29.000 --> 00:08:31.199
+would be quite nice to streamline the experience.
+
+00:08:31.200 --> 00:08:33.519
+For example, having a set of questions
+
+00:08:33.520 --> 00:08:37.239
+for first-time respondents or people who are involved
+
+00:08:37.240 --> 00:08:42.239
+in the packaging side of things
+
+00:08:42.240 --> 00:08:45.079
+without actually cluttering the experience
+
+00:08:45.080 --> 00:08:46.039
+for everybody else. That'd be quite nice.
+
+00:08:46.040 --> 00:08:48.599
+Further to this, all of this,
+
+00:08:48.600 --> 00:08:51.879
+I think on top of the standard web interface,
+
+00:08:51.880 --> 00:08:53.599
+it'd be quite nice to actually write a server API.
+
+00:08:53.600 --> 00:08:55.520
+And the particular reason why I mentioned this
+
+00:08:55.521 --> 00:08:58.020
+is because this could potentially allow for
+
+00:08:58.021 --> 00:09:00.359
+basically an Emacs survey package.
+
+00:09:00.360 --> 00:09:03.039
+I mean, we already use Emacs for so many things,
+
+00:09:03.040 --> 00:09:05.519
+might as well fill the survey out from within it as well.
+
+00:09:05.520 --> 00:09:11.159
+Okay, so this is how the survey has been conducted.
+
+NOTE Responses
+
+00:09:11.160 --> 00:09:13.679
+Now, what are the responses look like?
+
+00:09:13.680 --> 00:09:16.039
+Now, at this stage, I was actually hoping
+
+00:09:16.040 --> 00:09:18.919
+to get into some somewhat sophisticated analysis
+
+00:09:18.920 --> 00:09:22.599
+because there's quite a bit that you can dig out
+
+00:09:22.600 --> 00:09:24.239
+of the data responses that we've received.
+
+00:09:24.240 --> 00:09:27.879
+However, unfortunately, I've been much more limited on time
+
+00:09:27.880 --> 00:09:30.039
+than I'd hoped for, so that's going to have to come later.
+
+00:09:30.040 --> 00:09:33.559
+For now, we're just going to take a bit of a peek
+
+00:09:33.560 --> 00:09:35.959
+at some of the really basic answers.
+
+00:09:35.960 --> 00:09:38.239
+Well, it's not even really analysis.
+
+00:09:38.240 --> 00:09:40.239
+Expect to see lots of pie charts, basically.
+
+00:09:40.240 --> 00:09:42.999
+But there's still a bit of interest there,
+
+00:09:43.000 --> 00:09:44.359
+so we'll go through a bit of that
+
+00:09:44.360 --> 00:09:47.119
+and just give a bit of a tease
+
+00:09:47.120 --> 00:09:50.319
+as to what might come in the future.
+
+00:09:50.320 --> 00:09:51.919
+So to sum up for starters,
+
+00:09:51.920 --> 00:09:55.079
+we've had about 6,500 responses.
+
+00:09:55.080 --> 00:09:58.359
+It is worth noting that a thousand of those are partials,
+
+00:09:58.360 --> 00:10:02.199
+so people who gave up on the survey partway through.
+
+00:10:02.200 --> 00:10:05.399
+Given that the 2020 survey had about 7000 responses,
+
+00:10:05.400 --> 00:10:06.999
+I'll tell you we're basically on par here.
+
+00:10:07.000 --> 00:10:10.399
+This ran over a month and interestingly,
+
+00:10:10.400 --> 00:10:12.239
+about half of these respondents
+
+00:10:12.240 --> 00:10:13.799
+did not participate in the 2020 survey.
+
+00:10:13.800 --> 00:10:16.199
+I think at this point,
+
+00:10:16.200 --> 00:10:17.679
+it's not really clear what to make of that.
+
+00:10:17.680 --> 00:10:21.359
+There's been a two-year gap between the surveys.
+
+00:10:21.360 --> 00:10:25.159
+It's been done, well, it's been done quite differently,
+
+00:10:25.160 --> 00:10:29.639
+and yes, there's not enough, really, to say.
+
+00:10:29.640 --> 00:10:31.999
+What could be interesting though is actually,
+
+00:10:32.000 --> 00:10:33.839
+once this starts running regularly,
+
+00:10:33.840 --> 00:10:36.799
+we can see whether there's regular churn
+
+00:10:36.800 --> 00:10:38.520
+in the survey respondents,
+
+00:10:38.521 --> 00:10:40.020
+or if we have a consistent core
+
+00:10:40.021 --> 00:10:42.020
+with people who respond each year,
+
+00:10:42.021 --> 00:10:46.159
+and then just people who come by every now and then and go,
+
+00:10:46.160 --> 00:10:47.759
+"Oh, why not respond to this year's survey?"
+
+00:10:47.760 --> 00:10:51.479
+But we're going to have to wait a bit to actually see
+
+00:10:51.480 --> 00:10:52.759
+how people treat the survey.
+
+00:10:52.760 --> 00:10:57.519
+Now these responses came from quite a wide range of places
+
+00:10:57.520 --> 00:11:02.519
+we've got 115 nations represented here. Collectively,
+
+00:11:02.520 --> 00:11:04.039
+these ones have spent about a thousand hours
+
+00:11:04.040 --> 00:11:06.959
+giving us information. So I think, if nothing else,
+
+00:11:06.960 --> 00:11:10.479
+just from the effort that people have put into
+
+00:11:10.480 --> 00:11:12.879
+actually giving us useful data to work with,
+
+00:11:12.880 --> 00:11:13.599
+it's worth giving at least a good effort
+
+00:11:13.600 --> 00:11:15.999
+to actually trying to extract some value
+
+00:11:16.000 --> 00:11:16.999
+out of these responses.
+
+NOTE Geography
+
+00:11:17.000 --> 00:11:20.879
+Now, overall we found a lot of responses came from America,
+
+00:11:20.880 --> 00:11:23.199
+no surprises there, but as mentioned,
+
+00:11:23.200 --> 00:11:24.020
+we've got a good mix around the globe.
+
+00:11:24.021 --> 00:11:29.159
+The usual suspects for the rest of the responses,
+
+00:11:29.160 --> 00:11:33.279
+a whole bunch in Europe, a whole bunch around Asia,
+
+00:11:33.280 --> 00:11:36.799
+a bit in Australasia as well and yes,
+
+00:11:36.800 --> 00:11:38.959
+there's nothing particularly surprising here,
+
+00:11:38.960 --> 00:11:41.399
+there's a lot of inline expectations.
+
+00:11:41.400 --> 00:11:42.839
+What I find a bit more interesting, though,
+
+00:11:42.840 --> 00:11:45.359
+is if we actually normalise
+
+00:11:45.360 --> 00:11:48.079
+the number of responses from each nation
+
+00:11:48.080 --> 00:11:50.079
+by the population of said nations,
+
+00:11:50.080 --> 00:11:54.239
+essentially giving a popularity of Emacs
+
+00:11:54.240 --> 00:11:57.359
+or at least of Emacs early respondents for each nation,
+
+00:11:57.360 --> 00:12:00.919
+we end up finding that Europe, particularly Scandinavia,
+
+00:12:00.920 --> 00:12:02.199
+becomes a bit of a hotspot.
+
+00:12:02.200 --> 00:12:04.519
+So I'm not sure what's going on
+
+00:12:04.520 --> 00:12:07.319
+in Sweden, Finland and Norway,
+
+00:12:07.320 --> 00:12:10.919
+but it seems to be particularly popular around there.
+
+00:12:10.920 --> 00:12:14.199
+It's also worth noting that we now find
+
+00:12:14.200 --> 00:12:18.319
+that the proportion of respondents
+
+00:12:18.320 --> 00:12:21.799
+in countries like America, Canada, Australia
+
+00:12:21.800 --> 00:12:24.039
+and most of Europe actually becomes
+
+00:12:24.040 --> 00:12:26.399
+quite comparable with each other,
+
+00:12:26.400 --> 00:12:30.239
+which yes, once again, sort of lines up
+
+00:12:30.240 --> 00:12:32.279
+with these responses, expectations from the last slide.
+
+NOTE Gender
+
+00:12:32.280 --> 00:12:36.279
+Okay, getting into some of the other
+
+00:12:36.280 --> 00:12:38.599
+demographic information.
+
+00:12:38.600 --> 00:12:40.319
+The demographic information was new to this survey.
+
+00:12:40.320 --> 00:12:44.479
+In the 2020 survey, people were asked what they think
+
+00:12:44.480 --> 00:12:47.199
+of being asked about some demographic information
+
+00:12:47.200 --> 00:12:50.199
+in a future survey, and the overwhelming response is, "Sure,
+
+00:12:50.200 --> 00:12:52.759
+I don't really mind." And so that's what we've done here.
+
+00:12:52.760 --> 00:12:56.279
+One of the ones of somewhat interest
+
+00:12:56.280 --> 00:12:59.759
+is the age gender breakdown. So we expect Emacs
+
+00:12:59.760 --> 00:13:03.119
+to be used predominantly among people in software
+
+00:13:03.120 --> 00:13:05.839
+and programming and within the industry,
+
+00:13:05.840 --> 00:13:08.599
+I think it's quite widely documented
+
+00:13:08.600 --> 00:13:14.520
+to have about a sort of 75-25%, roughly, split
+
+00:13:14.521 --> 00:13:14.759
+between male and female.
+
+00:13:14.760 --> 00:13:19.359
+Interestingly, in Emacs,
+
+00:13:19.360 --> 00:13:22.879
+it's a much more aggressively-biased result.
+
+00:13:22.880 --> 00:13:28.679
+So we had about 96% of respondents are male
+
+00:13:28.680 --> 00:13:34.559
+with just 4% for the rest. Interestingly, though,
+
+00:13:34.560 --> 00:13:35.359
+if we look at the young respondents,
+
+00:13:35.360 --> 00:13:41.719
+say for example, under 25, we go from 96% male to 88%.
+
+00:13:41.720 --> 00:13:46.119
+So it's fair to say that the young respondents are
+
+00:13:46.120 --> 00:13:49.199
+in this respect, a somewhat more diverse group.
+
+00:13:49.200 --> 00:13:52.399
+Hopefully, as future surveys go on,
+
+00:13:52.400 --> 00:13:54.399
+we'll see this continue not die off
+
+00:13:54.400 --> 00:13:58.719
+to the sort of well, at this point,
+
+00:13:58.720 --> 00:14:02.919
+it's more like 99% if you look at the older ages.
+
+00:14:02.920 --> 00:14:04.439
+But we'll see.
+
+NOTE Occupations
+
+00:14:04.440 --> 00:14:07.919
+Occupations was an interesting slide as well.
+
+00:14:07.920 --> 00:14:09.399
+Interesting question as well.
+
+00:14:09.400 --> 00:14:11.559
+We've got the usual suspects here. I mean,
+
+00:14:11.560 --> 00:14:15.079
+it's a text editor, well, Lisp machine
+
+00:14:15.080 --> 00:14:17.639
+masquerading as a text editor, mainly used for programming,
+
+00:14:17.640 --> 00:14:20.639
+and so we expect lots of software development
+
+00:14:20.640 --> 00:14:23.519
+and that sort of thing. But that's only about
+
+00:14:23.520 --> 00:14:25.399
+just over half of the responses.
+
+00:14:25.400 --> 00:14:28.679
+We've got a huge chunk from academia,
+
+00:14:28.680 --> 00:14:29.999
+and then really just an odd bag
+
+00:14:30.000 --> 00:14:30.879
+of all sorts of other things,
+
+00:14:30.880 --> 00:14:33.079
+including things which you wouldn't really associate
+
+00:14:33.080 --> 00:14:35.359
+with programming and software at all.
+
+00:14:35.360 --> 00:14:39.639
+Things like creative writing, publishing, legal, yes.
+
+00:14:39.640 --> 00:14:41.719
+And then you've got this chunk of Other,
+
+00:14:41.720 --> 00:14:43.239
+which is I think here is
+
+00:14:43.240 --> 00:14:46.679
+the fourth most popular option here.
+
+00:14:46.680 --> 00:14:49.399
+And what we have here is about 500 different responses
+
+00:14:49.400 --> 00:14:51.839
+from a huge range of activities.
+
+00:14:51.840 --> 00:14:54.359
+It's really quite interesting to read things like
+
+00:14:54.360 --> 00:14:56.919
+I think, things like "naval officer",
+
+00:14:56.920 --> 00:15:01.319
+and just... All sorts of surprising occupations for Emacs.
+
+00:15:01.320 --> 00:15:04.799
+And I think this is a particular area
+
+00:15:04.800 --> 00:15:10.199
+because I imagine compared to other code editors,
+
+00:15:10.200 --> 00:15:13.879
+sort of your VS Code, remember like
+
+00:15:13.880 --> 00:15:18.959
+that Emacs may have a particularly diverse set
+
+00:15:18.960 --> 00:15:23.599
+of industry occupations represented in its users.
+
+00:15:23.600 --> 00:15:28.359
+Now, if you look at where the response actually came from,
+
+00:15:28.360 --> 00:15:31.039
+we've got the usual suspects up top,
+
+00:15:31.040 --> 00:15:33.959
+Hacker News and r/emacs.
+
+00:15:33.960 --> 00:15:40.119
+But then we actually get a much more graduated breakdown
+
+00:15:40.120 --> 00:15:43.679
+than in the 2020 survey.
+
+00:15:43.680 --> 00:15:46.279
+We do think familiar results here like IRC, Telegram,
+
+00:15:46.280 --> 00:15:48.639
+Emacs China, and Twitter.
+
+00:15:48.640 --> 00:15:50.839
+But now you've got a few new entries,
+
+00:15:50.840 --> 00:15:53.519
+things like the Fediverse, Discourse, Matrix,
+
+00:15:53.520 --> 00:15:56.119
+which didn't pop up previously.
+
+00:15:56.120 --> 00:15:59.079
+So I think this is yes, quite a nice sign in terms of
+
+00:15:59.080 --> 00:16:02.520
+actually hitting a wide range
+
+00:16:02.521 --> 00:16:05.999
+of pockets of Emacs users across different platforms,
+
+00:16:06.000 --> 00:16:10.319
+which bodes well for the potential representiveness
+
+00:16:10.320 --> 00:16:11.319
+of this survey.
+
+NOTE Free and open source software
+
+00:16:11.320 --> 00:16:15.119
+Unsurprisingly, if we're talking about Emacs
+
+00:16:15.120 --> 00:16:17.919
+and particularly people who are quite engaged in it,
+
+00:16:17.920 --> 00:16:19.679
+which are the respondents to this survey,
+
+00:16:19.680 --> 00:16:25.359
+we find that we also get quite a high degree of care
+
+00:16:25.360 --> 00:16:27.479
+for free and open source software.
+
+00:16:27.480 --> 00:16:30.519
+So if you have a look here,
+
+00:16:30.520 --> 00:16:35.279
+only about a quarter of users
+
+00:16:35.280 --> 00:16:39.799
+didn't express a strong preference towards FOSS software.
+
+00:16:39.800 --> 00:16:43.759
+In fact, we had over a quarter saying that
+
+00:16:43.760 --> 00:16:49.239
+they would accept significant or even any compromise
+
+00:16:49.240 --> 00:16:52.199
+to use a FOSS user software
+
+00:16:52.200 --> 00:16:55.759
+over a proprietary alternative,
+
+00:16:55.760 --> 00:16:59.679
+which given the nature of Emacs,
+
+00:16:59.680 --> 00:17:00.639
+not terribly surprising,
+
+00:17:00.640 --> 00:17:02.439
+but a strong showing nonetheless.
+
+NOTE Emacs versions
+
+00:17:02.440 --> 00:17:05.599
+Now, let's start getting to things
+
+00:17:05.600 --> 00:17:07.719
+which are actually useful for
+
+00:17:07.720 --> 00:17:11.479
+potential Emacs development and packaging.
+
+00:17:11.480 --> 00:17:13.599
+If you're thinking about supporting Emacs versions,
+
+00:17:13.600 --> 00:17:16.599
+it looks like you can do fantastically well
+
+00:17:16.600 --> 00:17:20.639
+in terms of hitting most users if you support Emacs 27+.
+
+00:17:20.640 --> 00:17:23.159
+That hits about 96% of respondents.
+
+00:17:23.160 --> 00:17:26.199
+Interestingly though, you can actually make an argument
+
+00:17:26.200 --> 00:17:27.119
+for being even more aggressive.
+
+00:17:27.120 --> 00:17:30.319
+I mean, if you have a look at Emacs 28+,
+
+00:17:30.320 --> 00:17:32.359
+that's still over three quarters of respondents.
+
+00:17:32.360 --> 00:17:35.799
+We've got, at this point, a quarter
+
+00:17:35.800 --> 00:17:37.279
+using the unreleased HEAD version,
+
+00:17:37.280 --> 00:17:40.159
+even though it's getting close to release.
+
+00:17:40.160 --> 00:17:43.039
+Obviously here, as stated, we're hitting
+
+00:17:43.040 --> 00:17:44.599
+a sort of more engaged with the community
+
+00:17:44.600 --> 00:17:47.799
+subset of Emacs users, but still,
+
+00:17:47.800 --> 00:17:49.879
+I think it's interesting to see that
+
+00:17:49.880 --> 00:17:52.639
+with Emacs's increasingly frequent update schedule,
+
+00:17:52.640 --> 00:17:54.999
+that users are actually picking up those updates
+
+00:17:55.000 --> 00:17:56.359
+quite promptly as they roll out.
+
+NOTE Languages
+
+00:17:56.360 --> 00:18:02.079
+Continuing on with how people actually use Emacs: languages.
+
+00:18:02.080 --> 00:18:05.199
+We've got the usual suspects here: lots of Python,
+
+00:18:05.200 --> 00:18:08.959
+quite a bit of JavaScript and C, lots of shell.
+
+00:18:08.960 --> 00:18:11.879
+What I find quite interesting though is
+
+00:18:11.880 --> 00:18:12.799
+if we actually bring in
+
+00:18:12.800 --> 00:18:16.719
+the 2020 Stack Overflow language usage survey data,
+
+00:18:16.720 --> 00:18:19.239
+and that maps quite well
+
+00:18:19.240 --> 00:18:20.079
+to the array of language options we provided here.
+
+00:18:20.080 --> 00:18:21.199
+They had a general Lisp option,
+
+00:18:21.200 --> 00:18:23.919
+which I've folded into Common Lisp
+
+00:18:23.920 --> 00:18:26.919
+since they listed Clojure separately.
+
+00:18:26.920 --> 00:18:29.679
+I think that seems like a fairly safe bet.
+
+00:18:29.680 --> 00:18:31.919
+But other than that, the only languages that we missed
+
+00:18:31.920 --> 00:18:35.839
+are Scheme and Elisp.
+
+00:18:35.840 --> 00:18:37.879
+What we can do is we can look at
+
+00:18:37.880 --> 00:18:41.199
+the relative popularity of different languages
+
+00:18:41.200 --> 00:18:44.519
+from our Emacs user survey compared to Stack Overflows.
+
+00:18:44.520 --> 00:18:48.319
+What do we find? Well, Clojure and Common Lisp
+
+00:18:48.320 --> 00:18:51.639
+far above the rest, I imagine in no small part due to
+
+00:18:51.640 --> 00:18:54.959
+the fantastic SLIME and Cider packages.
+
+00:18:54.960 --> 00:18:59.559
+Following that, we see Haskell being particularly prominent,
+
+00:18:59.560 --> 00:19:00.639
+and then a collection of other languages,
+
+00:19:00.640 --> 00:19:06.199
+your Erlang, Elixir, Julia, Perl and the rest.
+
+00:19:06.200 --> 00:19:10.959
+And then lastly, if we have a look at the ones
+
+00:19:10.960 --> 00:19:13.439
+which have significantly diminished popularity
+
+00:19:13.440 --> 00:19:17.719
+compared to Stack Overflow, we end up with, I think,
+
+00:19:17.720 --> 00:19:20.159
+what I could probably cast as more enterprising languages.
+
+00:19:20.160 --> 00:19:25.799
+Things like C#, Java, Typescript and the like.
+
+NOTE Prose
+
+00:19:25.800 --> 00:19:31.559
+So, that's interesting. Now, earlier
+
+00:19:31.560 --> 00:19:33.239
+when we were looking at the split of Emacs users,
+
+00:19:33.240 --> 00:19:37.239
+we found that we actually had a fair few
+
+00:19:37.240 --> 00:19:42.199
+in more creative areas, like writing and publishing.
+
+00:19:42.200 --> 00:19:44.479
+So if looking at prose, we'd expect a decent chunk
+
+00:19:44.480 --> 00:19:47.039
+to be using Emacs for prose, but it's actually more
+
+00:19:47.040 --> 00:19:48.719
+than just a little bit, it's a little slice.
+
+00:19:48.720 --> 00:19:50.599
+We've got a whopping about a third of users
+
+00:19:50.600 --> 00:19:54.719
+saying they frequently use Emacs for writing prose.
+
+00:19:54.720 --> 00:19:55.999
+I'd imagine that the availability
+
+00:19:56.000 --> 00:19:57.799
+of things like Org mode and AUCTeX
+
+00:19:57.800 --> 00:20:03.399
+probably help like this.
+
+NOTE Packages
+
+00:20:03.400 --> 00:20:05.119
+Moving on to other packages, or more packages,
+
+00:20:05.120 --> 00:20:08.879
+we've actually got a very similar split here
+
+00:20:08.880 --> 00:20:13.199
+to the 2020 survey. Org has seen a bit of a growth
+
+00:20:13.200 --> 00:20:16.039
+in popularity. We've got some new arrivals here as well.
+
+00:20:16.040 --> 00:20:18.479
+For example, Vertico has popped onto the scene
+
+00:20:18.480 --> 00:20:21.279
+and overtaken Ivy here, along with
+
+00:20:21.280 --> 00:20:24.519
+a few other new packages like Consult.
+
+00:20:24.520 --> 00:20:27.599
+Other than that, quite comparable.
+
+00:20:27.600 --> 00:20:29.999
+What's rather interesting, though, I find here is that
+
+00:20:30.000 --> 00:20:33.719
+when you have people who listed a small number of packages,
+
+00:20:33.720 --> 00:20:39.439
+they actually predominantly listed packages
+
+00:20:39.440 --> 00:20:41.319
+other than the most common set.
+
+00:20:41.320 --> 00:20:43.959
+So if we have a lot of people who only listed one package,
+
+00:20:43.960 --> 00:20:48.959
+basically two-thirds of that,
+
+00:20:48.960 --> 00:20:51.479
+or actually three-quarters of those responses
+
+00:20:51.480 --> 00:20:53.879
+were saying other packages,
+
+00:20:53.880 --> 00:20:56.279
+despite the fact that overall packages
+
+00:20:56.280 --> 00:20:58.599
+other than the highlighted selection here
+
+00:20:58.600 --> 00:21:01.399
+only constitute a quarter of responses.
+
+00:21:01.400 --> 00:21:04.919
+So there might be something a bit more to look at there.
+
+NOTE Documentation
+
+00:21:04.920 --> 00:21:07.799
+Now when people are using packages,
+
+00:21:07.800 --> 00:21:11.039
+we also asked what types of documentation
+
+00:21:11.040 --> 00:21:14.399
+people would like to see more of on package READMEs.
+
+00:21:14.400 --> 00:21:17.159
+Basically we've got a big mix here.
+
+00:21:17.160 --> 00:21:20.079
+It seems like generally people are interested in
+
+00:21:20.080 --> 00:21:23.839
+seeing more in various forms, whether it be tutorials,
+
+00:21:23.840 --> 00:21:29.479
+overviews, screenshots, comparisons, or clips and videos.
+
+00:21:29.480 --> 00:21:32.919
+So full READMEs with a lot of context
+
+00:21:32.920 --> 00:21:38.439
+seem to be quite desirable from this.
+
+NOTE Moving forward
+
+00:21:38.440 --> 00:21:42.359
+Now moving forward, what are we going to do?
+
+00:21:42.360 --> 00:21:45.039
+So 800 people gave some detailed feedback on the survey.
+
+00:21:45.040 --> 00:21:47.759
+That's quite nice. I'm going to be taking a good read
+
+00:21:47.760 --> 00:21:50.799
+of all of those responses and use that
+
+00:21:50.800 --> 00:21:55.639
+to improve the process and also the set of questions.
+
+00:21:55.640 --> 00:22:00.759
+Now all of you can also give some feedback on the questions,
+
+00:22:00.760 --> 00:22:02.679
+both that you found most useful in this survey,
+
+00:22:02.680 --> 00:22:04.799
+ones that you think might not add much value,
+
+00:22:04.800 --> 00:22:07.039
+and/or new questions
+
+00:22:07.040 --> 00:22:08.359
+that you think might be a good addition.
+
+00:22:08.360 --> 00:22:11.119
+Once I've done a bit more analysis,
+
+00:22:11.120 --> 00:22:13.119
+particularly the more sophisticated analysis
+
+00:22:13.120 --> 00:22:17.159
+which I'm planning, which will probably come out actually
+
+00:22:17.160 --> 00:22:18.719
+maybe in the first quarter of next year,
+
+00:22:18.720 --> 00:22:22.919
+we can see which questions there seem to have provided
+
+00:22:22.920 --> 00:22:25.039
+the most interesting or surprising results
+
+00:22:25.040 --> 00:22:26.559
+and those are probably worth keeping.
+
+00:22:26.560 --> 00:22:31.959
+Lastly, once we actually have an API
+
+00:22:31.960 --> 00:22:33.279
+and potentially even an Emacs package,
+
+00:22:33.280 --> 00:22:36.159
+we could automate a large number of the questions,
+
+00:22:36.160 --> 00:22:38.999
+things like Emacs version, set of packages used,
+
+00:22:39.000 --> 00:22:41.039
+and that could just streamline the experience
+
+00:22:41.040 --> 00:22:42.279
+of actually filling out the survey,
+
+00:22:42.280 --> 00:22:44.199
+make it a bit more frictionless.
+
+NOTE Time
+
+00:22:44.200 --> 00:22:47.319
+Now talking of the question of questions,
+
+00:22:47.320 --> 00:22:49.319
+a quick survey is a good survey.
+
+00:22:49.320 --> 00:22:52.959
+If we're asking people to dedicate their time
+
+00:22:52.960 --> 00:22:56.279
+to fill out this, it's good to try to get as much value
+
+00:22:56.280 --> 00:22:59.759
+without asking them to donate much of their time.
+
+00:22:59.760 --> 00:23:02.399
+How has the survey done in this respect?
+
+00:23:02.400 --> 00:23:04.119
+I'm actually very happy with how it's done.
+
+00:23:04.120 --> 00:23:06.639
+We get a few comments from the feedback saying
+
+00:23:06.640 --> 00:23:07.759
+that it was a bit of a long side,
+
+00:23:07.760 --> 00:23:10.759
+but the median time was about 12 minutes,
+
+00:23:10.760 --> 00:23:13.759
+which doesn't seem too bad, and most commonly
+
+00:23:13.760 --> 00:23:16.399
+we saw people completing it in about 8 minutes.
+
+00:23:16.400 --> 00:23:18.879
+For a once-per-year survey,
+
+00:23:18.880 --> 00:23:20.519
+I think this seems fairly reasonable.
+
+00:23:20.520 --> 00:23:24.279
+Getting closer to a 5-10 minute range would be nice,
+
+00:23:24.280 --> 00:23:26.199
+but this isn't far off.
+
+NOTE How long the survey is open for
+
+00:23:26.200 --> 00:23:30.879
+Lastly, we're also going to be considering
+
+00:23:30.880 --> 00:23:32.719
+how long the survey is open for.
+
+00:23:32.720 --> 00:23:36.719
+So from the initial opening date,
+
+00:23:36.720 --> 00:23:38.479
+what we have here is a plot of
+
+00:23:38.480 --> 00:23:41.919
+the page which people ended up on
+
+00:23:41.920 --> 00:23:43.399
+and when they started the survey.
+
+00:23:43.400 --> 00:23:46.759
+So what we can see is a huge spike in the first few days.
+
+00:23:46.760 --> 00:23:50.239
+I've just realised that this plot
+
+00:23:50.240 --> 00:23:53.399
+is actually labelled incorrectly.
+
+00:23:53.400 --> 00:23:55.679
+Please disregard the minutes to complete the survey.
+
+00:23:55.680 --> 00:23:58.839
+This should be days after survey opening
+
+00:23:58.840 --> 00:24:01.519
+that a response is actually submitted.
+
+00:24:01.520 --> 00:24:05.399
+And what we have here is a big spike
+
+00:24:05.400 --> 00:24:08.679
+in popularity in the first week basically,
+
+00:24:08.680 --> 00:24:10.599
+and then it trickles down
+
+00:24:10.600 --> 00:24:11.959
+to a fairly consistent level after that.
+
+00:24:11.960 --> 00:24:15.839
+I'm about to publish a last call for survey responses,
+
+00:24:15.840 --> 00:24:18.279
+so I'll see if any final bump happens,
+
+00:24:18.280 --> 00:24:20.039
+but this indicates that we can probably just
+
+00:24:20.040 --> 00:24:23.079
+have the survey open for a week or two
+
+00:24:23.080 --> 00:24:25.199
+and that should be sufficient.
+
+NOTE Plan going forward
+
+00:24:25.200 --> 00:24:30.839
+Alright, so what's the general plan going forwards?
+
+00:24:30.840 --> 00:24:35.639
+Well, as stated earlier, the idea is to run this annually
+
+00:24:35.640 --> 00:24:38.399
+and then consistently improve the questions,
+
+00:24:38.400 --> 00:24:41.039
+the experience, and the analysis that's done.
+
+00:24:41.040 --> 00:24:43.559
+This year has been the hardest by far
+
+00:24:43.560 --> 00:24:45.839
+because a lot had to be set up from scratch.
+
+00:24:45.840 --> 00:24:50.159
+The hope is that moving on from here,
+
+00:24:50.160 --> 00:24:51.799
+a lot of it can be reused.
+
+00:24:51.800 --> 00:24:54.039
+For example, with my comments about
+
+00:24:54.040 --> 00:24:56.439
+more sophisticated analysis being down the line,
+
+00:24:56.440 --> 00:24:58.439
+once that's all worked out,
+
+00:24:58.440 --> 00:25:00.719
+as long as nothing changes too drastically,
+
+00:25:00.720 --> 00:25:03.559
+we should be able to reuse a lot of that work
+
+00:25:03.560 --> 00:25:05.759
+quite easily in future years.
+
+00:25:05.760 --> 00:25:08.599
+Alright, that's it for now.
+
+00:25:08.600 --> 00:25:11.879
+Hopefully, you've found this an interesting peek
+
+00:25:11.880 --> 00:25:13.359
+into how the survey is operated
+
+00:25:13.360 --> 00:25:15.319
+and some of the initial results,
+
+00:25:15.320 --> 00:25:18.919
+and hopefully, I'll see you around next year
+
+00:25:18.920 --> 00:25:36.960
+for the 2023 survey. Thanks for listening.
diff --git a/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main--chapters.vtt b/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main--chapters.vtt
new file mode 100644
index 00000000..20e7c3c7
--- /dev/null
+++ b/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main--chapters.vtt
@@ -0,0 +1,40 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:08.200
+Opening
+
+00:00:24.201 --> 00:00:50.280
+Introduction to Tree-sitter
+
+00:00:50.280 --> 00:01:37.040
+Querying Tree-sitter tree
+
+00:01:37.040 --> 00:02:15.640
+Syntax highlighting
+
+00:02:15.640 --> 00:03:47.120
+Custom syntax highlighting
+
+00:03:47.120 --> 00:05:48.760
+Text objects
+
+00:05:48.760 --> 00:06:20.480
+Code folding
+
+00:06:20.480 --> 00:08:10.480
+Navigating config files
+
+00:08:10.480 --> 00:08:21.560
+Navigating code
+
+00:08:21.560 --> 00:09:31.520
+Intelligent templates
+
+00:09:31.520 --> 00:09:59.080
+Structural editing
+
+00:09:59.080 --> 00:10:26.240
+tree-sitter-save-excursion
+
+00:10:26.240 --> 00:11:03.880
+The future
diff --git a/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt b/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt
new file mode 100644
index 00000000..576f1eaf
--- /dev/null
+++ b/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt
@@ -0,0 +1,727 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:03.240
+Hey everyone, my name is Abin Simon
+
+00:00:03.240 --> 00:00:05.080
+and this talk is about "Tree-sitter:
+
+00:00:05.080 --> 00:00:08.200
+Beyond Syntax Highlighting."
+
+00:00:08.200 --> 00:00:10.720
+For those who are not aware of what Tree-sitter is,
+
+00:00:10.720 --> 00:00:11.720
+let me give you a quick intro.
+
+00:00:11.720 --> 00:00:17.120
+Tree-sitter, at its core, is a parser generator tool
+
+00:00:17.120 --> 00:00:19.440
+and an incremental parsing library.
+
+00:00:19.440 --> 00:00:22.000
+What it essentially means is that it gives you
+
+00:00:22.000 --> 00:00:23.154
+an always up-to-date
+
+00:00:23.155 --> 00:00:24.200
+AST [abstract syntax tree] of your code.
+
+00:00:24.200 --> 00:00:27.960
+In the current Emacs frame, what you see to the right
+
+00:00:27.960 --> 00:00:30.840
+is the AST tree produced by Tree-sitter
+
+00:00:30.840 --> 00:00:33.560
+of the code that is on the left.
+
+00:00:33.560 --> 00:00:37.000
+For example, if you go to this "if" statement,
+
+00:00:37.000 --> 00:00:38.840
+you can see it goes here.
+
+00:00:38.840 --> 00:00:41.440
+It is also really good at handling errors.
+
+00:00:41.440 --> 00:00:44.400
+For example, if I were to delete this [if statement],
+
+00:00:44.400 --> 00:00:47.960
+it still parses out a tree as much as it can,
+
+00:00:47.960 --> 00:00:50.280
+but with an error node.
+
+00:00:50.280 --> 00:00:51.760
+Now let's see how we can query the tree
+
+00:00:51.760 --> 00:00:54.440
+to get the information that we need.
+
+00:00:54.440 --> 00:01:01.480
+Let's first try to get all the identifiers in the buffer.
+
+00:01:01.480 --> 00:01:04.000
+It highlights all the identifiers in the buffer,
+
+00:01:04.000 --> 00:01:05.440
+but let's say we want to get something
+
+00:01:05.440 --> 00:01:07.280
+a little more precise.
+
+00:01:07.280 --> 00:01:10.400
+Let's say we wanted to get this "i" here.
+
+00:01:10.400 --> 00:01:13.280
+This, in our case, would be this identifier
+
+00:01:13.280 --> 00:01:15.200
+inside this assignment expression
+
+00:01:15.200 --> 00:01:27.320
+inside this "for" statement.
+
+00:01:27.320 --> 00:01:29.920
+We can write it out like this.
+
+00:01:29.920 --> 00:01:31.880
+I hope this gives you a basic idea
+
+00:01:31.880 --> 00:01:34.480
+of how Tree-sitter works and how you can query
+
+00:01:34.480 --> 00:01:37.040
+to get the information that you need.
+
+00:01:37.040 --> 00:01:39.520
+First of all, let's see how Tree-sitter can help us
+
+00:01:39.520 --> 00:01:41.880
+with syntax highlighting.
+
+00:01:41.880 --> 00:01:46.480
+This is the default syntax highlighting by Emacs for SQL.
+
+00:01:46.480 --> 00:01:52.000
+Now let's see how Tree-sitter helps.
+
+00:01:52.000 --> 00:01:54.240
+This is the syntax highlighting in Emacs
+
+00:01:54.240 --> 00:01:56.760
+which Tree-sitter enabled.
+
+00:01:56.760 --> 00:01:58.240
+You'll see that we're able to target
+
+00:01:58.240 --> 00:02:01.240
+a lot more things and highlight them.
+
+00:02:01.240 --> 00:02:03.138
+That said, you don't always have to
+
+00:02:03.139 --> 00:02:04.200
+highlight everything.
+
+00:02:04.200 --> 00:02:15.640
+I personally prefer a much simpler theme.
+
+00:02:15.640 --> 00:02:17.880
+Now let's see how Tree-sitter helps you simplify
+
+00:02:17.880 --> 00:02:20.920
+adding custom syntax highlighting to your code.
+
+00:02:20.920 --> 00:02:22.200
+This is a Python file which has
+
+00:02:22.200 --> 00:02:25.640
+a class and a few member functions.
+
+00:02:25.640 --> 00:02:27.680
+Anyone who has used Python will know that
+
+00:02:27.680 --> 00:02:32.040
+the "self" keyword, while it is passed in as an argument,
+
+00:02:32.040 --> 00:02:34.240
+it has more meaning than that.
+
+00:02:34.240 --> 00:02:35.480
+Let's see if you can use Tree-sitter
+
+00:02:35.480 --> 00:02:38.720
+to highlight just the "self" keyword.
+
+00:02:38.720 --> 00:02:40.400
+If you look at the Tree-sitter tree,
+
+00:02:40.400 --> 00:02:43.120
+you can see that this is the first identifier
+
+00:02:43.120 --> 00:02:45.520
+in the list of parameters for a function definition.
+
+00:02:45.520 --> 00:02:55.480
+This is how you would query for the first identifier
+
+00:02:55.480 --> 00:02:59.320
+inside parameters inside a function definition.
+
+00:02:59.320 --> 00:03:02.520
+Now, if you see here, it also matches "cls",
+
+00:03:02.520 --> 00:03:11.360
+but let's restrict it to match just "self".
+
+00:03:11.360 --> 00:03:14.200
+Now we have a Tree-sitter query that identifies
+
+00:03:14.200 --> 00:03:16.960
+the first argument to the function definition
+
+00:03:16.960 --> 00:03:19.640
+and is also called "self".
+
+00:03:19.640 --> 00:03:22.520
+We can use this to apply custom highlighting onto this.
+
+00:03:22.520 --> 00:03:25.000
+This is pretty much all the code
+
+00:03:25.000 --> 00:03:26.520
+that you'll need to do this.
+
+00:03:26.520 --> 00:03:29.240
+The first block here is essentially to say to
+
+00:03:29.240 --> 00:03:32.160
+Tree-sitter to highlight anything with python.self
+
+00:03:32.160 --> 00:03:35.720
+with the face of custom-set.
+
+00:03:35.720 --> 00:03:37.520
+Now the second block here essentially is
+
+00:03:37.520 --> 00:03:39.800
+how we match for that.
+
+00:03:39.800 --> 00:03:41.800
+Now if you go back into a Python buffer
+
+00:03:41.800 --> 00:03:44.680
+and re-enable python-mode, we'll see that "self"
+
+00:03:44.680 --> 00:03:47.120
+is highlighted differently.
+
+00:03:47.120 --> 00:03:48.880
+How about creating text objects?
+
+00:03:48.880 --> 00:03:50.440
+Tree-sitter can help there too.
+
+00:03:50.440 --> 00:03:53.080
+For those who don't know, text objects
+
+00:03:53.080 --> 00:03:54.440
+is an idea that comes from Vim,
+
+00:03:54.440 --> 00:03:57.760
+and you can do things like select word,
+
+00:03:57.760 --> 00:04:00.520
+delete word, things like that.
+
+00:04:00.520 --> 00:04:06.200
+There are other text objects like line and paragraph.
+
+00:04:06.200 --> 00:04:09.000
+For each text object, you can have operations
+
+00:04:09.000 --> 00:04:09.760
+that are defined on them.
+
+00:04:09.760 --> 00:04:13.600
+For example, delete, copy, select, comment,
+
+00:04:13.600 --> 00:04:16.400
+all of these are operations that you can do.
+
+00:04:16.400 --> 00:04:19.400
+Let's try and use Tree-sitter to add more text objects.
+
+00:04:19.400 --> 00:04:20.560
+This is a plugin that I wrote
+
+00:04:20.560 --> 00:04:25.000
+which lets you add more text objects into Emacs.
+
+00:04:25.000 --> 00:04:27.880
+It helps you code aware text objects
+
+00:04:27.880 --> 00:04:31.880
+like functions, conditionals, loops, and such.
+
+00:04:31.880 --> 00:04:34.360
+Let's see an example scenario of how
+
+00:04:34.360 --> 00:04:35.920
+something like this could come in handy.
+
+00:04:35.920 --> 00:04:39.280
+For example, I can select inside this condition
+
+00:04:39.280 --> 00:04:42.960
+or inside this function and do things like that.
+
+00:04:42.960 --> 00:04:44.520
+Let's say I want to take this conditional,
+
+00:04:44.520 --> 00:04:47.160
+move to the next function, and create it here.
+
+00:04:47.160 --> 00:04:49.640
+What I would do is something like
+
+00:04:49.640 --> 00:04:52.320
+delete the conditional, move to the next function,
+
+00:04:52.320 --> 00:04:56.240
+create a conditional there, and paste.
+
+00:04:56.240 --> 00:04:57.160
+Let's try another example.
+
+00:04:57.160 --> 00:05:01.360
+Let's say I want to take this and move it to the end.
+
+00:05:01.360 --> 00:05:02.960
+If I had to do it without text objects,
+
+00:05:02.960 --> 00:05:06.800
+I'd probably have to go back to the previous comma,
+
+00:05:06.800 --> 00:05:10.440
+delete till next comma, find the closing bracket,
+
+00:05:10.440 --> 00:05:11.880
+and paste before.
+
+00:05:11.880 --> 00:05:14.040
+That works, but let's see
+
+00:05:14.040 --> 00:05:16.520
+how Tree-sitter can simplify it.
+
+00:05:16.520 --> 00:05:19.240
+With Tree-sitter, I can say delete the argument,
+
+00:05:19.240 --> 00:05:22.880
+go to the end of the next argument, and then paste.
+
+00:05:22.880 --> 00:05:25.280
+Tree-sitter essentially helps Emacs
+
+00:05:25.280 --> 00:05:27.240
+understand the code better semantically.
+
+00:05:27.240 --> 00:05:29.600
+Here is yet another use case.
+
+00:05:29.600 --> 00:05:31.480
+I work at a remote company,
+
+00:05:31.480 --> 00:05:33.440
+and I often find myself being in a call
+
+00:05:33.440 --> 00:05:35.400
+with my teammates, explaining the code to them.
+
+00:05:35.400 --> 00:05:38.000
+And one thing that really comes in handy
+
+00:05:38.000 --> 00:05:39.760
+is the narrowing capability of Emacs.
+
+00:05:39.760 --> 00:05:43.040
+Specifically, the fancy-narrow package.
+
+00:05:43.040 --> 00:05:44.840
+I use it to narrow just the function,
+
+00:05:44.840 --> 00:05:48.760
+or I could narrow to the conditional.
+
+00:05:48.760 --> 00:05:51.520
+Next to the end, the list would be code folding.
+
+00:05:51.520 --> 00:05:54.480
+This is a package which uses Tree-sitter
+
+00:05:54.480 --> 00:05:57.560
+to improve the code folding functionalities of Emacs.
+
+00:05:57.560 --> 00:06:00.200
+Code folding has always been this thing
+
+00:06:00.200 --> 00:06:02.280
+that I've had a love-hate relationship with.
+
+00:06:02.280 --> 00:06:04.280
+It usually works most of the time,
+
+00:06:04.280 --> 00:06:06.960
+but then fails if the indentation is wrong
+
+00:06:06.960 --> 00:06:09.160
+or we do something weird with the arguments.
+
+00:06:09.160 --> 00:06:11.680
+But now with Tree-sitter in the mix,
+
+00:06:11.680 --> 00:06:12.720
+it's a lot more precise.
+
+00:06:12.720 --> 00:06:17.040
+I can fold comments, I can fold functions,
+
+00:06:17.040 --> 00:06:20.480
+I can fold conditionals. You get the idea.
+
+00:06:20.480 --> 00:06:23.840
+I work with Kubernetes, which means I end up
+
+00:06:23.840 --> 00:06:28.080
+having to write and read a lot of YAML files.
+
+00:06:28.080 --> 00:06:31.840
+And navigating big YAML files is a mess.
+
+00:06:31.840 --> 00:06:35.760
+The two main problems are figuring out where I am,
+
+00:06:35.760 --> 00:06:38.760
+and two, navigating to where I want to be.
+
+00:06:38.760 --> 00:06:41.760
+Let's see how Tree-sitter can help us with both of this.
+
+00:06:41.760 --> 00:06:43.840
+This is an example YAML file.
+
+00:06:43.840 --> 00:06:47.080
+To be precise, this is the values file
+
+00:06:47.080 --> 00:06:48.640
+of the Redis helm chart.
+
+00:06:48.640 --> 00:06:52.240
+I'm somewhere in the file on tag under image,
+
+00:06:52.240 --> 00:06:54.880
+but I don't know what this tag is for.
+
+00:06:54.880 --> 00:06:57.240
+But with the help of Tree-sitter,
+
+00:06:57.240 --> 00:06:59.160
+I've been able to add this information
+
+00:06:59.160 --> 00:07:00.440
+into my header line.
+
+00:07:00.440 --> 00:07:02.960
+If you see in the header line,
+
+00:07:02.960 --> 00:07:05.880
+you'll see that I'm under sentinel.image.
+
+00:07:05.880 --> 00:07:08.800
+Now let's see how this helps with navigation.
+
+00:07:08.800 --> 00:07:12.680
+Let's say I want to enable persistence on master node.
+
+00:07:12.680 --> 00:07:18.200
+So with the help of Tree-sitter,
+
+00:07:18.200 --> 00:07:20.400
+I was able to enumerate every field
+
+00:07:20.400 --> 00:07:22.200
+that is available in this YAML file,
+
+00:07:22.200 --> 00:07:24.520
+and I can pass that information onto imenu,
+
+00:07:24.520 --> 00:07:28.040
+which I can then use to go to exactly where I want to.
+
+00:07:28.040 --> 00:07:30.000
+Also, since we're not dealing with
+
+00:07:30.000 --> 00:07:32.600
+any language specific constructs,
+
+00:07:32.600 --> 00:07:34.040
+this is very easy to extend to
+
+00:07:34.040 --> 00:07:35.760
+other similar languages
+
+00:07:35.760 --> 00:07:37.440
+or config files in this case.
+
+00:07:37.440 --> 00:07:39.520
+So for example, this is a JSON file,
+
+00:07:39.520 --> 00:07:44.800
+and I can navigate to location or project.
+
+00:07:44.800 --> 00:07:48.320
+And just like in YAML, it shows me where I'm at.
+
+00:07:48.320 --> 00:07:49.920
+I'm in projects.name,
+
+00:07:49.920 --> 00:07:52.880
+or I'm inside projects.highlights.
+
+00:07:52.880 --> 00:07:55.600
+Or how about Nix?
+
+00:07:55.600 --> 00:07:57.480
+This is my home.nix file.
+
+00:07:57.480 --> 00:08:01.040
+Again, I can search for services,
+
+00:08:01.040 --> 00:08:04.640
+and this lists me all the services that I've enabled.
+
+00:08:04.640 --> 00:08:06.720
+How about just services.description?
+
+00:08:06.720 --> 00:08:08.160
+So this is all the services
+
+00:08:08.160 --> 00:08:10.480
+that I've enabled and have descriptions.
+
+00:08:10.480 --> 00:08:12.720
+Now that we have seen this for config files,
+
+00:08:12.720 --> 00:08:15.040
+let's see how similar things apply for code.
+
+00:08:15.040 --> 00:08:16.760
+Just like in config files,
+
+00:08:16.760 --> 00:08:18.680
+I can see which function I'm under,
+
+00:08:18.680 --> 00:08:21.560
+and if I go to the next function, it changes.
+
+00:08:21.560 --> 00:08:23.960
+Okay, here is something really awesome.
+
+00:08:23.960 --> 00:08:26.600
+This is probably one of my favorites,
+
+00:08:26.600 --> 00:08:30.400
+and one of the things that actually made me understand
+
+00:08:30.400 --> 00:08:34.080
+how powerful Tree-sitter is, and got me into it.
+
+00:08:34.080 --> 00:08:35.680
+I work with a lot of Go code,
+
+00:08:35.680 --> 00:08:38.840
+and anyone who has worked with Go will tell you
+
+00:08:38.840 --> 00:08:41.040
+how repetitive it is handling errors.
+
+00:08:41.040 --> 00:08:42.800
+For those who don't write Go,
+
+00:08:42.800 --> 00:08:45.200
+let me give you a rough idea of what I'm talking about.
+
+00:08:45.200 --> 00:08:47.000
+If you want to bubble up the error,
+
+00:08:47.000 --> 00:08:49.920
+the way you would do it is just to return the error
+
+00:08:49.920 --> 00:08:51.400
+to the function that called it.
+
+00:08:51.400 --> 00:08:55.720
+Over here, you can either return nil or an empty value,
+
+00:08:55.720 --> 00:08:57.640
+and at the end, you return error.
+
+00:08:57.640 --> 00:09:00.200
+Let's try and use Tree-sitter to do this.
+
+00:09:00.200 --> 00:09:03.120
+Using the help of Tree-sitter, let's make Emacs
+
+00:09:03.120 --> 00:09:06.421
+go back, figure out what the return arguments are,
+
+00:09:06.422 --> 00:09:08.240
+figure out what their default values are,
+
+00:09:08.240 --> 00:09:11.480
+and automatically fill in the return statement.
+
+00:09:11.480 --> 00:09:13.040
+It would look something like this.
+
+00:09:13.040 --> 00:09:16.120
+In my case, it filled in the complete form,
+
+00:09:16.120 --> 00:09:18.320
+it figured out what the return arguments are,
+
+00:09:18.320 --> 00:09:19.320
+what their types are,
+
+00:09:19.320 --> 00:09:20.960
+and what their default values are,
+
+00:09:20.960 --> 00:09:22.800
+and filled out the entire return.
+
+00:09:22.800 --> 00:09:24.760
+And since this is a template,
+
+00:09:24.760 --> 00:09:27.720
+I can go to the next function, do the same thing,
+
+00:09:27.720 --> 00:09:29.560
+next function, do the same thing,
+
+00:09:29.560 --> 00:09:31.520
+next function, do the same thing.
+
+00:09:31.520 --> 00:09:34.360
+Here is a really fascinating use case of Tree-sitter,
+
+00:09:34.360 --> 00:09:36.320
+structural editing.
+
+00:09:36.320 --> 00:09:38.200
+You might be aware of plugins like paredit,
+
+00:09:38.200 --> 00:09:40.280
+which seems to "know" your code.
+
+00:09:40.280 --> 00:09:42.520
+This sort of takes it onto another level.
+
+00:09:42.520 --> 00:09:46.040
+It is in its early stages, but what this lets you do
+
+00:09:46.040 --> 00:09:48.920
+is completely treat your code as an AST,
+
+00:09:48.920 --> 00:09:52.000
+and edit as if it's a tree instead of characters.
+
+00:09:52.000 --> 00:09:54.640
+I am not going to go much in depth into it,
+
+00:09:54.640 --> 00:09:57.000
+but if you're interested, there is a talk
+
+00:09:57.000 --> 00:09:59.080
+from last year's EmacsConf around it.
+
+00:09:59.080 --> 00:10:02.320
+I'm just going to end this with one last tiny thing
+
+00:10:02.320 --> 00:10:04.920
+that I found in the tree-sitter-extras package.
+
+00:10:04.920 --> 00:10:07.600
+It's this tiny macro called tree-sitter-save-excursion.
+
+00:10:07.600 --> 00:10:11.240
+It works pretty much like save-excursion, but better.
+
+00:10:11.240 --> 00:10:13.400
+It uses the Tree-sitter syntax tree
+
+00:10:13.400 --> 00:10:14.800
+instead of just the code
+
+00:10:14.800 --> 00:10:16.720
+to figure out where to restore the position.
+
+00:10:16.720 --> 00:10:20.200
+My main use case for this was with code formatters.
+
+00:10:20.200 --> 00:10:22.080
+Since the code moves around a lot
+
+00:10:22.080 --> 00:10:23.160
+when it gets formatted,
+
+00:10:23.160 --> 00:10:25.000
+save-excursion was completely useless,
+
+00:10:25.000 --> 00:10:26.240
+but this came in handy.
+
+00:10:26.240 --> 00:10:28.120
+I'll just leave you off with
+
+00:10:28.120 --> 00:10:31.120
+what the future of Tree-sitter looks like for Emacs.
+
+00:10:31.120 --> 00:10:33.760
+So far, every Tree-sitter related feature
+
+00:10:33.760 --> 00:10:36.040
+that I've talked about is powered by this library.
+
+00:10:36.040 --> 00:10:42.320
+But there is talk about Tree-sitter coming into the core.
+
+00:10:42.320 --> 00:10:45.840
+It will most probably be landing in Emacs 29,
+
+00:10:45.840 --> 00:10:48.720
+and if you want to check out the work on Tree-sitter
+
+00:10:48.720 --> 00:10:51.200
+in core Emacs, you can check out
+
+00:10:51.200 --> 00:10:52.920
+the features/tree-sitter branch.
+
+00:10:52.920 --> 00:10:56.640
+You'll probably see more and more features and packages
+
+00:10:56.640 --> 00:10:59.640
+relying upon Tree-sitter, and even major modes
+
+00:10:59.640 --> 00:11:01.560
+being powered by Tree-sitter.
+
+00:11:01.560 --> 00:11:03.880
+And that's a wrap from me. Thank you.
diff --git a/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.vtt b/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.vtt
new file mode 100644
index 00000000..87f60bd6
--- /dev/null
+++ b/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.vtt
@@ -0,0 +1,2153 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:03.600
+ going to start recording. All right. Thanks, Michael, for
+
+00:00:03.600 --> 00:00:05.040
+ the great talk. So
+
+00:00:05.040 --> 00:00:09.070
+ the Q&A is live now. Folks can ask questions on IRC or the
+
+00:00:09.070 --> 00:00:10.440
+ pad. And then
+
+00:00:10.440 --> 00:00:12.660
+ at some later point, we'll also open up this PDB room
+
+00:00:12.660 --> 00:00:13.860
+ itself for people to join
+
+00:00:13.860 --> 00:00:16.310
+ and ask their questions here if they want. Michael, take it
+
+00:00:16.310 --> 00:00:16.720
+ away.
+
+00:00:16.720 --> 00:00:21.470
+ Okay, I will start with the first question of etherpad is
+
+00:00:21.470 --> 00:00:22.600
+ are you using
+
+00:00:22.600 --> 00:00:28.920
+ this as it as a replacement of x ex WM? No, not yet. But I
+
+00:00:28.920 --> 00:00:33.040
+'m planning to. I'm a
+
+00:00:33.040 --> 00:00:39.700
+ I use x WM since many years like for my main computing
+
+00:00:39.700 --> 00:00:42.400
+ environment with Emacs.
+
+00:00:42.400 --> 00:00:47.530
+ And I would love to have a replacement and Wayland. I'm not
+
+00:00:47.530 --> 00:00:49.120
+ actually that sure
+
+00:00:49.120 --> 00:00:54.390
+ if that needed. But I plan on using it. It's not finished.
+
+00:00:54.390 --> 00:00:55.760
+ So is this testable?
+
+00:00:55.760 --> 00:01:04.660
+ Yes, it is testable. I have gonna provide you the code. At
+
+00:01:04.660 --> 00:01:05.960
+ the end of the
+
+00:01:05.960 --> 00:01:10.180
+ video, there was a link to my site, but there's no site yet
+
+00:01:10.180 --> 00:01:12.160
+. I bought this URL a
+
+00:01:12.160 --> 00:01:16.520
+ year ago, and that's a good reason to put something on
+
+00:01:16.520 --> 00:01:18.040
+ there. So wait a few
+
+00:01:18.040 --> 00:01:22.250
+ days and you can download a git repository. At least that's
+
+00:01:22.250 --> 00:01:23.640
+ the plan. And
+
+00:01:23.640 --> 00:01:26.710
+ then you can test it. Input handling is still missing, as I
+
+00:01:26.710 --> 00:01:30.560
+ said. Yes, that makes
+
+00:01:30.560 --> 00:01:36.390
+ it a bit rough. So the input is only guided by where the
+
+00:01:36.390 --> 00:01:39.560
+ mouse pointer is. And
+
+00:01:39.560 --> 00:01:43.770
+ it's missing in the C part in the C server part. But if
+
+00:01:43.770 --> 00:01:45.160
+ this is in there, I
+
+00:01:45.160 --> 00:01:49.450
+ think you can use it as a replacement. So it's testable,
+
+00:01:49.450 --> 00:01:50.240
+ and it's not a
+
+00:01:50.240 --> 00:01:54.140
+ replacement yet. Have you considered contributing to Emacs
+
+00:01:54.140 --> 00:01:55.080
+ cores? The next
+
+00:01:55.080 --> 00:02:00.590
+ question? Yes. Is it a general question? If I would like to
+
+00:02:00.590 --> 00:02:03.680
+ do that? Yeah, I got
+
+00:02:03.680 --> 00:02:07.560
+ quite a lot into Emacs core in the last year because I did
+
+00:02:07.560 --> 00:02:08.800
+ language work with
+
+00:02:08.800 --> 00:02:13.030
+ Lisp and really nerded out and got to know the core. So I
+
+00:02:13.030 --> 00:02:15.360
+ like it. Why not? If
+
+00:02:15.360 --> 00:02:18.980
+ it's a more specific question, if I would like to
+
+00:02:18.980 --> 00:02:20.840
+ contribute the Wayland
+
+00:02:20.840 --> 00:02:24.810
+ support to Emacs core, then I'm not that sure if it belongs
+
+00:02:24.810 --> 00:02:27.160
+ there. Like at first,
+
+00:02:27.160 --> 00:02:29.660
+ I thought, of course, you have to put it in the core. It's
+
+00:02:29.660 --> 00:02:30.520
+ C. It has to work
+
+00:02:30.520 --> 00:02:35.120
+ together. But after I looked into it a little bit more, how
+
+00:02:35.120 --> 00:02:36.280
+ to do a Wayland
+
+00:02:36.280 --> 00:02:39.270
+ compositor with Emacs, I found out, okay, there's this Way
+
+00:02:39.270 --> 00:02:40.280
+land protocol and
+
+00:02:40.280 --> 00:02:43.970
+ all the programs that are working together in a Wayland
+
+00:02:43.970 --> 00:02:45.560
+ desktop, they talk
+
+00:02:45.560 --> 00:02:51.150
+ in this protocol. And when I got Emacs to talk with the Way
+
+00:02:51.150 --> 00:02:53.320
+land protocol, it
+
+00:02:53.320 --> 00:02:57.200
+ was solved. And that is in the library, because it's an
+
+00:02:57.200 --> 00:02:58.920
+ asynchronous process,
+
+00:02:58.920 --> 00:03:02.440
+ like a network connection. And Emacs has an event loop that
+
+00:03:02.440 --> 00:03:05.560
+ listens to
+
+00:03:06.480 --> 00:03:06.480
+
+
+00:03:06.480 --> 00:03:09.490
+ messages on the network. So it's integrated into the Emacs
+
+00:03:09.490 --> 00:03:10.360
+ core. You
+
+00:03:10.360 --> 00:03:13.870
+ don't have to do anything more. But where it gets
+
+00:03:13.870 --> 00:03:15.920
+ interesting, again, is this
+
+00:03:15.920 --> 00:03:21.900
+ idea I had, maybe we could use it for more in Emacs. Emacs
+
+00:03:21.900 --> 00:03:23.840
+ is fundamentally
+
+00:03:23.840 --> 00:03:26.740
+ about drawing buffers to a screen and not fundamentally.
+
+00:03:26.740 --> 00:03:27.720
+ But the part that's
+
+00:03:27.720 --> 00:03:30.800
+ not a Lisp machine, the graphical part, it's drawing buff
+
+00:03:30.800 --> 00:03:32.000
+ers to a screen and you
+
+00:03:32.000 --> 00:03:36.060
+ have to composite these buffers somehow. And now we're
+
+00:03:36.060 --> 00:03:38.400
+ using different desktop
+
+00:03:38.400 --> 00:03:43.640
+ toolkits like GTK on the Linux. And maybe we don't have to,
+
+00:03:43.640 --> 00:03:45.000
+ we can just draw
+
+00:03:45.000 --> 00:03:49.980
+ pixel buffers, like draw into a pixel buffer. Like, I don't
+
+00:03:49.980 --> 00:03:50.880
+ know, what do we
+
+00:03:50.880 --> 00:03:55.640
+ use for rendering? I forgot, Cairo or something. And this
+
+00:03:55.640 --> 00:03:56.760
+ could just write
+
+00:03:56.760 --> 00:03:59.770
+ into a pixel buffer. So now we arranged, and Emacs is
+
+00:03:59.770 --> 00:04:01.080
+ already a window manager.
+
+00:04:01.080 --> 00:04:03.970
+ So it's not that difficult to implement a window manager
+
+00:04:03.970 --> 00:04:05.320
+ with Emacs because Emacs
+
+00:04:05.320 --> 00:04:11.060
+ is a window manager, pretty good one, I think. And no, I
+
+00:04:11.060 --> 00:04:13.040
+ just lost a little bit
+
+00:04:13.040 --> 00:04:16.670
+ more train of thought. But so far to contributing to the
+
+00:04:16.670 --> 00:04:17.960
+ core and we could do
+
+00:04:17.960 --> 00:04:20.840
+ more with it. So next question.
+
+00:04:20.840 --> 00:04:23.960
+ - One thing, Michael, quickly. Sorry. Yeah, it would be
+
+00:04:23.960 --> 00:04:25.200
+ great if you could also
+
+00:04:25.200 --> 00:04:27.510
+ repeat the questions for the stream before you answer them.
+
+00:04:27.510 --> 00:04:28.040
+ That would be
+
+00:04:28.040 --> 00:04:28.440
+ awesome.
+
+00:04:28.440 --> 00:04:30.120
+ - I will do that.
+
+00:04:30.120 --> 00:04:30.920
+ - Thank you.
+
+00:04:32.600 --> 00:04:32.600
+
+
+00:04:32.600 --> 00:04:36.260
+ Question. Is this valent compositor in Emacs? What
+
+00:04:36.260 --> 00:04:39.040
+ different with XReparent in
+
+00:04:39.040 --> 00:04:45.290
+ X11? Okay, this is a little bit difficult for me to
+
+00:04:45.290 --> 00:04:48.520
+ understand, but I answered
+
+00:04:48.520 --> 00:04:53.550
+ anyway. So first, is this a valent compositor in Emacs? I
+
+00:04:53.550 --> 00:04:54.840
+ would say no,
+
+00:04:54.840 --> 00:04:58.870
+ because the Emacs doesn't do the valent compositoring. I
+
+00:04:58.870 --> 00:05:00.440
+ first planned to do it
+
+00:05:00.440 --> 00:05:03.130
+ like this, but it doesn't work out like this because you
+
+00:05:03.130 --> 00:05:06.120
+ have to handle file
+
+00:05:06.120 --> 00:05:10.120
+ descriptors and Emacs can't handle file descriptors except
+
+00:05:10.120 --> 00:05:11.480
+ you go down to the C
+
+00:05:11.480 --> 00:05:19.930
+ part. So no, it's not. It's a C, a WL roots valent compos
+
+00:05:19.930 --> 00:05:22.840
+itor that talks to
+
+00:05:22.840 --> 00:05:29.290
+ Emacs and Emacs is, it's just like a helper compositor. Em
+
+00:05:29.290 --> 00:05:31.160
+acs says where to
+
+00:05:31.160 --> 00:05:34.380
+ put the windows. It's the window manager. And in the future
+
+00:05:34.380 --> 00:05:35.360
+, where to put the
+
+00:05:35.360 --> 00:05:40.170
+ inputs so that you can insert Emacs into the input stream
+
+00:05:40.170 --> 00:05:43.320
+ like XWM does it. Okay,
+
+00:05:43.320 --> 00:05:49.070
+ then what different with XReparent in X11? I don't actually
+
+00:05:49.070 --> 00:05:51.000
+ know what XReparent
+
+00:05:51.000 --> 00:05:55.150
+ is, so I'm sorry. I have to skip this one. How would
+
+00:05:55.150 --> 00:05:57.000
+ multiple monitors be
+
+00:05:57.000 --> 00:05:59.990
+ handled? Separate frames? Yes, separate frames. This is
+
+00:05:59.990 --> 00:06:01.160
+ already testable. It's
+
+00:06:01.160 --> 00:06:08.540
+ implemented. As soon as a new monitor crops up, the Emacs
+
+00:06:08.540 --> 00:06:10.320
+ is, the valent
+
+00:06:10.320 --> 00:06:15.490
+ protocol informs about a new output event and Emacs then
+
+00:06:15.490 --> 00:06:17.000
+ pops up a new frame
+
+00:06:17.000 --> 00:06:22.240
+ on this output. And depending on how usable you want to
+
+00:06:22.240 --> 00:06:24.760
+ have it, you can just,
+
+00:06:24.760 --> 00:06:27.160
+ there could be a menu like where do you want the output? Do
+
+00:06:27.160 --> 00:06:27.840
+ you want to have a
+
+00:06:27.840 --> 00:06:30.230
+ screen on it or something like that? And then you have
+
+00:06:30.230 --> 00:06:31.480
+ output handling. Output
+
+00:06:31.480 --> 00:06:35.100
+ handling is already working. So separate frames, one per
+
+00:06:35.100 --> 00:06:37.480
+ output because that's
+
+00:06:37.480 --> 00:06:41.010
+ the Emacs analog. You have windows, you have frames, frames
+
+00:06:41.010 --> 00:06:42.760
+ are like monitors.
+
+00:06:42.760 --> 00:06:45.800
+ And the special thing about valent outputs is they don't
+
+00:06:45.800 --> 00:06:46.600
+ have to be a whole
+
+00:06:46.600 --> 00:06:49.980
+ monitor or hardware device. They can also be like a normal
+
+00:06:49.980 --> 00:06:52.840
+ frame. Next question
+
+00:06:52.840 --> 00:06:57.440
+ is, could you make it so you can restart Emacs without
+
+00:06:57.440 --> 00:06:59.400
+ logging out or switch to
+
+00:06:59.400 --> 00:07:02.640
+ non-Emacs buffer while Emacs is blocking? These are the
+
+00:07:02.640 --> 00:07:05.080
+ biggest issues with XWM.
+
+00:07:05.080 --> 00:07:13.240
+ While Emacs is blocking. Okay, I have to think about this a
+
+00:07:13.240 --> 00:07:14.760
+ little bit
+
+00:07:16.120 --> 00:07:19.270
+ because right now I have a problem with restarting and the
+
+00:07:19.270 --> 00:07:20.600
+ code I wrote. Emacs
+
+00:07:20.600 --> 00:07:25.340
+ starts the valent server and then starts to talk to it, the
+
+00:07:25.340 --> 00:07:28.520
+ server to Emacs. And
+
+00:07:28.520 --> 00:07:33.070
+ as soon as the server terminates, Emacs terminates. Because
+
+00:07:33.070 --> 00:07:34.680
+ GTK has this feature
+
+00:07:34.680 --> 00:07:38.550
+ and it's a bug since several years and they know it, but
+
+00:07:38.550 --> 00:07:39.880
+ apparently it's a
+
+00:07:39.880 --> 00:07:44.830
+ feature, not a bug. So as soon as a valent GTK window
+
+00:07:44.830 --> 00:07:47.000
+ terminates, it terminates
+
+00:07:47.000 --> 00:07:51.420
+ its process. That means if there's an Emacs frame on valent
+
+00:07:51.420 --> 00:07:52.440
+ and the frame is
+
+00:07:52.440 --> 00:07:57.610
+ powered by GTK as Emacs currently does it, valent termin
+
+00:07:57.610 --> 00:07:59.560
+ates the frame, Emacs
+
+00:07:59.560 --> 00:08:02.870
+ gets terminated, whole thing is terminated. Well, normally
+
+00:08:02.870 --> 00:08:03.480
+ you would like
+
+00:08:03.480 --> 00:08:06.500
+ something that like Emacs terminal frame, and then you pop
+
+00:08:06.500 --> 00:08:07.640
+ open valent buffer
+
+00:08:07.640 --> 00:08:10.160
+ or something like that. And it's just a long running Emacs
+
+00:08:10.160 --> 00:08:11.640
+ session, but that's
+
+00:08:11.640 --> 00:08:16.670
+ a blocker right now and it's GTK's fault. But we already
+
+00:08:16.670 --> 00:08:18.040
+ know the other
+
+00:08:18.040 --> 00:08:22.220
+ bug we have since years. And so I don't think this one is
+
+00:08:22.220 --> 00:08:23.640
+ resolved either.
+
+00:08:23.640 --> 00:08:29.040
+ So what does mean or switch to non-Emacs buffers while Em
+
+00:08:29.040 --> 00:08:31.000
+acs is blocking? No,
+
+00:08:31.000 --> 00:08:35.090
+ you can't. Okay. Now you can't do this because Emacs does
+
+00:08:35.090 --> 00:08:36.200
+ the window managing
+
+00:08:36.200 --> 00:08:43.700
+ as in EXWM. So there's a new window or you want to switch a
+
+00:08:43.700 --> 00:08:45.960
+ window. So it has
+
+00:08:45.960 --> 00:08:50.640
+ to go through Emacs. Emacs gets a request for new window or
+
+00:08:50.640 --> 00:08:52.280
+ Emacs just says layout
+
+00:08:52.280 --> 00:08:55.820
+ this window at this point. And if Emacs as it's single
+
+00:08:55.820 --> 00:08:58.200
+ threaded is blocked, it
+
+00:08:58.200 --> 00:09:05.830
+ can't issue this layout request. So yeah, that's not going
+
+00:09:05.830 --> 00:09:09.320
+ to work out as long
+
+00:09:09.320 --> 00:09:17.190
+ as Emacs is just single threaded. Next question. Did this
+
+00:09:17.190 --> 00:09:19.400
+ project can implement
+
+00:09:19.400 --> 00:09:23.680
+ mirror of buffer for Emacs different window? Okay. I think
+
+00:09:23.680 --> 00:09:25.320
+ I got this question.
+
+00:09:27.320 --> 00:09:31.810
+ Can you, okay. In Emacs normally you know how buffers work.
+
+00:09:31.810 --> 00:09:32.760
+ Like you have one
+
+00:09:32.760 --> 00:09:35.420
+ buffer, you split it, you have two buffers, but it's the
+
+00:09:35.420 --> 00:09:37.000
+ same buffer. Then you can
+
+00:09:37.000 --> 00:09:39.320
+ take one of the buffers and look at another place in this
+
+00:09:39.320 --> 00:09:42.360
+ buffer. You can't do
+
+00:09:42.360 --> 00:09:45.930
+ this with Emacs buffers, but you can't do it like an EXWM.
+
+00:09:45.930 --> 00:09:47.080
+ You can't do it with
+
+00:09:47.080 --> 00:09:50.980
+ the X windows because there's only one view on the X
+
+00:09:50.980 --> 00:09:54.440
+ windows. So now the special
+
+00:09:54.440 --> 00:09:57.790
+ thing with Valent, you can have multiple views on the same
+
+00:09:57.790 --> 00:10:00.040
+ window. And when I got
+
+00:10:00.040 --> 00:10:03.210
+ to implement this idea, I was, yeah, of course I'm going to
+
+00:10:03.210 --> 00:10:04.440
+ do multiple views,
+
+00:10:04.440 --> 00:10:09.710
+ same window as Emacs does it. And I had it implemented. And
+
+00:10:09.710 --> 00:10:11.560
+ then I found out, no,
+
+00:10:11.560 --> 00:10:16.660
+ this is not going to work. Because a window has always one
+
+00:10:16.660 --> 00:10:18.920
+ size. Like you can't,
+
+00:10:18.920 --> 00:10:23.000
+ if you have a video open, you can't just tell it, make it
+
+00:10:23.000 --> 00:10:24.680
+ this size. Or if you have
+
+00:10:24.680 --> 00:10:29.080
+ a web browser open and you can't have different sizes. So
+
+00:10:29.080 --> 00:10:32.360
+ it's in principle, it's
+
+00:10:32.360 --> 00:10:37.910
+ comfortable with the Emacs model. Like the normal desktop
+
+00:10:37.910 --> 00:10:39.640
+ model doesn't work with Emacs. So
+
+00:10:39.640 --> 00:10:44.200
+ no, this still doesn't work. You can do a hack. I tried it.
+
+00:10:44.200 --> 00:10:45.320
+ You have like one big
+
+00:10:45.320 --> 00:10:48.750
+ window that you have other windows and you scale them or
+
+00:10:48.750 --> 00:10:50.600
+ you crop them, but this isn't
+
+00:10:50.600 --> 00:10:54.890
+ well supported in WL roots. And also it doesn't make a lot
+
+00:10:54.890 --> 00:10:57.720
+ of sense actually. So I scrapped it
+
+00:10:57.720 --> 00:11:02.030
+ and there's just one view. Okay. So just one view because
+
+00:11:02.030 --> 00:11:04.280
+ it doesn't make a lot of sense to have
+
+00:11:04.280 --> 00:11:08.120
+ multiple views. How does this next question, how does the
+
+00:11:08.120 --> 00:11:10.840
+ single threaded, threaded affects
+
+00:11:10.840 --> 00:11:16.470
+ the project? Yeah. And so far as it does affect any Emacs
+
+00:11:16.470 --> 00:11:19.640
+ package, like it's not a special
+
+00:11:19.640 --> 00:11:25.400
+ problem, not a, not a actual problem. Like the only, only,
+
+00:11:25.400 --> 00:11:26.480
+ um, um,
+
+00:11:26.480 --> 00:11:32.850
+ there's just one thing where Emacs could block, uh, the
+
+00:11:32.850 --> 00:11:35.720
+ other windows. It's when the other window
+
+00:11:35.720 --> 00:11:39.730
+ requests a layout, like there's a new program that opened a
+
+00:11:39.730 --> 00:11:42.760
+ window or another window opened
+
+00:11:42.760 --> 00:11:46.840
+ and Emacs is blocking and can't service this new surface
+
+00:11:46.840 --> 00:11:49.400
+ request. So you won't see anything,
+
+00:11:49.400 --> 00:11:53.620
+ but except from that, um, if you see the window Emacs hangs
+
+00:11:53.620 --> 00:11:57.320
+ like with the EXWVM, you just can use
+
+00:11:57.320 --> 00:12:00.790
+ the other program because it's not coupled to Emacs in any
+
+00:12:00.790 --> 00:12:02.120
+ significant way.
+
+00:12:03.720 --> 00:12:08.190
+ Um, and the good thing is, and that's the short side remark
+
+00:12:08.190 --> 00:12:11.240
+. If you want to go further than our
+
+00:12:11.240 --> 00:12:14.000
+ single threaded thing, it's like, I think we, we have a
+
+00:12:14.000 --> 00:12:16.200
+ talk somewhere in this conference, like,
+
+00:12:16.200 --> 00:12:21.420
+ um, how Emacs was always async and is it, is async and Em
+
+00:12:21.420 --> 00:12:24.200
+acs is async. Well, we have async
+
+00:12:24.200 --> 00:12:27.670
+ processes. We have callbacks, we have network processes we
+
+00:12:27.670 --> 00:12:29.800
+ can use asynchronously. And I think
+
+00:12:29.800 --> 00:12:33.820
+ that's the way forward for Emacs to don't be blocking, like
+
+00:12:33.820 --> 00:12:35.800
+ have worker threads, something
+
+00:12:35.800 --> 00:12:40.140
+ like this and have a main thing because it's one big muddle
+
+00:12:40.140 --> 00:12:43.160
+ of muddle of code. I don't think you
+
+00:12:43.160 --> 00:12:49.280
+ can just separate it. So, but we could lean more into these
+
+00:12:49.280 --> 00:12:53.320
+ helpers and workers like Node.js does
+
+00:12:53.320 --> 00:12:57.950
+ it or something like that. So next question is this
+
+00:12:57.950 --> 00:13:01.800
+ technology. I have a short matter question.
+
+00:13:01.800 --> 00:13:08.200
+ Do I have to stop or can I answer all the questions? Um,
+
+00:13:08.200 --> 00:13:09.880
+ yeah, I think we can go on for now.
+
+00:13:09.880 --> 00:13:13.420
+ And, um, the BBB room is also open for anyone who does want
+
+00:13:13.420 --> 00:13:15.720
+ to join here to ask questions directly,
+
+00:13:15.720 --> 00:13:18.420
+ um, in case the stream moves on. But I think this is our
+
+00:13:18.420 --> 00:13:20.280
+ last talk on the Dev track before the launch
+
+00:13:20.280 --> 00:13:22.850
+ break. So yeah, you should be good. Ah, nice. I don't need
+
+00:13:22.850 --> 00:13:24.520
+ a lunch break because, uh, uh,
+
+00:13:24.520 --> 00:13:32.110
+ in Europe it's already like the next meal. Right. So, um,
+
+00:13:32.110 --> 00:13:34.760
+ next question is this technology
+
+00:13:34.760 --> 00:13:38.840
+ need right? Valence server. Can it works with GNOME 3?
+
+00:13:38.840 --> 00:13:42.760
+ Actually, yes, it needs to write a
+
+00:13:42.760 --> 00:13:47.490
+ valence server because valence needs a valence server. And,
+
+00:13:47.490 --> 00:13:49.320
+ uh, just for you, what does the
+
+00:13:49.320 --> 00:13:53.900
+ server actually do? The server does, um, for example, it is
+
+00:13:53.900 --> 00:13:55.880
+ the compositor. The valence
+
+00:13:55.880 --> 00:13:58.680
+ compositor is part of the valence compositor. It's like
+
+00:13:58.680 --> 00:14:00.360
+ difficult naming they had there.
+
+00:14:00.360 --> 00:14:04.320
+ And it does a merging of, of windows. You have, um, you
+
+00:14:04.320 --> 00:14:06.760
+ have an application and it draws a window.
+
+00:14:06.760 --> 00:14:09.730
+ So you give it a pixel buffer, the application draws in
+
+00:14:09.730 --> 00:14:11.560
+ this pixel buffer, and then you put it
+
+00:14:11.560 --> 00:14:16.310
+ on the screen and compositor this other surfaces that are
+
+00:14:16.310 --> 00:14:19.560
+ on the screen. And, um, you have to look
+
+00:14:19.560 --> 00:14:22.320
+ into the frame rate you want to have and stuff like that.
+
+00:14:22.320 --> 00:14:24.360
+ So it's really low level stuff. It's,
+
+00:14:24.360 --> 00:14:28.020
+ it's, um, that's the thing the valence compositor does. And
+
+00:14:28.020 --> 00:14:30.200
+ it does input handling like lip input,
+
+00:14:30.200 --> 00:14:33.760
+ and then it receives something and routes it to this
+
+00:14:33.760 --> 00:14:37.320
+ surface of that surface, or I think shell
+
+00:14:37.320 --> 00:14:41.340
+ it's called. It's a shell that reserves the input. Okay.
+
+00:14:41.340 --> 00:14:44.760
+ Can it work with GNOME 3? Yes,
+
+00:14:44.760 --> 00:14:47.930
+ maybe. I don't know how open they are and if you can
+
+00:14:47.930 --> 00:14:50.600
+ integrate it, but I don't think that's,
+
+00:14:50.600 --> 00:14:55.520
+ that's a good direction because what do you want to build?
+
+00:14:55.520 --> 00:15:00.040
+ So, ah, just one thing since Emacs can
+
+00:15:00.040 --> 00:15:04.130
+ talk valence and is a normal valence client with the
+
+00:15:04.130 --> 00:15:07.880
+ library I wrote, it can take, can talk to any
+
+00:15:07.880 --> 00:15:13.520
+ other valence program and maybe you can do something useful
+
+00:15:13.520 --> 00:15:16.520
+ with GNOME 3 and Emacs as a
+
+00:15:16.520 --> 00:15:19.500
+ valence client. Like you can automate parts of your desktop
+
+00:15:19.500 --> 00:15:21.720
+ or something like that. Um, yeah,
+
+00:15:21.720 --> 00:15:25.850
+ that would be a possibility. Good. I'm going now to the
+
+00:15:25.850 --> 00:15:28.200
+ next question that is, could there be an
+
+00:15:28.200 --> 00:15:31.940
+ Emacs valence server and just connect with Emacs client?
+
+00:15:31.940 --> 00:15:36.600
+ Cool. I named my thing Emacs valence
+
+00:15:36.600 --> 00:15:42.050
+ server. So there is already an Emacs valence server. Um,
+
+00:15:42.050 --> 00:15:44.600
+ connect with Emacs client.
+
+00:15:44.600 --> 00:15:50.600
+ I don't actually get the question, but I think, um, yes, of
+
+00:15:50.600 --> 00:15:53.080
+ course you have an Emacs running.
+
+00:15:53.080 --> 00:15:56.070
+ It doesn't have to be an Emacs valence server because Emacs
+
+00:15:56.070 --> 00:15:56.920
+ is multi-display
+
+00:15:56.920 --> 00:16:01.090
+ and then you can just pop open the windows in valence or
+
+00:16:01.090 --> 00:16:04.360
+ something like this. Next question is
+
+00:16:04.360 --> 00:16:07.650
+ when you share your code, could you provide the equivalent
+
+00:16:07.650 --> 00:16:10.040
+ of an X session script for those who
+
+00:16:10.040 --> 00:16:17.920
+ are on XWM and want to test? Yes, I can, because it's my
+
+00:16:17.920 --> 00:16:21.720
+ goal is to have it run like this for
+
+00:16:21.720 --> 00:16:24.660
+ myself. But when I share the code in the coming days, as I
+
+00:16:24.660 --> 00:16:29.640
+'m planning, no, you won't run it like
+
+00:16:29.640 --> 00:16:33.910
+ this because it's not that polished yet. So a startup is a
+
+00:16:33.910 --> 00:16:36.360
+ little bit more involved and I
+
+00:16:36.360 --> 00:16:41.030
+ haven't researched all the ways you can make it polished,
+
+00:16:41.030 --> 00:16:44.600
+ but it's on the roadmap. So stay tuned.
+
+00:16:46.520 --> 00:16:51.220
+ The next question is, I have a demo to show this Emacs val
+
+00:16:51.220 --> 00:16:52.520
+ence compositor,
+
+00:16:52.520 --> 00:16:56.900
+ even if buggy now, just curious. Yes, there is a demo. Like
+
+00:16:56.900 --> 00:16:59.480
+ you just watched one in the video. It
+
+00:16:59.480 --> 00:17:06.370
+ was the compositor running. It did the compositing of the
+
+00:17:06.370 --> 00:17:11.080
+ video I made. And the other demo is the
+
+00:17:11.080 --> 00:17:16.980
+ code I'm planning to release. The code right now is working
+
+00:17:16.980 --> 00:17:21.960
+, but there's some documentation also,
+
+00:17:21.960 --> 00:17:26.510
+ but it's not finished. So have fun digging in there, but
+
+00:17:26.510 --> 00:17:29.400
+ don't expect anything like hyper
+
+00:17:29.400 --> 00:17:33.690
+ polished or something like this. More, yeah, I'm looking
+
+00:17:33.690 --> 00:17:36.680
+ for feedback and ideas and where to take
+
+00:17:36.680 --> 00:17:42.260
+ this thing. Now we're going to get to buffer mirroring. So
+
+00:17:42.260 --> 00:17:44.760
+ next question is, so the current
+
+00:17:44.760 --> 00:17:47.950
+ limitation is that buffer mirroring doesn't respect
+
+00:17:47.950 --> 00:17:50.360
+ different widths or heights. Yeah,
+
+00:17:50.360 --> 00:17:53.530
+ the limitation is fundamentally if you have a normal
+
+00:17:53.530 --> 00:17:55.800
+ desktop window, look at your browser
+
+00:17:55.800 --> 00:17:59.980
+ or your video player, just watching me, you are just
+
+00:17:59.980 --> 00:18:04.600
+ watching me. It just has one size. You can't
+
+00:18:04.600 --> 00:18:08.570
+ say, please make yourself this size and this size and show
+
+00:18:08.570 --> 00:18:12.040
+ me two different parts of your site or
+
+00:18:12.040 --> 00:18:17.520
+ that doesn't work. It's not thought like this. So you can
+
+00:18:17.520 --> 00:18:20.680
+ hack something up that you have like
+
+00:18:20.680 --> 00:18:24.300
+ a big window and then you show a little crop part of it and
+
+00:18:24.300 --> 00:18:26.760
+ another buffer. This does actually work,
+
+00:18:27.560 --> 00:18:32.940
+ but just a little site or like if you want to do something
+
+00:18:32.940 --> 00:18:38.680
+ like this, be prepared. WL roots doesn't,
+
+00:18:38.680 --> 00:18:43.740
+ okay. So a Wayland server or compositor has to do its own
+
+00:18:43.740 --> 00:18:47.880
+ compositing. That means it has to
+
+00:18:47.880 --> 00:18:51.590
+ composite the different buffers or pixel buffer it has in
+
+00:18:51.590 --> 00:18:53.880
+ one pixel buffer and put it on the output.
+
+00:18:55.000 --> 00:18:59.600
+ That means you have to do that yourself. And there's a
+
+00:18:59.600 --> 00:19:01.960
+ helper to do this in WL roots.
+
+00:19:01.960 --> 00:19:07.410
+ This is WLR scene as it's called. And it does this for you.
+
+00:19:07.410 --> 00:19:09.720
+ You build a scene tree and does
+
+00:19:09.720 --> 00:19:14.510
+ damage tracking so it doesn't repaint everything. It saves
+
+00:19:14.510 --> 00:19:16.920
+ battery and it's a lot of work to do this
+
+00:19:16.920 --> 00:19:21.710
+ and it's ready there. But what is missing in this helper is
+
+00:19:21.710 --> 00:19:24.920
+ cropping and resizing. So right now you
+
+00:19:24.920 --> 00:19:28.700
+ can't crop and you can't resize. And I would say this is
+
+00:19:28.700 --> 00:19:31.240
+ the main blocker for using the thing I
+
+00:19:31.240 --> 00:19:38.100
+ built, Wayland compositor is you can't crop windows. And if
+
+00:19:38.100 --> 00:19:42.920
+ you, maybe you use MP4 like the
+
+00:19:42.920 --> 00:19:48.310
+ video player, it doesn't respect what you tell it, what the
+
+00:19:48.310 --> 00:19:51.480
+ size it should get. It just, it keeps its
+
+00:19:51.480 --> 00:19:55.400
+ aspect ratio and then just respects and either width or
+
+00:19:55.400 --> 00:19:58.280
+ height, but not both if they don't fit.
+
+00:19:58.280 --> 00:20:01.790
+ So you want to fit it in a buffer and then it's stay, it's
+
+00:20:01.790 --> 00:20:04.360
+ overflows the buffer a little bit. You
+
+00:20:04.360 --> 00:20:09.200
+ can see it in the talk video. In my talk, I posted like the
+
+00:20:09.200 --> 00:20:11.720
+ little camera picture of me is not always
+
+00:20:11.720 --> 00:20:15.550
+ there where it should be. It's over the mode line or
+
+00:20:15.550 --> 00:20:18.680
+ something like that. And yeah, there needs to
+
+00:20:18.680 --> 00:20:25.180
+ be some cropping. XWVM does cropping. It crops. You can try
+
+00:20:25.180 --> 00:20:28.920
+ it out. If someone of you is a XWM
+
+00:20:28.920 --> 00:20:39.560
+ user, he can do a full screen video MP4 video, and then
+
+00:20:39.560 --> 00:20:42.200
+ just split right. And then you'll see
+
+00:20:42.200 --> 00:20:46.990
+ just half the video screen because it's no cropped, but the
+
+00:20:46.990 --> 00:20:49.320
+ video player in the background
+
+00:20:49.320 --> 00:20:55.480
+ still sends the full screen. Okay. So much for this topic.
+
+00:20:55.480 --> 00:20:59.420
+ Ah, okay. And if you want to do cropping, you have to do
+
+00:20:59.420 --> 00:21:03.720
+ your own compositor. I asked the real W
+
+00:21:05.080 --> 00:21:09.870
+ WL roots. Sorry. That's this W is complicated for me. I
+
+00:21:09.870 --> 00:21:16.120
+ asked the WL roots developers on their IRC
+
+00:21:16.120 --> 00:21:19.450
+ channel and they told me, yes, we wanted to have this. We
+
+00:21:19.450 --> 00:21:21.400
+ have an issue open, but it's not
+
+00:21:21.400 --> 00:21:24.870
+ implemented and you have to do it yourself. And yes,
+
+00:21:24.870 --> 00:21:27.320
+ whoever wants us has to do it himself. And
+
+00:21:27.320 --> 00:21:32.180
+ that's a lot of work in C. Okay. I'll jump in quickly at
+
+00:21:32.180 --> 00:21:33.800
+ one thing. Yeah. I think we were about
+
+00:21:33.800 --> 00:21:36.040
+ like two minutes break, sorry, two minutes away from our
+
+00:21:36.040 --> 00:21:38.840
+ lunch break. At which point I think the
+
+00:21:38.840 --> 00:21:42.160
+ stream will be moving on or will be stopped, but this BQB
+
+00:21:42.160 --> 00:21:44.600
+ room will be open. So yeah, Michael and
+
+00:21:44.600 --> 00:21:47.250
+ anyone else who is participating in the Q&A, you're more
+
+00:21:47.250 --> 00:21:49.160
+ than welcome to stay here and continue the
+
+00:21:49.160 --> 00:21:55.160
+ question and answer. Okay. Thank you for this announcement.
+
+00:21:55.160 --> 00:21:59.960
+ Yeah. I would like to keep answering
+
+00:21:59.960 --> 00:22:05.570
+ questions and maybe yeah, until there's no more interest or
+
+00:22:05.570 --> 00:22:08.200
+ I am hungry too, but I don't need a
+
+00:22:08.200 --> 00:22:12.600
+ lunch as I already. Yep. Okay. Sounds great. Yep. So yeah,
+
+00:22:12.600 --> 00:22:14.840
+ the stream will probably be cut off in
+
+00:22:14.840 --> 00:22:17.940
+ about a minute or so, but yeah, this room will be open and
+
+00:22:17.940 --> 00:22:20.040
+ you and others will be able to stay here
+
+00:22:20.040 --> 00:22:25.160
+ and keep asking and answering questions. Okay. Thanks.
+
+00:22:25.160 --> 00:22:29.720
+ Thank you. Then let's go on to the next
+
+00:22:29.720 --> 00:22:48.790
+ question. I just scrolled. I forgot my place. Okay. Could
+
+00:22:48.790 --> 00:22:51.000
+ you use some of the packages with
+
+00:22:51.000 --> 00:22:54.920
+ other Wayland compositors? Probably not all of it's way KDE
+
+00:22:54.920 --> 00:22:57.160
+, Rivergnome. Yes, you can. And thank
+
+00:22:57.160 --> 00:23:01.680
+ you for this idea because I already, I didn't think of this
+
+00:23:01.680 --> 00:23:04.440
+ before. You can use it because you
+
+00:23:04.440 --> 00:23:07.620
+ can talk to them. Like you can talk to Wayland protocols.
+
+00:23:07.620 --> 00:23:09.560
+ You can have a look at them. There's
+
+00:23:09.560 --> 00:23:14.830
+ like the core protocol of Wayland is in the core repository
+
+00:23:14.830 --> 00:23:18.120
+ of the Wayland project. And there's a
+
+00:23:18.120 --> 00:23:21.680
+ Wayland protocols repository. They have like three tier
+
+00:23:21.680 --> 00:23:23.720
+ staging, experimental and stable,
+
+00:23:23.720 --> 00:23:26.900
+ almost nothing in Wayland is stable. So be prepared for
+
+00:23:26.900 --> 00:23:28.920
+ some changes in the future, I think.
+
+00:23:28.920 --> 00:23:35.700
+ And you can talk to these protocols. They are not that
+
+00:23:35.700 --> 00:23:39.800
+ difficult, but some things are already a bit
+
+00:23:39.800 --> 00:23:43.370
+ too complicated. Like you have to take output and then to
+
+00:23:43.370 --> 00:23:45.640
+ get the actual width or something like
+
+00:23:45.640 --> 00:23:49.630
+ this, you have to request another output. And this one
+
+00:23:49.630 --> 00:23:52.600
+ talks to you and the other output says, okay,
+
+00:23:52.600 --> 00:23:55.050
+ I'm done or something like this. Some things are a little
+
+00:23:55.050 --> 00:23:58.680
+ bit difficult, but it's quite readable
+
+00:23:58.680 --> 00:24:03.520
+ and understandable and you can do scripting Sway, but I don
+
+00:24:03.520 --> 00:24:06.120
+'t have a lot of experience there because
+
+00:24:06.120 --> 00:24:11.930
+ like I'm an XWM user. I do it in Emacs. I'm staying on X. I
+
+00:24:11.930 --> 00:24:14.520
+ had Sway several years ago,
+
+00:24:14.520 --> 00:24:18.110
+ but only a short time. So I'm not that knowledgeable. The
+
+00:24:18.110 --> 00:24:20.040
+ next question is,
+
+00:24:20.760 --> 00:24:26.170
+ will Wayland support reach feature parity with XWM in the
+
+00:24:26.170 --> 00:24:29.560
+ future? Will there be other trade-offs?
+
+00:24:29.560 --> 00:24:35.830
+ No, it won't. Okay. But don't think, it's not something
+
+00:24:35.830 --> 00:24:38.760
+ usable because I don't think all the
+
+00:24:38.760 --> 00:24:45.530
+ features in the EXWM is needed. I want to work spaces as I
+
+00:24:45.530 --> 00:24:49.320
+ said in the talk, because yeah,
+
+00:24:49.320 --> 00:24:53.460
+ Emacs does work spaces and I won't do this, but I will do
+
+00:24:53.460 --> 00:24:58.200
+ everything. Like what's my plan with
+
+00:24:58.200 --> 00:25:01.690
+ this thing? It's like the two use cases I already alluded
+
+00:25:01.690 --> 00:25:06.280
+ to in the video. The first is you have a
+
+00:25:06.280 --> 00:25:11.030
+ Wayland surface and you show it inside an Emacs buffer or
+
+00:25:11.030 --> 00:25:13.160
+ an Emacs window. So you have a kind of
+
+00:25:13.160 --> 00:25:22.510
+ Wayland buffer, I'm calling it. That's the thing EXWM does.
+
+00:25:22.510 --> 00:25:26.600
+ And I think, yeah, it should reach
+
+00:25:26.600 --> 00:25:30.710
+ feature parity with it. It also has output management and
+
+00:25:30.710 --> 00:25:32.600
+ like the input handling,
+
+00:25:32.600 --> 00:25:37.700
+ there's like the simulation keys and I don't know what else
+
+00:25:37.700 --> 00:25:41.080
+, but actually I don't have a solution
+
+00:25:41.080 --> 00:25:46.060
+ yet for the input handling. It's a thing I haven't looked
+
+00:25:46.060 --> 00:25:49.480
+ that much into. Will there be other
+
+00:25:49.480 --> 00:25:53.660
+ trade-offs? Yeah, most certainly there are always trade-
+
+00:25:53.660 --> 00:25:56.200
+offs, but I can't tell you which.
+
+00:25:56.200 --> 00:26:00.920
+ So the next question is, what is the biggest difference
+
+00:26:00.920 --> 00:26:01.880
+ between X,
+
+00:26:01.880 --> 00:26:07.000
+ Org and Wayland that you have found? Okay, what's the
+
+00:26:07.000 --> 00:26:10.360
+ biggest difference?
+
+00:26:10.360 --> 00:26:18.970
+ Don't know actually, don't know. First of all, I'm not that
+
+00:26:18.970 --> 00:26:23.320
+ knowledgeable in X, Org. I used it,
+
+00:26:23.320 --> 00:26:28.150
+ but I have no more programs in X Window Manager. I haven't
+
+00:26:28.150 --> 00:26:30.520
+ looked a lot into it, except
+
+00:26:31.400 --> 00:26:37.380
+ WEM, I looked into the code, into Elisp code and how it
+
+00:26:37.380 --> 00:26:39.880
+ does the communication and
+
+00:26:39.880 --> 00:26:46.750
+ took inspiration of course. Yeah, big difference is you don
+
+00:26:46.750 --> 00:26:50.120
+'t have one monolithic server. Like you
+
+00:26:50.120 --> 00:26:54.390
+ have one X, Org server and in Wayland you have lots of
+
+00:26:54.390 --> 00:26:57.800
+ servers like GNOME has one, KDE has one,
+
+00:26:58.760 --> 00:27:02.510
+ then WL roots is another approach, Swae has an
+
+00:27:02.510 --> 00:27:05.480
+ implementation in WL roots and so on.
+
+00:27:05.480 --> 00:27:10.350
+ So now it's the last question I find in my path is, did you
+
+00:27:10.350 --> 00:27:13.880
+ know EAF? Yes, I know. Of course,
+
+00:27:13.880 --> 00:27:17.000
+ like I think we have a talk. We have a talk. We had talks
+
+00:27:17.000 --> 00:27:21.400
+ and I never used it. I'm sorry.
+
+00:27:22.440 --> 00:27:29.400
+ Maybe it's interesting. It's Python. I don't do a lot of
+
+00:27:29.400 --> 00:27:31.640
+ Python and
+
+00:27:31.640 --> 00:27:37.220
+ similar use case. It's like, I think it's embedded X
+
+00:27:37.220 --> 00:27:40.200
+ widgets. Please correct me if I'm wrong.
+
+00:27:40.200 --> 00:27:47.450
+ Yeah, that's all I can say to this topic. But I think like
+
+00:27:47.450 --> 00:27:49.800
+ any application framework,
+
+00:27:49.800 --> 00:27:53.920
+ you can want to do an Emacs or stuff like that will mesh
+
+00:27:53.920 --> 00:27:57.240
+ really good with Emacs compositor that
+
+00:27:57.240 --> 00:28:02.650
+ is integrated or like almost integrated in Emacs because
+
+00:28:02.650 --> 00:28:05.640
+ now you can use this to do your application
+
+00:28:05.640 --> 00:28:10.070
+ framework and paint the windows in Emacs. And I think maybe
+
+00:28:10.070 --> 00:28:12.440
+ we can come back to the reparenting
+
+00:28:12.440 --> 00:28:18.450
+ X thing, which I don't really understand. So I don't know
+
+00:28:18.450 --> 00:28:21.560
+ exactly how X does the X widgets, like
+
+00:28:21.560 --> 00:28:28.190
+ no idea. But I think we can do something similar with Way
+
+00:28:28.190 --> 00:28:31.960
+land. Like we can just embed the little
+
+00:28:31.960 --> 00:28:36.710
+ Wayland surfaces in an Emacs buffer. And that's a thing I
+
+00:28:36.710 --> 00:28:40.440
+ wanted to get a discussion started.
+
+00:28:40.440 --> 00:28:45.950
+ Someone, yeah, maybe someone has an idea. Maybe someone is
+
+00:28:45.950 --> 00:28:49.000
+ already deep down in Emacs internals
+
+00:28:49.000 --> 00:28:54.620
+ and knows how these displays stuff works like image display
+
+00:28:54.620 --> 00:28:57.880
+, X widget display, and so on.
+
+00:28:57.880 --> 00:29:03.290
+ And maybe this person or someone else has an idea how we
+
+00:29:03.290 --> 00:29:05.640
+ could do the Wayland surfaces.
+
+00:29:05.640 --> 00:29:09.280
+ Right now it's just Emacs receives a request for new
+
+00:29:09.280 --> 00:29:13.160
+ surface. Okay. You open a new program.
+
+00:29:13.160 --> 00:29:16.430
+ The program says to the Wayland server, "Hey, I'm here. I
+
+00:29:16.430 --> 00:29:19.480
+ want to have surface." Wayland server
+
+00:29:19.480 --> 00:29:24.750
+ gives it the surface and says to Emacs, "Hey, here's a new
+
+00:29:24.750 --> 00:29:27.880
+ surface. You can lay it out." And
+
+00:29:27.880 --> 00:29:31.080
+ Emacs then can lay it out or not, however it likes.
+
+00:29:31.080 --> 00:29:33.480
+ Normally the default path I choose is
+
+00:29:33.480 --> 00:29:38.490
+ Emacs bundles, the surface with a buffer. And if the buffer
+
+00:29:38.490 --> 00:29:40.600
+ is shown, it shows the surface.
+
+00:29:40.600 --> 00:29:43.690
+ And otherwise it's just hidden. But you can do whatever you
+
+00:29:43.690 --> 00:29:45.800
+ want with the surface. You just
+
+00:29:45.800 --> 00:29:49.050
+ have to say, please put it at this coordinate and this
+
+00:29:49.050 --> 00:29:52.280
+ width and this height. So you can put it in
+
+00:29:52.280 --> 00:29:54.980
+ a buffer and you can scroll it in a buffer. But this
+
+00:29:54.980 --> 00:29:57.560
+ integration, how to put something in a buffer
+
+00:29:57.560 --> 00:30:00.060
+ and scroll it there. I don't know how to do it. And I don't
+
+00:30:00.060 --> 00:30:02.920
+ know how to do it. It should be like
+
+00:30:02.920 --> 00:30:06.070
+ a good solution. I don't know how to do it. Maybe someone
+
+00:30:06.070 --> 00:30:10.040
+ of you has an idea. I'm finished with the
+
+00:30:10.040 --> 00:30:17.190
+ questions of the path. I haven't had a look in IRC because
+
+00:30:17.190 --> 00:30:20.600
+ yes, I was busy talking.
+
+00:30:20.600 --> 00:30:27.910
+ I can either like browse through the IRC if you want, or
+
+00:30:27.910 --> 00:30:31.480
+ maybe someone wants to say something or
+
+00:30:31.480 --> 00:30:36.410
+ have a look. Ah, thank you. I already answered the IRC
+
+00:30:36.410 --> 00:30:39.880
+ questions. So yes, I'm finished.
+
+00:30:39.880 --> 00:30:47.720
+ I still see some people in the room. Yeah. Maybe someone,
+
+00:30:47.720 --> 00:30:49.880
+ if you have an idea or wants to use it.
+
+00:30:49.880 --> 00:30:58.330
+ I don't know how fast I will have it in a usable state. It
+
+00:30:58.330 --> 00:30:58.840
+'s like,
+
+00:31:01.080 --> 00:31:05.200
+ at first I just wanted to do this presentation and show to
+
+00:31:05.200 --> 00:31:09.400
+ you the possibility. I already read
+
+00:31:09.400 --> 00:31:13.400
+ in the internet some places like Emacs, Devel, Mailindus
+
+00:31:13.400 --> 00:31:16.120
+ that was one time and other places that
+
+00:31:16.120 --> 00:31:20.080
+ other people's had the same, other person had the same
+
+00:31:20.080 --> 00:31:25.800
+ ideas. But I was thinking just to lay out
+
+00:31:25.800 --> 00:31:29.740
+ the general idea to you. And then I thought, okay, do an
+
+00:31:29.740 --> 00:31:32.200
+ experiment, show if it works. And the
+
+00:31:32.200 --> 00:31:35.870
+ experiments spun a little bit. It worked. And so I got
+
+00:31:35.870 --> 00:31:40.520
+ further and now I have an almost usable thing,
+
+00:31:40.520 --> 00:31:46.990
+ but I already spent like a month with it. So we'll take
+
+00:31:46.990 --> 00:31:49.640
+ some more time to finish.
+
+00:31:52.840 --> 00:31:59.040
+ Yeah. Thanks that you think, Gary, that you think it's, you
+
+00:31:59.040 --> 00:32:03.800
+ are happy to test it. Thank you.
+
+00:32:03.800 --> 00:32:08.870
+ I would like to have it like a little bit more flexible
+
+00:32:08.870 --> 00:32:11.240
+ than the X solutions, because
+
+00:32:11.240 --> 00:32:16.880
+ as I told you can have it nested, like you have a normal Em
+
+00:32:16.880 --> 00:32:20.760
+acs and you can just do the embedding
+
+00:32:20.760 --> 00:32:24.710
+ and the embedded surfaces. And so in a normal Emacs and you
+
+00:32:24.710 --> 00:32:27.400
+ don't have to give Emacs the whole
+
+00:32:27.400 --> 00:32:35.080
+ desktop. So you don't have to do XWM. You can just have a
+
+00:32:35.080 --> 00:32:39.080
+ normal Emacs window and have all the goodies
+
+00:32:39.080 --> 00:32:45.770
+ and features there. Okay. Again, the code will be available
+
+00:32:45.770 --> 00:32:49.080
+ on my site. I can post you the link,
+
+00:32:49.080 --> 00:32:54.330
+ but there's nothing there yet. Oh, wait a few days. I was
+
+00:32:54.330 --> 00:32:57.480
+ thinking of doing it this weekend,
+
+00:32:57.480 --> 00:33:03.190
+ but it's EmacsConf and I want to listen to your ideas and
+
+00:33:03.190 --> 00:33:06.360
+ participate and don't do coding instead.
+
+00:33:06.360 --> 00:33:15.080
+ This is the link. I could put it on another code forge, but
+
+00:33:15.080 --> 00:33:18.120
+ I want to do something
+
+00:33:19.880 --> 00:33:19.880
+
+
+00:33:19.880 --> 00:33:26.340
+ myself instead. I have a landing page. If I put it in my
+
+00:33:26.340 --> 00:33:29.320
+ browser, it's just,
+
+00:33:29.320 --> 00:33:35.840
+ yeah, no connection possible. It's not configured. It's
+
+00:33:35.840 --> 00:33:39.080
+ just bought, wait a few days.
+
+00:33:42.120 --> 00:33:46.520
+ Okay. Short question for the room. Does anyone know someone
+
+00:33:46.520 --> 00:33:48.280
+ else working on stuff like this?
+
+00:33:48.280 --> 00:34:05.250
+ Because if, please let them know so we can team up and don
+
+00:34:05.250 --> 00:34:06.840
+'t do it twice.
+
+00:34:11.800 --> 00:34:14.440
+ I had a lot of fun with the Emacs part of the code. I like
+
+00:34:14.440 --> 00:34:17.640
+ coding in Elisp in general,
+
+00:34:17.640 --> 00:34:22.480
+ but it's not that much fun to work on the C side. It's
+
+00:34:22.480 --> 00:34:26.520
+ complex and prone to break.
+
+00:34:26.520 --> 00:34:32.360
+ So don't mind collaborating.
+
+00:34:41.560 --> 00:34:45.960
+ Why the sad face?
+
+00:34:45.960 --> 00:34:56.920
+ Yes, I know the lack of active development.
+
+00:35:02.920 --> 00:35:09.400
+ Okay. Because yeah, so no problem. You can't know anyone or
+
+00:35:09.400 --> 00:35:10.120
+ a lot of,
+
+00:35:10.120 --> 00:35:15.280
+ like, it's a good thing. So I got to start it and I wanted
+
+00:35:15.280 --> 00:35:16.200
+ to start,
+
+00:35:16.200 --> 00:35:24.260
+ you know, people quitting the XW. I don't have problems yet
+
+00:35:24.260 --> 00:35:26.120
+. It's not that I started
+
+00:35:26.120 --> 00:35:28.720
+ implementing this because I thought, ah, it's not working
+
+00:35:28.720 --> 00:35:30.840
+ anymore. I need something new. It's like,
+
+00:35:30.840 --> 00:35:37.680
+ it's works fine. I just did it because I thought, well, why
+
+00:35:37.680 --> 00:35:39.720
+ not do something new? And because it
+
+00:35:39.720 --> 00:35:45.180
+ opens new possibilities, which weren't there before, or at
+
+00:35:45.180 --> 00:35:47.320
+ least I didn't know of them.
+
+00:35:47.320 --> 00:35:58.920
+ Okay. How could I put this? Okay. If it's ready for no, as
+
+00:35:58.920 --> 00:36:00.440
+ I will promote it. If it's
+
+00:36:00.440 --> 00:36:06.030
+ ready for normal usement, like you can just install it and
+
+00:36:06.030 --> 00:36:09.480
+ use it for an everyday driver
+
+00:36:09.480 --> 00:36:12.150
+ and have you do it. You would X session file and can just
+
+00:36:12.150 --> 00:36:14.840
+ start it up. It won't be an X session
+
+00:36:14.840 --> 00:36:18.660
+ file because that's X and that's a thing of the past and,
+
+00:36:18.660 --> 00:36:20.200
+ but something similar.
+
+00:36:20.200 --> 00:36:26.320
+ I could imagine posting, like, I don't know, he makes lists
+
+00:36:26.320 --> 00:36:28.280
+, Reddit, something like this, but
+
+00:36:29.160 --> 00:36:33.240
+ until then, like the code I will release now, it's just
+
+00:36:33.240 --> 00:36:34.200
+ experimental and
+
+00:36:34.200 --> 00:36:41.710
+ it's for the people who want to get involved and, or want
+
+00:36:41.710 --> 00:36:43.320
+ to do their own thing with it,
+
+00:36:43.320 --> 00:36:48.130
+ use the client to automate sway or so for them. It's really
+
+00:36:48.130 --> 00:36:49.640
+ interesting.
+
+00:36:50.200 --> 00:36:50.200
+
+
+00:36:50.200 --> 00:37:00.200
+ [inaudible]
+
+00:37:00.200 --> 00:37:02.760
+ Yes, I know. Like you,
+
+00:37:02.760 --> 00:42:20.290
+ okay, this sway.el, I have to look at it, but I don't think
+
+00:42:20.290 --> 00:37:15.000
+ now is a good idea.
+
+00:37:17.160 --> 00:37:21.680
+ Maybe something useful there. Thank you, PlasmaStrike and G
+
+00:37:21.680 --> 00:37:22.520
+argiola.
+
+00:37:22.520 --> 00:37:28.450
+ Yes, people are moving and Valent is the future. That's the
+
+00:37:28.450 --> 00:37:30.680
+ point I wanted to say. Like, I think
+
+00:37:30.680 --> 00:37:36.840
+ you can stay on X, like in the future, but it's not gonna
+
+00:37:36.840 --> 00:37:38.760
+ get that much development and
+
+00:37:38.760 --> 00:37:42.520
+ sooner or later, like there will be new features and you
+
+00:37:42.520 --> 00:37:44.200
+ won't have it in the old one and stuff
+
+00:37:44.200 --> 00:37:48.690
+ like that. And for Emacs to be viable as a window manager
+
+00:37:48.690 --> 00:37:51.560
+ in this whole computing environment, or as
+
+00:37:51.560 --> 00:37:56.810
+ I said, a Lispy Linux desktop, I think it needs to have
+
+00:37:56.810 --> 00:37:59.000
+ this Valent capability and
+
+00:37:59.000 --> 00:38:08.680
+ that's the way for it to get it.
+
+00:38:09.960 --> 00:38:09.960
+
+
+00:38:09.960 --> 00:38:21.960
+ [inaudible]
+
+00:38:21.960 --> 00:38:28.510
+ I'm just reading the IRC log and someone wrote, I was
+
+00:38:28.510 --> 00:38:32.600
+ amazed to see the video inside Emacs.
+
+00:38:32.600 --> 00:38:44.280
+ Thank you. That was meant to be amazing. Yeah, thank you.
+
+00:38:45.560 --> 00:38:45.560
+
+
+00:38:45.560 --> 00:38:45.640
+ [inaudible]
+
+00:38:46.920 --> 00:38:46.920
+
+
+00:38:46.920 --> 00:38:47.000
+ [inaudible]
+
+00:38:48.280 --> 00:38:48.280
+
+
+00:38:48.280 --> 00:38:48.360
+ [inaudible]
+
+00:38:49.640 --> 00:38:49.640
+
+
+00:38:49.640 --> 00:38:49.720
+ [inaudible]
+
+00:38:51.000 --> 00:38:51.000
+
+
+00:38:51.000 --> 00:38:51.080
+ [inaudible]
+
+00:38:52.080 --> 00:38:52.240
+ [inaudible]
+
+00:38:52.240 --> 00:38:52.400
+ [inaudible]
+
+00:38:52.400 --> 00:38:52.480
+ [inaudible]
+
+00:38:52.480 --> 00:38:52.640
+ [inaudible]
+
+00:38:52.640 --> 00:38:52.720
+ [inaudible]
+
+00:38:52.720 --> 00:38:52.800
+ [inaudible]
+
+00:38:52.800 --> 00:38:52.880
+ [inaudible]
+
+00:38:52.880 --> 00:38:52.960
+ [inaudible]
+
+00:38:52.960 --> 00:38:53.040
+ [inaudible]
+
+00:38:53.040 --> 00:38:53.120
+ [inaudible]
+
+00:38:53.120 --> 00:38:53.200
+ [inaudible]
+
+00:38:53.200 --> 00:38:53.200
+ [inaudible]
+
+00:38:53.200 --> 00:38:53.280
+ [inaudible]
+
+00:38:53.280 --> 00:38:53.360
+ [inaudible]
+
+00:38:53.360 --> 00:38:53.440
+ [inaudible]
+
+00:38:53.440 --> 00:38:53.520
+ [inaudible]
+
+00:38:53.520 --> 00:38:53.600
+ [inaudible]
+
+00:38:53.600 --> 00:38:53.680
+ [inaudible]
+
+00:38:53.680 --> 00:38:53.760
+ [inaudible]
+
+00:38:53.760 --> 00:38:53.840
+ [inaudible]
+
+00:38:53.840 --> 00:38:53.920
+ [inaudible]
+
+00:38:53.920 --> 00:38:54.000
+ [inaudible]
+
+00:38:54.000 --> 00:38:54.080
+ [inaudible]
+
+00:38:54.080 --> 00:38:54.160
+ [inaudible]
+
+00:38:54.160 --> 00:38:54.160
+ [inaudible]
+
+00:38:54.160 --> 00:38:54.240
+ [inaudible]
+
+00:38:54.240 --> 00:38:54.240
+ [inaudible]
+
+00:38:54.240 --> 00:38:54.320
+ [inaudible]
+
+00:38:54.320 --> 00:38:54.400
+ [inaudible]
+
+00:38:54.400 --> 00:38:54.480
+ [inaudible]
+
+00:38:54.480 --> 00:38:54.560
+ [inaudible]
+
+00:38:54.560 --> 00:38:54.640
+ [inaudible]
+
+00:38:54.640 --> 00:38:54.640
+ [inaudible]
+
+00:38:54.640 --> 00:38:54.720
+ [inaudible]
+
+00:38:54.720 --> 00:38:54.720
+ [inaudible]
+
+00:38:54.720 --> 00:38:54.800
+ [inaudible]
+
+00:38:54.800 --> 00:38:54.880
+ [inaudible]
+
+00:38:54.880 --> 00:38:54.960
+ [inaudible]
+
+00:38:54.960 --> 00:38:55.040
+ [inaudible]
+
+00:38:55.040 --> 00:38:55.120
+ [inaudible]
+
+00:38:55.120 --> 00:39:20.000
+ [inaudible]
+
+00:39:20.000 --> 00:39:20.080
+ [inaudible]
+
+00:39:20.080 --> 00:39:20.160
+ [inaudible]
+
+00:39:20.160 --> 00:39:20.240
+ [inaudible]
+
+00:39:20.800 --> 00:39:20.800
+
+
+00:39:20.800 --> 00:39:25.920
+ Okay, Emax could already do. I'm just reading the IRC
+
+00:39:25.920 --> 00:39:46.400
+ because I don't know what else to say right now.
+
+00:39:46.400 --> 00:39:57.040
+ [inaudible]
+
+00:39:57.040 --> 00:40:00.880
+ Yeah, it's nice to see so many people saying thank you and
+
+00:40:00.880 --> 00:40:07.600
+ at least I read it like two times now. So yeah, I'm pleased
+
+00:40:07.600 --> 00:40:10.160
+ to see this and the interest in
+
+00:40:10.160 --> 00:40:16.400
+ gender.
+
+00:40:16.400 --> 00:40:26.640
+ [inaudible]
+
+00:40:26.640 --> 00:40:38.640
+ [inaudible]
+
+00:40:38.640 --> 00:40:49.370
+ Okay, I see there's still some people typing and it's a lot
+
+00:40:49.370 --> 00:40:52.240
+ of more thank yous and yeah,
+
+00:40:52.240 --> 00:41:00.980
+ thank you. I'm pleased and I will publish stuff like if it
+
+00:41:00.980 --> 00:41:06.320
+'s usable. I want to use it myself,
+
+00:41:06.320 --> 00:41:13.410
+ so if you're in luck, you can use it too. And let's see, I
+
+00:41:13.410 --> 00:41:18.160
+ think I wrap up this Q&A here and
+
+00:41:18.160 --> 00:41:22.780
+ yeah, thank you for the discussion, for your questions and
+
+00:41:22.780 --> 00:41:27.280
+ your interest and have a nice rest
+
+00:41:27.280 --> 00:41:48.950
+ of EmaxConf. Yeah, bye. I'm just going to leave the room or
+
+00:41:48.950 --> 00:41:51.760
+ microphone or go back to EmaxConf.
+
+00:41:55.360 --> 00:41:56.480
+ Sounds good. Thanks again.
+
+00:41:56.480 --> 00:42:00.320
+ Ah, you're still there.
+
+00:42:00.320 --> 00:42:03.760
+ Hey, yeah, I just got back for a second.
+
+00:42:03.760 --> 00:42:05.380
+ Okay.
+
+00:42:05.380 --> 00:42:08.960
+ Yeah, just wanted to say thanks for the great talk and I'll
+
+00:42:08.960 --> 00:42:10.720
+ definitely be watching it and the Q&A.
+
+00:42:10.720 --> 00:42:13.280
+ And yeah, it's very exciting stuff.
+
+00:42:13.280 --> 00:42:17.350
+ Yeah, thank you. I got the feedback now. It's exciting. I
+
+00:42:17.350 --> 00:42:20.400
+ think so too. So yeah,
+
+00:42:20.400 --> 00:42:24.160
+ have a nice time at EmaxConf and see you next time. Bye.
+
+00:42:24.160 --> 00:42:27.920
+ Thank you. You as well. See you around. Bye.
+
+00:42:27.920 --> 00:42:28.420
+ Bye.
+
+00:42:30.420 --> 00:42:30.420
+
+
+00:42:30.420 --> 00:42:30.920
+ Bye.
+
+00:42:32.920 --> 00:42:32.920
+
+
+00:42:32.920 --> 00:42:33.420
+ Bye.
+
+00:42:35.420 --> 00:42:35.420
+
+
+00:42:35.420 --> 00:42:35.920
+ Bye.
+
+00:42:37.920 --> 00:42:37.920
+
+
+00:42:37.920 --> 00:42:38.420
+ Bye.
+
+00:42:38.420 --> 00:42:46.420
+ Bye.
+
diff --git a/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.vtt b/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.vtt
new file mode 100644
index 00000000..34eeb842
--- /dev/null
+++ b/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.vtt
@@ -0,0 +1,471 @@
+WEBVTT captioned by bhavin192
+
+NOTE Introduction
+
+00:00.000 --> 00:08.000
+Hello EmacsConf and hello fellow Emacs fans.
+
+00:08.000 --> 00:10.920
+My name is Michael Bauer, and I'm from Germany.
+
+00:10.920 --> 00:00:13.440
+I'm gonna talk to you about "Why and how Emacs
+
+00:00:13.440 --> 00:00:17.200
+should become a Wayland compositor."
+
+00:17.200 --> 00:21.740
+And it already kinda is a Wayland compositor.
+
+00:21.740 --> 00:25.000
+This talk is composed by Wayland and Emacs.
+
+00:25.000 --> 00:00:26.840
+If I'm talking about a Wayland compositor
+
+00:00:26.840 --> 00:00:29.360
+or Emacs as Wayland compositor,
+
+00:00:29.360 --> 00:00:30.440
+I mean it in the sense that
+
+00:00:30.440 --> 00:00:36.000
+EXWM is an X window manager. I hope you know EXWM.
+
+NOTE Why
+
+00:36.000 --> 00:41.000
+So, why?
+
+00:41.000 --> 00:00:44.120
+Emacs can do Wayland now, that was a stopper
+
+00:00:44.120 --> 00:00:49.000
+before, and now it's solved with `pgtk` branch.
+
+00:49.000 --> 00:00:53.240
+It makes the Emacs toolbox bigger,
+
+00:00:53.240 --> 00:00:55.000
+which is always a good thing.
+
+00:55.000 --> 00:00:58.440
+And the cool thing about Wayland, which is not
+
+00:00:58.440 --> 00:01:02.280
+possible under X is, it can run standalone
+
+00:01:02.280 --> 00:01:06.840
+on the Linux kernel interface, or nested under X,
+
+00:01:06.840 --> 00:01:07.120
+or even nested under Wayland.
+
+01:09.000 --> 00:01:13.840
+The compositor features of Emacs doesn't mean
+
+00:01:13.840 --> 00:01:16.960
+it has to take over the whole output.
+
+00:01:16.960 --> 00:01:20.560
+It can use them, even if it's just like
+
+00:01:20.560 --> 00:01:23.080
+a normal window or normal program.
+
+01:23.000 --> 00:01:25.120
+And last reason is,
+
+00:01:25.120 --> 00:01:27.240
+I want to keep living inside Emacs
+
+00:01:27.240 --> 00:01:31.000
+and Wayland is the future, apparently.
+
+NOTE EXWM use case
+
+01:31.000 --> 01:35.000
+EXWM use case is the first use case.
+
+01:35.000 --> 00:01:38.400
+You take a Wayland surface and put it inside
+
+00:01:38.400 --> 00:01:41.520
+an Emacs window. You see it right below.
+
+00:01:41.520 --> 00:01:45.880
+The video of me is a Wayland surface,
+
+00:01:45.880 --> 00:01:50.000
+and it's inside an Emacs window managed by Emacs.
+
+01:50.000 --> 00:01:53.480
+Emacs does the input, and the clipboard handling,
+
+00:01:53.480 --> 00:01:59.000
+and can insert itself here, and do great things.
+
+01:59.000 --> 00:02:03.200
+And it's a possibility to Lispify the Linux desktop,
+
+00:02:03.200 --> 00:02:08.000
+as Emacs Lispifies the command line.
+
+NOTE XWidget use case
+
+02:08.000 --> 00:02:12.960
+The other use case is the XWidget use case.
+
+00:02:12.960 --> 00:02:17.000
+I don't know if you know XWidgets.
+
+02:17.000 --> 00:02:19.720
+It's embedded X windows inside Emacs.
+
+00:02:19.720 --> 00:02:24.000
+There's a web browser available in Emacs.
+
+02:24.000 --> 00:02:27.520
+With Wayland, you could embed anything that can
+
+00:02:27.520 --> 00:02:32.000
+create a Wayland surface like video, web, or 3D.
+
+02:32.000 --> 00:02:34.880
+Think OpenGL, something like
+
+00:02:34.880 --> 00:02:38.000
+EmacsGL would be possible.
+
+02:38.000 --> 02:46.000
+And we wouldn't have just images like we have so far.
+
+NOTE How
+
+02:46.000 --> 00:02:50.560
+So, how to implement this Wayland compositor?
+
+00:02:50.560 --> 00:02:52.560
+I'm going to tell you how I did it,
+
+00:02:52.560 --> 00:02:57.000
+or I did this demo I'm showing you right now.
+
+02:57.000 --> 00:03:00.680
+First of all, how does Wayland work?
+
+00:03:00.680 --> 00:03:04.000
+Wayland is a protocol in XML.
+
+03:04.000 --> 00:03:11.120
+It's a server and client, and they share a set of
+
+00:03:11.120 --> 00:03:13.960
+objects, and the objects have methods.
+
+00:03:13.960 --> 00:03:16.120
+They are specified in the protocol,
+
+00:03:16.120 --> 00:03:24.080
+and Wayland also says how the server
+
+00:03:24.080 --> 00:03:25.720
+and client talk to each other.
+
+00:03:25.720 --> 00:03:33.440
+First blocker for Emacs becoming a Wayland
+
+00:03:33.440 --> 00:03:37.000
+compositor is that Emacs and Wayland both have
+
+00:03:37.000 --> 00:03:41.880
+their own event loop, and you can't merge them too.
+
+00:03:41.880 --> 00:03:45.800
+But you don't have to merge them
+
+00:03:45.800 --> 00:03:48.000
+because you can just make Emacs speak Wayland.
+
+03:48.000 --> 00:03:50.040
+So, Emacs becomes a Wayland client,
+
+00:03:50.040 --> 00:03:53.000
+and there's an extra server Emacs is talking to.
+
+03:53.000 --> 00:03:59.160
+So, we need a minimal Wayland server that does all
+
+00:03:59.160 --> 00:04:03.000
+the stuff Emacs can't do and do the rest in Emacs.
+
+04:03.000 --> 00:04:07.800
+---The minimal Wayland server, I did it in wlroots.
+
+00:04:07.800 --> 00:04:13.040
+That's the library behind Sway. I think it's
+
+00:04:13.040 --> 00:04:20.000
+the Wayland library to do stuff like this.
+
+04:20.000 --> 04:26.000
+I implemented four different things to make it work.
+
+04:26.000 --> 00:04:30.680
+It's these three letter acronyms on the left.
+
+00:04:30.680 --> 00:04:34.520
+It's Emacs, Wayland, and then it's a server,
+
+00:04:34.520 --> 00:04:38.000
+a client, a protocol, and buffers.
+
+04:38.000 --> 04:44.000
+The server is written in C and it's mostly tinywl.
+
+04:44.000 --> 00:04:46.280
+It's the example of wlroots,
+
+00:04:46.280 --> 00:04:52.000
+and it's around 1000 lines of code.
+
+04:52.000 --> 00:04:54.960
+ewc, the Wayland client in Emacs,
+
+00:04:54.960 --> 00:04:58.560
+is the thing I'm most proud of.
+
+00:04:58.560 --> 00:05:02.120
+It's 300 lines of code, and it is a
+
+00:05:02.120 --> 00:05:08.000
+fully featured Wayland client in Emacs.
+
+05:08.000 --> 00:05:11.640
+With this, Emacs can speak Wayland,
+
+00:05:11.640 --> 00:05:18.000
+and then I implemented Emacs Wayland protocol.
+
+05:18.000 --> 00:05:21.280
+It more or less allows Emacs to become a Wayland
+
+00:05:21.280 --> 00:05:24.640
+window manager, so it's not actually the compositor.
+
+00:05:24.640 --> 00:05:27.680
+The compositor stays in C, but Emacs is
+
+00:05:27.680 --> 00:05:31.000
+now a Wayland window manager!
+
+05:31.000 --> 00:05:34.520
+And the last thing is Emacs Wayland buffers.
+
+00:05:34.520 --> 00:05:35.880
+It's the window manager part.
+
+00:05:35.880 --> 00:05:38.440
+It's around 500 lines of code,
+
+00:05:38.440 --> 00:05:41.680
+and it does the buffer management inside
+
+00:05:41.680 --> 00:05:45.680
+Emacs windows, or floating right like you see me
+
+00:05:45.680 --> 00:05:48.000
+now floating on the right.
+
+05:48.000 --> 00:05:51.000
+It works, but it is still buggy,
+
+00:05:51.000 --> 00:05:54.320
+and it is also missing input handling,
+
+00:05:54.320 --> 00:06:01.000
+so there's more code to come for this to work.
+
+NOTE Caveats
+
+06:01.000 --> 06:05.000
+Some caveats about this approach.
+
+06:05.000 --> 00:06:09.640
+wlroots is around 60 kilo LoCs (Line of Code)
+
+00:06:09.640 --> 00:06:12.000
+and in active development.
+
+06:12.000 --> 00:06:16.640
+They have like a slogan 60 kilo locs of code
+
+00:06:16.640 --> 00:06:19.760
+you had to write anyway to make a Wayland
+
+00:06:19.760 --> 00:06:22.520
+compositor. And no, you don't have to write it.
+
+00:06:22.520 --> 00:06:25.840
+But I still remember when it was like 50 kilo locs,
+
+00:06:25.840 --> 00:06:29.680
+and now it's 60. And it's like a moving target.
+
+00:06:29.680 --> 00:06:32.480
+I think it could be quite a lot of work
+
+00:06:32.480 --> 00:06:34.000
+to keep up with it.
+
+06:34.000 --> 06:41.000
+Yeah, it could be quite a bit of work.
+
+06:41.000 --> 06:46.000
+Some windows don't like to keep the aspect ratios.
+
+06:46.000 --> 00:06:49.560
+You tell them and you have to crop them.
+
+00:06:49.560 --> 00:06:53.000
+And the interface I use in wlroots for doing this,
+
+06:53.000 --> 00:06:57.280
+`wlr_scene`, can't do cropping yet,
+
+00:06:57.280 --> 00:07:01.000
+so this doesn't work.
+
+07:01.000 --> 00:07:03.240
+Another problem is with GTK.
+
+00:07:03.240 --> 00:07:03.280
+Once Wayland is enabled and it stays on.
+
+07:11.000 --> 00:07:12.560
+This doesn't make sense.
+
+00:07:12.560 --> 00:07:15.000
+Okay, if you kill the Wayland server,
+
+00:07:15.000 --> 00:07:18.000
+GTK kills Emacs, that's not a good thing.
+
+07:18.000 --> 00:07:21.000
+And it's still a bit of work and fussing needed
+
+00:07:21.000 --> 00:07:23.640
+to get this to work reliably.
+
+00:07:23.640 --> 00:07:26.000
+It's quite buggy right now.
+
+NOTE Call to action
+
+07:26.000 --> 07:30.000
+And that brings me to my call to action.
+
+07:30.000 --> 00:07:34.440
+I think making Emacs Wayland capable is
+
+00:07:34.440 --> 00:07:39.000
+a further step to make an Emacs OS.
+
+07:39.000 --> 00:07:41.360
+It gains output and input handling.
+
+00:07:41.360 --> 00:07:44.120
+Output handling is already there,
+
+00:07:44.120 --> 00:07:45.760
+input handling is still missing,
+
+00:07:45.760 --> 00:07:49.720
+but Emacs can manage monitors, outputs,
+
+00:07:49.720 --> 00:07:53.040
+different frames if it's like nested,
+
+00:07:53.040 --> 00:07:57.080
+And inputs, keyboards, simulation keys,
+
+00:07:57.080 --> 00:07:58.000
+stuff like that.
+
+07:58.000 --> 08:02.000
+We could use it in more ways for Emacs display, maybe.
+
+08:02.000 --> 00:08:05.720
+Wayland just manages simple pixel buffers,
+
+00:08:05.720 --> 00:08:09.000
+so it's a protocol for managing pixel buffers.
+
+08:09.000 --> 00:08:12.560
+And in a sense, we could go back to
+
+00:08:12.560 --> 00:08:15.560
+the old X ways and maybe even ditch GTK.
+
+00:08:15.560 --> 00:08:18.000
+I don't know, but why need it?
+
+08:18.000 --> 00:08:20.600
+We can composite without it.
+
+00:08:20.600 --> 00:08:27.000
+Let's make buffer menus, buffer world, buffer.
+
+08:27.000 --> 00:08:29.040
+Emacs Wayland protocol, like I did it,
+
+00:08:29.040 --> 00:08:34.040
+allows a very concise design, and it allows
+
+00:08:34.040 --> 00:08:38.000
+to improve on the EXWM code base.
+
+08:38.000 --> 00:08:41.840
+And I wrote KISS style because EXWM has
+
+00:08:41.840 --> 00:08:45.000
+workspace management integrated.
+
+08:45.000 --> 00:08:50.600
+I don't think that's needed, like Emacs does it.
+
+00:08:50.600 --> 00:08:53.640
+Why do you have to do something extra?
+
+00:08:53.640 --> 00:08:56.000
+So why do it?
+
+08:56.000 --> 00:09:00.040
+To finish the call to action,
+
+00:09:00.040 --> 00:09:03.280
+if this is the thing you want to see in Emacs,
+
+00:09:03.280 --> 00:09:06.600
+maybe you want to get involved, have some ideas,
+
+00:09:06.600 --> 00:09:10.000
+so we could discuss it.
+
+09:10.000 --> 00:09:14.960
+I'm looking forward to discuss with you
+
+00:09:14.960 --> 00:09:21.000
+and hear your questions and ideas.
+
+09:21.000 --> 00:09:24.200
+I want to say a big thank you to the
+
+00:09:24.200 --> 00:09:26.600
+organizers of EmacsConf and the other speakers
+
+00:09:26.600 --> 00:09:29.000
+for making this event possible.
+
+09:29.000 --> 09:39.000
+Thank you, and see you.
diff --git a/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers--chapters.vtt b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers--chapters.vtt
new file mode 100644
index 00000000..e26d08e8
--- /dev/null
+++ b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers--chapters.vtt
@@ -0,0 +1,23 @@
+WEBVTT captioned by Sebastian
+
+
+00:00:00.000 --> 00:01:23.674
+Introduction
+
+00:01:23.774 --> 00:02:38.882
+Q1 - Does it become unwieldy due to the interaction of the edit org-source to use org-mode and the virtual linear programming as the project becomes larger?
+
+00:02:38.982 --> 00:03:16.080
+Q2 - I want to take a look at the files used in your demo, are they somewhere online?
+
+00:03:16.080 --> 00:04:54.960
+Digression - some explanations about the background dinosaur :D
+
+00:04:54.960 --> 00:05:49.640
+Information about org-entry-get
+
+00:05:49.640 --> 00:13:32.960
+Are workflows as they are in your life closely tied to particular projects or are they general workflows? - Long discussion about the workflow!
+
+00:13:32.960 --> 00:17:54.440
+Wrapping up
diff --git a/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.vtt b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.vtt
new file mode 100644
index 00000000..407cc711
--- /dev/null
+++ b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.vtt
@@ -0,0 +1,893 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:03.760
+ Okay, hi everyone. Yeah, sorry George, I'm just going to
+
+00:00:03.760 --> 00:00:06.520
+ introduce you a little bit.
+
+00:00:06.520 --> 00:00:10.500
+ For context, generally when I arrive on a BBB room, I have
+
+00:00:10.500 --> 00:00:11.880
+ a little bit of time to chat
+
+00:00:11.880 --> 00:00:14.810
+ with the speaker, but right now I made it right on time and
+
+00:00:14.810 --> 00:00:16.040
+ I barely had time to say
+
+00:00:16.040 --> 00:00:19.190
+ hi to George, but I will do it live. Hi George, how are you
+
+00:00:19.190 --> 00:00:19.720
+ doing?
+
+00:00:19.720 --> 00:00:26.330
+ Hello! No, doing well. I do think some of the content in
+
+00:00:26.330 --> 00:00:28.520
+ the etherpad got overridden.
+
+00:00:28.520 --> 00:00:33.520
+ Like I was typing out a whole bunch of different stuff with
+
+00:00:33.520 --> 00:00:36.320
+ other workflows to develop, but
+
+00:00:36.320 --> 00:00:40.330
+ I will try to find where that went. Yeah, so George,
+
+00:00:40.330 --> 00:00:41.640
+ nothing is lost. Don't worry
+
+00:00:41.640 --> 00:00:47.260
+ about this, we will get it back to you. I believe it's my
+
+00:00:47.260 --> 00:00:49.760
+ fault. I looked at the pad
+
+00:00:49.760 --> 00:00:51.920
+ and I said, "Oh, this is not a question, this is a pad."
+
+00:00:51.920 --> 00:00:53.800
+ And I think one of my Helvan
+
+00:00:53.800 --> 00:00:56.060
+ helps in the background said, "Oh yeah, I'm just going to
+
+00:00:56.060 --> 00:00:57.400
+ wipe this all out." But don't
+
+00:00:57.400 --> 00:01:00.360
+ worry, it's still in the history and we'll be able to find
+
+00:01:00.360 --> 00:01:01.600
+ all the code you had.
+
+00:01:01.600 --> 00:01:07.310
+ Cool, we'll find it. Yeah, so... So George, I'm just going
+
+00:01:07.310 --> 00:01:08.240
+ to... Sorry, this
+
+00:01:08.240 --> 00:01:11.940
+ is my task, to give you some context otherwise. Do you have
+
+00:01:11.940 --> 00:01:13.840
+ the pad open in front of you?
+
+00:01:13.840 --> 00:01:18.030
+ I do, yeah. I have the pad open. Would you be able to take
+
+00:01:18.030 --> 00:01:19.000
+ questions from there?
+
+00:01:19.000 --> 00:01:23.630
+ Yeah, so we can take questions from here. I think we've
+
+00:01:23.630 --> 00:01:26.240
+ already answered a bunch. So
+
+00:01:26.240 --> 00:01:30.060
+ one of the ones that's in there right now is, "Does it
+
+00:01:30.060 --> 00:01:32.720
+ become unwieldy due to the indirection
+
+00:01:32.720 --> 00:01:36.000
+ of the edit org source to use org mode and the virtual
+
+00:01:36.000 --> 00:01:37.880
+ linear programming as the project
+
+00:01:37.880 --> 00:01:44.250
+ becomes larger?" It can. So I generally use it for... I
+
+00:01:44.250 --> 00:01:47.160
+ find parts of the project that
+
+00:01:47.160 --> 00:01:53.390
+ are more useful for it and to be dropping in. So like on a
+
+00:01:53.390 --> 00:01:56.400
+ large project, when I'm working
+
+00:01:56.400 --> 00:02:01.200
+ with other people, I do not use it as much because you need
+
+00:02:01.200 --> 00:02:03.680
+ to actually be able to modify
+
+00:02:03.680 --> 00:02:08.480
+ the code. However, I just recently found out about a
+
+00:02:08.480 --> 00:02:11.160
+ feature called detangle, which is
+
+00:02:11.160 --> 00:02:15.060
+ the inverse of the tangle where as long as there's certain
+
+00:02:15.060 --> 00:02:17.120
+ tokens emitted into your file,
+
+00:02:17.120 --> 00:02:20.110
+ you'll be able to take the file and re-update back into the
+
+00:02:20.110 --> 00:02:21.960
+ linear programming document,
+
+00:02:21.960 --> 00:02:24.840
+ which is kind of mind-blowing as a feature. I have not had
+
+00:02:24.840 --> 00:02:26.280
+ a chance to experiment with
+
+00:02:26.280 --> 00:02:34.170
+ it yet though, and I think that could work really, really
+
+00:02:34.170 --> 00:02:35.920
+ well. Thanks for restoring
+
+00:02:35.920 --> 00:02:41.090
+ the stuff I was putting in. "I want to take a look at the
+
+00:02:41.090 --> 00:02:42.880
+ files used in your demo. Are
+
+00:02:42.880 --> 00:02:47.420
+ they somewhere online?" So I dropped the stuff I used for
+
+00:02:47.420 --> 00:02:51.720
+ the Arduino stuff. Now, caveat
+
+00:02:51.720 --> 00:02:55.220
+ with that, I was figuring out the workflows as I did it. So
+
+00:02:55.220 --> 00:02:57.320
+ there's like a readme of...
+
+00:02:57.320 --> 00:03:02.110
+ I was both figuring out Arduino and workflows. So the
+
+00:03:02.110 --> 00:03:05.400
+ initial readme has a bunch of projects
+
+00:03:05.400 --> 00:03:08.270
+ as I kind of did them one by one. So the workflow becomes
+
+00:03:08.270 --> 00:03:10.240
+ more mature the further down the list
+
+00:03:10.240 --> 00:03:16.080
+ you are. The ones earlier on are just copy-pasting a lot.
+
+00:03:16.080 --> 00:03:21.600
+ Do we have any other questions? This
+
+00:03:21.600 --> 00:03:25.590
+ is not the same shirt. You noticed. Also, the room's been
+
+00:03:25.590 --> 00:03:27.440
+ rearranged because my wife
+
+00:03:27.440 --> 00:03:30.640
+ made me move everything.
+
+00:03:30.640 --> 00:03:33.350
+ That's fine. Don't worry about it. It looks fine in the
+
+00:03:33.350 --> 00:03:35.000
+ background. I was implying that
+
+00:03:35.000 --> 00:03:37.290
+ you know the seven mistake game, trying to see what changed
+
+00:03:37.290 --> 00:03:38.360
+ in the background. I was
+
+00:03:38.360 --> 00:03:40.330
+ very interested though in some of the stuff that I was
+
+00:03:40.330 --> 00:03:41.720
+ seeing, including this dinner in
+
+00:03:41.720 --> 00:03:42.720
+ the background.
+
+00:03:42.720 --> 00:03:50.080
+ Yeah. Yeah, yeah. Yeah. There you go. There. It's my five-
+
+00:03:50.080 --> 00:03:54.560
+year-old's birthday party in
+
+00:03:54.560 --> 00:04:00.030
+ the summer. And it's been far more useful as a video
+
+00:04:00.030 --> 00:04:03.680
+ background than a bunch of five-year-olds
+
+00:04:03.680 --> 00:04:04.680
+ were impressed with it.
+
+00:04:04.680 --> 00:04:08.350
+ Yeah. Sorry. I do have to... It begs a question though,
+
+00:04:08.350 --> 00:04:10.760
+ which is it's a fairly large structure
+
+00:04:10.760 --> 00:04:14.080
+ to be made by a five-year-old. Like it is several five-
+
+00:04:14.080 --> 00:04:15.240
+years-old tall.
+
+00:04:15.240 --> 00:04:19.950
+ Yeah. Well, the idea was I wanted them to be able to fit
+
+00:04:19.950 --> 00:04:23.160
+ them. But it didn't quite work.
+
+00:04:23.160 --> 00:04:25.370
+ Yeah. It definitely feels like the mouth would be able to
+
+00:04:25.370 --> 00:04:26.680
+ fit a five-year-old. Yeah. So I
+
+00:04:26.680 --> 00:04:28.730
+ think we're good. We might want to get back on track. Sorry
+
+00:04:28.730 --> 00:04:29.400
+ for getting distracted by
+
+00:04:29.400 --> 00:04:32.680
+ this menacing presence in the background.
+
+00:04:32.680 --> 00:04:36.090
+ I had not heard of org-transclusion. I should look into
+
+00:04:36.090 --> 00:04:41.400
+ this. I'm waiting for the next one
+
+00:04:41.400 --> 00:04:47.800
+ to get typed up. I'll post a couple more things that...
+
+00:04:47.800 --> 00:04:54.960
+ Here. Into the chat. So a couple...
+
+00:04:54.960 --> 00:05:00.430
+ I mentioned in the chat that first of all, that org-entry-
+
+00:05:00.430 --> 00:05:03.480
+get thing to be able to...
+
+00:05:03.480 --> 00:05:07.660
+ So you could put properties into... You could put variables
+
+00:05:07.660 --> 00:05:09.480
+ into properties on your org
+
+00:05:09.480 --> 00:05:13.200
+ outline and then have them be referenced is really, really,
+
+00:05:13.200 --> 00:05:15.600
+ really powerful. Because especially
+
+00:05:15.600 --> 00:05:19.470
+ because you can call into blocks from other parts of the
+
+00:05:19.470 --> 00:05:22.400
+ outline. You can basically...
+
+00:05:22.400 --> 00:05:25.050
+ You know how... I don't know if anyone here does React. But
+
+00:05:25.050 --> 00:05:26.360
+ there's something that's very
+
+00:05:26.360 --> 00:05:29.640
+ powerful that happens because you could do... You kind of
+
+00:05:29.640 --> 00:05:31.240
+ have dynamic scoping over the
+
+00:05:31.240 --> 00:05:35.940
+ DOM tree. And you get a similar type of power that you get
+
+00:05:35.940 --> 00:05:38.760
+ with React contexts in org mode.
+
+00:05:38.760 --> 00:05:41.540
+ Because you have variables that you could set depending on
+
+00:05:41.540 --> 00:05:42.800
+ what's the closest point
+
+00:05:42.800 --> 00:05:48.570
+ in the outline tree is. And then have defaults cascade
+
+00:05:48.570 --> 00:05:49.640
+ upwards.
+
+00:05:49.640 --> 00:05:57.160
+ Let's see. Are workflows as they are in your life closely
+
+00:05:57.160 --> 00:06:01.400
+ tied to particular projects?
+
+00:06:01.400 --> 00:06:05.600
+ Or are they general workflows? So I think there's general
+
+00:06:05.600 --> 00:06:09.040
+ ones. Like repository source
+
+00:06:09.040 --> 00:06:12.820
+ code analysis that I've gone to and used over and over
+
+00:06:12.820 --> 00:06:16.120
+ again. So I mentioned down below
+
+00:06:16.120 --> 00:06:24.200
+ Codemod and JORS. That's a pretty common trick I use to...
+
+00:06:24.200 --> 00:06:25.480
+ Like just when I sit down with
+
+00:06:25.480 --> 00:06:28.770
+ a project to analyze its history. Make a movie of how it
+
+00:06:28.770 --> 00:06:30.480
+ plays out. And a lot of that is
+
+00:06:30.480 --> 00:06:35.820
+ very... It's easiest to orchestrate in org. So here
+
+00:06:35.820 --> 00:06:39.640
+ actually I'll drop... I'll drop one
+
+00:06:39.640 --> 00:06:44.560
+ right at the top of the other cool workflows. Here's an
+
+00:06:44.560 --> 00:06:48.840
+ example of something I did... I
+
+00:06:48.840 --> 00:06:54.080
+ don't want that to... We'll figure out how to make that not
+
+00:06:54.080 --> 00:06:57.240
+ be... There we go.
+
+00:06:57.240 --> 00:07:02.870
+ So here's an example I did where it was like... I'll clean
+
+00:07:02.870 --> 00:07:05.880
+ that up a little bit. But where
+
+00:07:05.880 --> 00:07:13.400
+ you basically are using org. Within org you use Codemod.
+
+00:07:13.400 --> 00:07:14.320
+ Here's the thing. This stuff
+
+00:07:14.320 --> 00:07:18.050
+ is hard to do if you can't just write about it and say this
+
+00:07:18.050 --> 00:07:19.960
+ is what I'm trying to do.
+
+00:07:19.960 --> 00:07:23.000
+ And talk about it in prose. Because you're doing things
+
+00:07:23.000 --> 00:07:24.600
+ like analysis and you have to
+
+00:07:24.600 --> 00:07:28.990
+ have it all ready in front of mind. And if you don't have
+
+00:07:28.990 --> 00:07:31.400
+ that... And if you have...
+
+00:07:31.400 --> 00:07:33.980
+ You just have an empty document. You can type into whatever
+
+00:07:33.980 --> 00:07:35.560
+. You can type what you're trying
+
+00:07:35.560 --> 00:07:39.690
+ to do. And then figure out how to do it in terms of these
+
+00:07:39.690 --> 00:07:40.520
+ blocks.
+
+00:07:40.520 --> 00:07:43.970
+ So for example, this is pretty generic and something I end
+
+00:07:43.970 --> 00:07:45.600
+ up going to a lot. Where you
+
+00:07:45.600 --> 00:07:49.520
+ use something like Codemod to basically run analysis on
+
+00:07:49.520 --> 00:07:52.480
+ like... Well, what sort of stuff
+
+00:07:52.480 --> 00:07:55.590
+ does... Or I guess that first one's not even Codemod. That
+
+00:07:55.590 --> 00:07:58.320
+ first one's just Git log analysis.
+
+00:07:58.320 --> 00:08:02.730
+ What sort of stuff has a person done? What files have they
+
+00:08:02.730 --> 00:08:04.200
+ touched? And then like...
+
+00:08:04.200 --> 00:08:06.380
+ Okay. I don't want to see the full list of the files. I
+
+00:08:06.380 --> 00:08:07.640
+ just want to get an idea of what
+
+00:08:07.640 --> 00:08:12.750
+ areas they've worked. So really take the first few director
+
+00:08:12.750 --> 00:08:14.640
+ies of there. And just emit that
+
+00:08:14.640 --> 00:08:18.770
+ out to the screen. And now I can kind of go by each author
+
+00:08:18.770 --> 00:08:20.240
+ and figure that out. And then
+
+00:08:20.240 --> 00:08:24.220
+ the next example is me using the Codemod project to do
+
+00:08:24.220 --> 00:08:28.720
+ something like... Well, what's... Let's
+
+00:08:28.720 --> 00:08:32.070
+ look at coupling. So whenever one file within this project
+
+00:08:32.070 --> 00:08:33.200
+ changes, what other files are
+
+00:08:33.200 --> 00:08:36.090
+ likely to change? Oh, and I don't care about test files.
+
+00:08:36.090 --> 00:08:37.760
+ And I don't care about doc files.
+
+00:08:37.760 --> 00:08:40.440
+ And I don't care about package log or whatever. And then
+
+00:08:40.440 --> 00:08:42.680
+ again, you get that analysis. It's
+
+00:08:42.680 --> 00:08:43.680
+ very useful.
+
+00:08:43.680 --> 00:08:46.190
+ - Sorry, George. Interjecting real quickly to say two
+
+00:08:46.190 --> 00:08:47.880
+ things. First, we have opened the
+
+00:08:47.880 --> 00:08:51.260
+ Q&A if you want to join and ask questions to George or...
+
+00:08:51.260 --> 00:08:52.560
+ Just like I'm doing right
+
+00:08:52.560 --> 00:08:55.810
+ now. And also, George, I am a little lost. You are the
+
+00:08:55.810 --> 00:08:57.880
+ green collar on the bad, right?
+
+00:08:57.880 --> 00:09:04.240
+ - I am the what? Oh, I am now the... Yes, I am the green
+
+00:09:04.240 --> 00:09:05.480
+ collar.
+
+00:09:05.480 --> 00:09:07.200
+ - Okay. So I've lost...
+
+00:09:07.200 --> 00:09:11.000
+ - No, you're the green collar. I am now... Goodness.
+
+00:09:11.000 --> 00:09:13.770
+ - Okay. Can you tell me at which time you were? Because I
+
+00:09:13.770 --> 00:09:15.120
+ was a little lost in the bad
+
+00:09:15.120 --> 00:09:16.520
+ on what you were commenting on right now.
+
+00:09:16.520 --> 00:09:19.600
+ - Okay. Yeah, yeah, yeah. That was... I'm purple collar now
+
+00:09:19.600 --> 00:09:20.920
+. So that first block under
+
+00:09:20.920 --> 00:09:24.000
+ other cool workflows is what I just put in there.
+
+00:09:24.000 --> 00:09:26.280
+ - Okay. Cool. It is on screen now.
+
+00:09:26.280 --> 00:09:29.480
+ - Yeah, yeah, yeah. And then there's a question, possibly
+
+00:09:29.480 --> 00:09:31.320
+ weak understanding here, but why
+
+00:09:31.320 --> 00:09:36.930
+ direct use of Tangle versus Org Babel? So take something
+
+00:09:36.930 --> 00:09:40.160
+ like Arduino CLI. That is running
+
+00:09:40.160 --> 00:09:44.810
+ at the file system level. Well, okay, no. Arduino CLI works
+
+00:09:44.810 --> 00:09:46.360
+ with the file system. You're
+
+00:09:46.360 --> 00:09:51.010
+ telling it, "Here are some files. Go do some stuff with
+
+00:09:51.010 --> 00:09:55.480
+ those files." So in order to do
+
+00:09:55.480 --> 00:09:59.560
+ that at the... And you have to have a specific type of file
+
+00:09:59.560 --> 00:10:01.640
+ system. So in order to do that
+
+00:10:01.640 --> 00:10:05.280
+ directly in Org Babel, I'd have to write an Org Babel
+
+00:10:05.280 --> 00:10:07.840
+ extension, which are not super easy
+
+00:10:07.840 --> 00:10:11.450
+ to write, that kind of writes files into a temp directory
+
+00:10:11.450 --> 00:10:13.320
+ in a certain format, blah,
+
+00:10:13.320 --> 00:10:16.720
+ blah, blah, which is hard. What's a lot easier is just tell
+
+00:10:16.720 --> 00:10:18.600
+ Tangle to just dump the file
+
+00:10:18.600 --> 00:10:22.020
+ and have a file watcher running. And whenever it happens,
+
+00:10:22.020 --> 00:10:24.120
+ it just deploys to an Arduino,
+
+00:10:24.120 --> 00:10:33.630
+ for example. Yeah, so it's basically a way of integrating
+
+00:10:33.630 --> 00:10:35.120
+ with things that require the
+
+00:10:35.120 --> 00:10:36.120
+ file system.
+
+00:10:36.120 --> 00:10:41.650
+ - Sorry, George, was there a question for me? I'm not sure
+
+00:10:41.650 --> 00:10:43.160
+ I was...
+
+00:10:43.160 --> 00:10:46.240
+ - Oh, no, no, no, no, no. I think that was the answer to
+
+00:10:46.240 --> 00:10:48.120
+ the question. I'm now looking
+
+00:10:48.120 --> 00:10:49.120
+ to see if there's...
+
+00:10:49.120 --> 00:10:50.120
+ - Okay, sorry.
+
+00:10:50.120 --> 00:10:51.120
+ - Yeah, we have more questions.
+
+00:10:51.120 --> 00:10:55.050
+ - Also, George, to give you a little bit of a heads up, we
+
+00:10:55.050 --> 00:10:57.240
+ have opened the Q&A right now,
+
+00:10:57.240 --> 00:11:00.830
+ and people should be able to join. But we only have about
+
+00:11:00.830 --> 00:11:02.640
+ three more minutes until we
+
+00:11:02.640 --> 00:11:06.260
+ need to go on a little bit of a break. So feel free to
+
+00:11:06.260 --> 00:11:08.480
+ answer as many questions on the
+
+00:11:08.480 --> 00:11:11.500
+ pad as possible. I don't see anyone in the chat, on BBB
+
+00:11:11.500 --> 00:11:13.240
+ right now, so questions on the
+
+00:11:13.240 --> 00:11:14.240
+ pad.
+
+00:11:14.240 --> 00:11:20.400
+ - Yeah, so I'll just put a couple more things. I'm a big
+
+00:11:20.400 --> 00:11:24.720
+ fan of plant QML, and I will regularly
+
+00:11:24.720 --> 00:11:30.750
+ use plant QML to do both architecture diagrams and wire
+
+00:11:30.750 --> 00:11:34.800
+frames using their salt language for
+
+00:11:34.800 --> 00:11:37.850
+ mockups. So I'll write an entire technical document being
+
+00:11:37.850 --> 00:11:39.160
+ like, "Here's what we should
+
+00:11:39.160 --> 00:11:42.250
+ do," and be putting stuff directly in it. People see it,
+
+00:11:42.250 --> 00:11:45.040
+ and they're like, "Oh, mockup's
+
+00:11:45.040 --> 00:11:50.990
+ great." Not directly about... Oh, TreeSitter integration,
+
+00:11:50.990 --> 00:11:53.600
+ because you can now use TreeSitter.
+
+00:11:53.600 --> 00:11:57.110
+ So you can use TreeSitter to analyze other code files. So
+
+00:11:57.110 --> 00:11:59.080
+ for example, I recently wrote
+
+00:11:59.080 --> 00:12:03.210
+ a little TreeSitter script that would pop open a TypeScript
+
+00:12:03.210 --> 00:12:05.200
+ file, analyze all the exports,
+
+00:12:05.200 --> 00:12:08.420
+ and grab everything that's exported along with its .com and
+
+00:12:08.420 --> 00:12:10.000
+ just dump it into my document
+
+00:12:10.000 --> 00:12:14.780
+ so I can review it and update it just by with a keystroke
+
+00:12:14.780 --> 00:12:18.160
+ as that file evolves. And just
+
+00:12:18.160 --> 00:12:23.820
+ an honorable mention, I would say I recently found out Org-
+
+00:12:23.820 --> 00:12:25.720
+Rome UI. So if you're an Org-Rome
+
+00:12:25.720 --> 00:12:29.050
+ user, that's an awesome visualization where it starts a
+
+00:12:29.050 --> 00:12:30.720
+ server and shows you a little
+
+00:12:30.720 --> 00:12:35.370
+ web page with everything visualized. And just in terms of
+
+00:12:35.370 --> 00:12:38.720
+... It's nice and cool and useful,
+
+00:12:38.720 --> 00:12:42.690
+ but it's also a great politics hack where you start a new
+
+00:12:42.690 --> 00:12:44.680
+ job or a team, and then you
+
+00:12:44.680 --> 00:12:47.670
+ spend a month, a week taking your notes. So you have 80
+
+00:12:47.670 --> 00:12:49.080
+ notes or something like that,
+
+00:12:49.080 --> 00:12:50.800
+ because they're a little bit... And then at the end of the
+
+00:12:50.800 --> 00:12:51.760
+ week, you do your one-on-one
+
+00:12:51.760 --> 00:12:54.560
+ with your manager. You're like, "Here's the visualization
+
+00:12:54.560 --> 00:12:56.360
+ and everything," and your jaw
+
+00:12:56.360 --> 00:12:57.360
+ drops. Yes.
+
+00:12:57.360 --> 00:13:00.750
+ It is. It is amazing. Org-Rome UI is amazing. I'm a little
+
+00:13:00.750 --> 00:13:02.480
+ biased, so I won't talk too much
+
+00:13:02.480 --> 00:13:04.500
+ about it because people in the know will know that I've
+
+00:13:04.500 --> 00:13:06.040
+ actually helped with the development
+
+00:13:06.040 --> 00:13:08.700
+ of Org-Rome. But yes, Org-Rome UI is so great. I also
+
+00:13:08.700 --> 00:13:11.000
+ worked in a team where we were presenting
+
+00:13:11.000 --> 00:13:14.930
+ Org-Rome and Org-Rome UI to people who had no idea of what
+
+00:13:14.930 --> 00:13:16.840
+ was Emacs or Org-Mode, but
+
+00:13:16.840 --> 00:13:21.420
+ they could see atoms and they could see them being linked.
+
+00:13:21.420 --> 00:13:24.160
+ It was so amazing. It just works.
+
+00:13:24.160 --> 00:13:26.320
+ It's great when things just work.
+
+00:13:26.320 --> 00:13:27.320
+ Yeah.
+
+00:13:27.320 --> 00:13:31.120
+ All right, George. Any last thing you'd like to say to the
+
+00:13:31.120 --> 00:13:32.960
+ stream before we wrap up?
+
+00:13:32.960 --> 00:13:36.980
+ Nope. Put more workflows in the document if you have any
+
+00:13:36.980 --> 00:13:38.320
+ other ideas too.
+
+00:13:38.320 --> 00:13:41.440
+ Cool. Amazing. We'll be on the lookout for this. So George,
+
+00:13:41.440 --> 00:13:42.440
+ thank you so much for your
+
+00:13:42.440 --> 00:13:45.640
+ presentation and for your questions, and we will see you
+
+00:13:45.640 --> 00:13:46.760
+ later probably.
+
+00:13:46.760 --> 00:13:47.760
+ Thank you. Bye-bye.
+
+00:13:47.760 --> 00:13:48.760
+ Bye-bye.
+
+00:13:48.760 --> 00:13:58.820
+ I'm still there. See you in a bit, folks. Oh, sorry. Sorry.
+
+00:13:58.820 --> 00:14:00.920
+ I'm panicking. Give me
+
+00:14:00.920 --> 00:14:08.300
+ a second. Sure. You saw me whisper right now. We will be
+
+00:14:08.300 --> 00:14:09.640
+ going on a little bit of a break
+
+00:14:09.640 --> 00:14:14.960
+ right now. The next talk will be due in about 10 minutes.
+
+00:14:14.960 --> 00:14:18.200
+ So at 35 of the current hour,
+
+00:14:18.200 --> 00:14:21.450
+ we will be reconvening on Gen for the next talk. So see you
+
+00:14:21.450 --> 00:14:23.560
+ in a bit and enjoy the break.
+
+00:14:23.560 --> 00:14:29.160
+ You are currently the only person in this conference.
+
+00:14:29.160 --> 00:14:41.310
+ Give me just a second. I'll put some music for the break.
+
+00:14:41.310 --> 00:14:45.240
+ Right now I'm doing too many
+
+00:14:45.240 --> 00:14:47.140
+ things at the same time. So we will have to wait a little
+
+00:14:47.140 --> 00:14:48.280
+ bit for everything to work.
+
+00:14:48.280 --> 00:14:50.340
+ I'll put the music on first so that you have something nice
+
+00:14:50.340 --> 00:14:51.560
+ to listen to, which is Shoshin
+
+00:14:51.560 --> 00:15:04.440
+ Music the Lloyd.
+
+00:15:04.440 --> 00:15:20.440
+ (Music)
+
+00:15:20.440 --> 00:15:40.440
+ (Music)
+
+00:15:40.440 --> 00:16:00.440
+ (Music)
+
+00:16:00.440 --> 00:16:20.440
+ (Music)
+
+00:16:20.440 --> 00:16:40.440
+ (Music)
+
+00:16:40.440 --> 00:17:00.440
+ (Music)
+
+00:17:00.440 --> 00:17:20.440
+ (Music)
+
+00:17:20.440 --> 00:17:40.440
+ (Music)
+
+00:17:40.440 --> 00:17:54.440
+ (Music)
+
diff --git a/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main--chapters.vtt b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main--chapters.vtt
new file mode 100644
index 00000000..d3302b79
--- /dev/null
+++ b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main--chapters.vtt
@@ -0,0 +1,77 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:00:53.960
+Introduction
+
+21
+00:00:53.960 --> 00:02:30.200
+The future
+
+60
+00:02:30.200 --> 00:03:15.680
+Org development workflows
+
+78
+00:03:15.680 --> 00:04:54.600
+Taking notes
+
+109
+00:04:54.600 --> 00:06:10.680
+org-capture templates
+
+132
+00:06:10.680 --> 00:06:49.160
+Building up a dashboard
+
+146
+00:06:49.160 --> 00:07:45.680
+org-store-links
+
+164
+00:07:45.680 --> 00:08:21.480
+Formatting
+
+174
+00:08:21.480 --> 00:08:52.200
+Pasting code
+
+184
+00:08:52.200 --> 00:10:04.960
+Git
+
+202
+00:10:04.960 --> 00:11:29.040
+async-shell-command
+
+226
+00:11:29.040 --> 00:13:47.840
+Literate programming and tangling
+
+272
+00:13:47.840 --> 00:14:36.400
+Noweb
+
+290
+00:14:36.400 --> 00:16:04.480
+Running commands
+
+316
+00:16:04.480 --> 00:16:43.600
+Buttons
+
+327
+00:16:43.600 --> 00:18:04.800
+Workspaces
+
+353
+00:18:04.800 --> 00:18:36.000
+dash
+
+366
+00:18:36.000 --> 00:19:29.920
+Header arguments
+
+386
+00:19:29.920 --> 00:20:26.920
+Conclusion
diff --git a/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.vtt b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.vtt
new file mode 100644
index 00000000..58d88b2f
--- /dev/null
+++ b/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.vtt
@@ -0,0 +1,1309 @@
+WEBVTT captioned by bhavin192
+
+00:00:00.000 --> 00:00:04.600
+Hello. Welcome to my first ever EmacsConf talk.
+
+00:00:04.600 --> 00:00:06.360
+This is really exciting for me.
+
+00:00:06.360 --> 00:00:08.600
+I've done lots of conferences,
+
+00:00:08.600 --> 00:00:12.800
+but rarely ones this technical and this nerdy.
+
+00:00:12.800 --> 00:00:13.508
+I also feel like
+
+00:00:13.508 --> 00:00:15.040
+I have something interesting to share.
+
+00:00:15.040 --> 00:00:18.680
+I come to Emacs relatively late in my career,
+
+00:00:18.680 --> 00:00:20.920
+only about six years ago,
+
+00:00:20.920 --> 00:00:22.880
+but I've been absolutely amazed
+
+00:00:22.880 --> 00:00:25.800
+at the innovation and commitment of the community
+
+00:00:25.800 --> 00:00:28.200
+to do things their own way.
+
+00:00:28.200 --> 00:00:30.120
+Oftentimes, these become things
+
+00:00:30.120 --> 00:00:33.880
+that are not readily available anywhere else.
+
+00:00:33.880 --> 00:00:35.307
+So, as I've been using Emacs
+
+00:00:35.307 --> 00:00:37.160
+(and Org mode specifically)
+
+00:00:37.160 --> 00:00:39.600
+a great deal in my day-to-day workflows,
+
+00:00:39.600 --> 00:00:41.520
+I've been leaning more and more into
+
+00:00:41.520 --> 00:00:43.607
+some of these tips and tricks.
+
+00:00:43.607 --> 00:00:46.680
+I find that there is almost every day
+
+00:00:46.680 --> 00:00:48.120
+that I discover some useful tweak
+
+00:00:48.120 --> 00:00:50.760
+that can make my development better.
+
+00:00:50.760 --> 00:00:53.960
+I want to share them with you now.
+
+00:00:53.960 --> 00:00:54.874
+[Future George]: Hey, hold on!
+
+00:00:54.874 --> 00:00:56.200
+Who are you?
+
+00:00:56.200 --> 00:01:00.400
+[Future George]: I'm you from the future!
+
+00:01:00.400 --> 00:01:02.480
+Oh, nice. How good.
+
+00:01:02.480 --> 00:01:05.240
+No, I'm you from, like, a month from now.
+
+00:01:05.240 --> 00:01:08.440
+Look, you know how these talks are pre-recorded,
+
+00:01:08.440 --> 00:01:10.760
+and you know how you've spent the last two years
+
+00:01:10.760 --> 00:01:12.400
+criticizing conference speakers
+
+00:01:12.400 --> 00:01:14.000
+for trying to do the same old thing
+
+00:01:14.000 --> 00:01:15.120
+and not creatively adapting
+
+00:01:15.120 --> 00:01:17.440
+to the online conference medium?
+
+00:01:17.440 --> 00:01:20.520
+Well, you are recording this back in November.
+
+00:01:20.520 --> 00:01:23.160
+I'm in December when everyone is watching this
+
+00:01:23.160 --> 00:01:24.720
+for the first time.
+
+00:01:24.720 --> 00:01:27.120
+That is something we can do now.
+
+00:01:27.120 --> 00:01:29.640
+[George]: Okay, so this is a gimmick.
+
+00:01:29.640 --> 00:01:32.880
+Cool! And I see you still haven't figured out
+
+00:01:32.880 --> 00:01:35.440
+how to remove backgrounds with OBS.
+
+00:01:35.440 --> 00:01:37.240
+[Future George]: Oh my god! It's such a pain,
+
+00:01:37.240 --> 00:01:40.360
+I have to get a plugin or something.
+
+00:01:40.360 --> 00:01:42.760
+So, yes, it's kind of a gimmick,
+
+00:01:42.760 --> 00:01:44.920
+but I also have a cool point.
+
+00:01:44.920 --> 00:01:46.200
+You know, how you just said
+
+00:01:46.200 --> 00:01:48.840
+that you discover something new every day?
+
+00:01:48.840 --> 00:01:49.920
+Well, your talk isn't that long,
+
+00:01:49.920 --> 00:01:52.720
+and I found a bunch of cool new workflow synths.
+
+00:01:52.720 --> 00:01:55.920
+[George]: Oh, okay, that makes sense.
+
+00:01:55.920 --> 00:01:58.360
+I'm starting a new job in the intervening time.
+
+00:01:58.360 --> 00:01:59.720
+[Future George]: Exactly!
+
+00:01:59.720 --> 00:02:02.440
+So, I have more stuff I want to add.
+
+00:02:02.440 --> 00:02:03.740
+[George]: Oh, and I bet that
+
+00:02:03.740 --> 00:02:05.960
+once we set the ground rules,
+
+00:02:05.960 --> 00:02:07.136
+the audience might have
+
+00:02:07.136 --> 00:02:08.960
+some of their own suggestions.
+
+00:02:08.960 --> 00:02:11.160
+That is a good idea.
+
+00:02:11.160 --> 00:02:11.960
+Okay, go away now.
+
+00:02:11.960 --> 00:02:13.574
+[Future George]: Fine, but
+
+00:02:13.574 --> 00:02:15.240
+aren't you gonna explain the dino?
+
+00:02:15.240 --> 00:02:18.800
+[George]: This is EmacsConf, dude.
+
+00:02:18.800 --> 00:02:20.320
+You think a dinosaur built out of
+
+00:02:20.320 --> 00:02:22.160
+boxes and old dishwasher parts
+
+00:02:22.160 --> 00:02:24.207
+is the weirdest background thing we'll see?
+
+00:02:24.207 --> 00:02:27.880
+[Both making dinosaur roaring sound: ROAAAAR!]
+
+00:02:27.880 --> 00:02:30.200
+Okay, bye now.
+
+00:02:30.200 --> 00:02:33.160
+Hey everyone, you heard the idea.
+
+00:02:33.160 --> 00:02:35.000
+This is going to be a thinly-veiled attempt
+
+00:02:35.000 --> 00:02:36.940
+to show you stuff about
+
+00:02:36.940 --> 00:02:38.760
+Emacs and Org mode, specifically,
+
+00:02:38.760 --> 00:02:41.560
+that I think is super cool and immediately useful
+
+00:02:41.560 --> 00:02:43.600
+while you're doing development.
+
+00:02:43.600 --> 00:02:46.720
+Let's define the scope of Org development workflow
+
+00:02:46.720 --> 00:02:49.000
+as something specific you do with Org mode
+
+00:02:49.000 --> 00:02:50.800
+that helps in certain common
+
+00:02:50.800 --> 00:02:52.880
+development related activities.
+
+00:02:52.880 --> 00:02:54.560
+Now, tie-dye me from the future said
+
+00:02:54.560 --> 00:02:56.960
+he's got some more ideas
+
+00:02:56.960 --> 00:02:58.840
+beyond what I'm presenting here.
+
+00:02:58.840 --> 00:03:01.960
+I'm sure many of you have ideas as well.
+
+00:03:01.960 --> 00:03:07.960
+So, we're going to share a collaborative document,
+
+00:03:07.960 --> 00:03:10.120
+and let's all as we're listening to this
+
+00:03:10.120 --> 00:03:11.440
+be talking, and chatting, and entering
+
+00:03:11.440 --> 00:03:13.240
+our own ideas and workflows,
+
+00:03:13.240 --> 00:03:15.680
+so that we can learn and improve together.
+
+00:03:15.680 --> 00:03:17.960
+And now with that, let's begin.
+
+00:03:17.960 --> 00:03:20.280
+I've got a ton of ground to cover,
+
+00:03:20.280 --> 00:03:23.480
+and I want to start by talking about note-taking.
+
+00:03:23.480 --> 00:03:25.720
+Shrink down! [transition]
+
+00:03:25.720 --> 00:03:30.074
+Note-taking is incredibly important.
+
+00:03:30.074 --> 00:03:33.600
+We can't keep all this stuff in our heads.
+
+00:03:33.600 --> 00:03:36.640
+So, for example, I find myself with
+
+00:03:36.640 --> 00:03:41.760
+the need to learn about the solid project.
+
+00:03:41.760 --> 00:03:44.520
+This right here is the solid project,
+
+00:03:44.520 --> 00:03:47.320
+and I want to play around with it.
+
+00:03:47.320 --> 00:03:50.920
+I am going to start by creating a note for it.
+
+00:03:50.920 --> 00:03:53.360
+Now, one of the things that I want to do
+
+00:03:53.360 --> 00:03:57.240
+is explore one of their tutorials.
+
+00:03:57.240 --> 00:03:58.960
+That's the site I just saw.
+
+00:03:58.960 --> 00:04:03.720
+I can go ahead and create a note for myself.
+
+00:04:03.720 --> 00:04:10.280
+Right, "Solid React Example",
+
+00:04:10.280 --> 00:04:12.120
+and maybe a set of stuff ending on there.
+
+00:04:12.120 --> 00:04:14.240
+I'm going to clone this project,
+
+00:04:14.240 --> 00:04:15.720
+which I've already done,
+
+00:04:15.720 --> 00:04:18.360
+and I can pull it up right here.
+
+00:04:18.360 --> 00:04:22.280
+So, I can pull it up right here,
+
+00:04:22.280 --> 00:04:24.440
+and I can now start to explore it.
+
+00:04:24.440 --> 00:04:26.440
+So, for example, this code base sounds…,
+
+00:04:26.440 --> 00:04:27.080
+it seems interesting.
+
+00:04:27.080 --> 00:04:28.996
+I'm going to want to
+
+00:04:28.996 --> 00:04:31.520
+store a link to this in my code.
+
+00:04:31.520 --> 00:04:34.840
+I'm going to run `org-store-link`,
+
+00:04:34.840 --> 00:04:37.960
+and I can come in here and say,
+
+00:04:37.960 --> 00:04:48.280
+let's explore structure. Local link,
+
+00:04:48.280 --> 00:04:50.640
+and here I'm going to put that right there.
+
+00:04:50.640 --> 00:04:52.960
+Now, at any given time I can come into this note
+
+00:04:52.960 --> 00:04:54.600
+and be thrown right into the structure.
+
+00:04:54.600 --> 00:04:58.880
+I want to go and now start investigating the code,
+
+00:04:58.880 --> 00:05:02.474
+but before doing that
+
+00:05:02.474 --> 00:05:08.280
+I'm going to take an extra step
+
+00:05:08.280 --> 00:05:13.560
+and customize the Org capture system.
+
+00:05:13.560 --> 00:05:16.297
+I'm going to create a playground node here,
+
+00:05:16.297 --> 00:05:17.320
+where I can do whatever.
+
+00:05:17.320 --> 00:05:20.680
+Now, what does this template do?
+
+00:05:20.680 --> 00:05:22.960
+Well, it's just going to create a new template.
+
+00:05:22.960 --> 00:05:24.640
+And whenever I hit the s key,
+
+00:05:24.640 --> 00:05:31.680
+it is going to go ahead and add a new heading
+
+00:05:31.680 --> 00:05:36.280
+to which I will enter,
+
+00:05:36.280 --> 00:05:38.326
+and it's going to grab a link
+
+00:05:38.326 --> 00:05:39.720
+to wherever I'm pointing at,
+
+00:05:39.720 --> 00:05:41.760
+and any highlighted code
+
+00:05:41.760 --> 00:05:44.560
+will also be inserted into a source block,
+
+00:05:44.560 --> 00:05:49.407
+and eventually, drop my cursor
+
+00:05:49.407 --> 00:05:52.107
+where I can work on it.
+
+00:05:52.107 --> 00:05:55.000
+So, we can grab our template,
+
+00:05:55.000 --> 00:05:57.400
+and the one thing I'm going to need to add it here
+
+00:05:57.400 --> 00:05:59.360
+is to say what file this goes to.
+
+00:05:59.360 --> 00:06:03.760
+I'm going to copy the name of this file,
+
+00:06:03.760 --> 00:06:08.040
+and put it right in there.
+
+00:06:08.040 --> 00:06:10.680
+I'm going to go ahead now run this template.
+
+00:06:10.680 --> 00:06:14.400
+Now, we can explore our code.
+
+00:06:14.400 --> 00:06:16.440
+For example, I can look in the server,
+
+00:06:16.440 --> 00:06:18.400
+and say, "Oh yeah, this slide looks interesting.
+
+00:06:18.400 --> 00:06:21.040
+Go ahead and capture that."
+
+00:06:21.040 --> 00:06:23.800
+There you see our template.
+
+00:06:23.800 --> 00:06:26.000
+You see, yeah, this is Next.js app,
+
+00:06:26.000 --> 00:06:29.320
+and you can see it got added right in here
+
+00:06:29.320 --> 00:06:33.080
+right next to my other code.
+
+00:06:33.080 --> 00:06:34.640
+So, that's interesting.
+
+00:06:34.640 --> 00:06:36.920
+I can always go ahead and click that link,
+
+00:06:36.920 --> 00:06:40.560
+and get thrown directly to where in the code I was.
+
+00:06:40.560 --> 00:06:43.240
+I'm kind of building up my own dashboard
+
+00:06:43.240 --> 00:06:45.040
+as I explore this project
+
+00:06:45.040 --> 00:06:49.160
+of interesting points within the project.
+
+00:06:49.160 --> 00:06:52.440
+One of the things I noticed here
+
+00:06:52.440 --> 00:06:57.440
+by looking at the file structure is that
+
+00:06:57.440 --> 00:07:02.040
+there is an area for certificates.
+
+00:07:02.040 --> 00:07:05.625
+That's a little unusual, so we'll make a note
+
+00:07:05.625 --> 00:07:08.007
+of that by again running `org-store-link`.
+
+00:07:08.007 --> 00:07:12.707
+This comes with certificates,
+
+00:07:12.707 --> 00:07:18.007
+so we'll put that there.
+
+00:07:18.007 --> 00:07:21.607
+One of the good standbys is,
+
+00:07:21.607 --> 00:07:23.540
+just to use our regular shell commands.
+
+00:07:23.540 --> 00:07:26.774
+So, we will go ahead and say,
+
+00:07:26.774 --> 00:07:29.807
+the default directory for this is our project.
+
+00:07:29.807 --> 00:07:31.640
+And we can go ahead and say,
+
+00:07:31.640 --> 00:07:38.520
+`cat certificates/localhost.key`,
+
+00:07:38.520 --> 00:07:43.760
+and then we'll output the first five lines of it,
+
+00:07:43.760 --> 00:07:45.848
+just to make sure it's a regular certificate.
+
+00:07:45.848 --> 00:07:49.360
+Now, notice this got broken up a little bit.
+
+00:07:49.360 --> 00:07:51.720
+This is due to Emacs auto formatting.
+
+00:07:51.720 --> 00:07:55.866
+We can come in here, and tell it to
+
+00:07:55.866 --> 00:07:57.400
+format it as code,
+
+00:07:57.400 --> 00:07:59.880
+which will be the same as this block right here.
+
+00:07:59.880 --> 00:08:02.320
+Now, there are other options available.
+
+00:08:02.320 --> 00:08:05.453
+If, for example, we don't want [it]
+
+00:08:05.453 --> 00:08:06.480
+to be a shell block,
+
+00:08:06.480 --> 00:08:09.560
+we wanted a Python block for some reason,
+
+00:08:09.560 --> 00:08:15.320
+we do `:wrap src python`, and execute that,
+
+00:08:15.320 --> 00:08:18.440
+and it's now wrapped as a Python block,
+
+00:08:18.440 --> 00:08:21.480
+but I like it as a shell.
+
+00:08:21.480 --> 00:08:24.240
+Let's, for example, go down into pages here
+
+00:08:24.240 --> 00:08:25.800
+and look at this document file.
+
+00:08:25.800 --> 00:08:29.160
+We're saying, "Okay. Well, this looks interesting
+
+00:08:29.160 --> 00:08:32.474
+maybe highlight that," and we'll go ahead
+
+00:08:32.474 --> 00:08:36.240
+and capture that template
+
+00:08:36.240 --> 00:08:39.400
+and say, grab all this code and paste it in here.
+
+00:08:39.400 --> 00:08:42.440
+Now, there is a bug at the moment,
+
+00:08:42.440 --> 00:08:46.280
+where if you highlight more than one lines of code,
+
+00:08:46.280 --> 00:08:50.760
+the link will not work, and that honestly
+
+00:08:50.760 --> 00:08:54.540
+might be something I look into fixing.
+
+00:08:54.540 --> 00:08:57.507
+One of the things that might be useful here
+
+00:08:57.507 --> 00:08:59.274
+would be to check out
+
+00:08:59.274 --> 00:09:02.107
+how this file has evolved over time.
+
+00:09:02.107 --> 00:09:05.340
+To do that, I'm going to use Magit.
+
+00:09:05.340 --> 00:09:09.640
+I'll pull up a log.
+
+00:09:09.640 --> 00:09:11.400
+Look, there's only a single change.
+
+00:09:11.400 --> 00:09:13.040
+I'm going to run a command
+
+00:09:13.040 --> 00:09:16.840
+called `orgit-store-link`,
+
+00:09:16.840 --> 00:09:22.174
+and now I can come in here and say,
+
+00:09:22.174 --> 00:09:26.207
+"It's only changed once."
+
+00:09:26.207 --> 00:09:30.274
+Go ahead and insert that link.
+
+00:09:30.507 --> 00:09:33.340
+Now, this file…
+
+00:09:33.340 --> 00:09:32.960
+the arguments here are kind of weird,
+
+00:09:35.800 --> 00:09:38.520
+and in fact, if I click this,
+
+00:09:38.520 --> 00:09:42.040
+it will actually go to the full log of that branch.
+
+00:09:42.040 --> 00:09:45.760
+However, we can fix that pretty easily.
+
+00:09:45.760 --> 00:09:49.120
+Grab the path of our file,
+
+00:09:49.120 --> 00:09:53.874
+and this right here is really just the arguments
+
+00:09:53.874 --> 00:09:56.280
+that are passed into the log command.
+
+00:09:56.280 --> 00:09:58.880
+So, here we go, we put that in there,
+
+00:09:58.880 --> 00:10:04.960
+and there we go. We get the full file history.
+
+00:10:04.960 --> 00:10:09.280
+Now, I want to actually build the program.
+
+00:10:09.280 --> 00:10:16.520
+So, "Build the app."
+
+00:10:16.520 --> 00:10:18.800
+Now, I could of course run it as a shell, right.
+
+00:10:18.800 --> 00:10:22.560
+`npm ci`. The problem with that is that
+
+00:10:22.560 --> 00:10:26.400
+Emacs is single-threaded. So, if I were to do that,
+
+00:10:26.400 --> 00:10:30.400
+the entire time while it was running,
+
+00:10:30.400 --> 00:10:33.120
+it would be locking out my Emacs.
+
+00:10:33.120 --> 00:10:35.740
+Additionally, I might not actually want
+
+00:10:35.740 --> 00:10:38.707
+all that scroll--`npm ci` produces a lot of it--
+
+00:10:38.707 --> 00:10:40.080
+actually in my document.
+
+00:10:40.080 --> 00:10:43.840
+So instead, what we could do is
+
+00:10:43.840 --> 00:10:46.800
+use an Emacs Lisp function,
+
+00:10:46.800 --> 00:10:49.640
+and it's called `async-shell-command`.
+
+00:10:49.640 --> 00:10:52.880
+And when you run something in async-shell-command,
+
+00:10:52.880 --> 00:10:58.007
+it's going to a comint buffer with a process
+
+00:10:58.007 --> 00:11:00.107
+attached to it, and run it in there.
+
+00:11:00.107 --> 00:11:04.907
+I will need to set the directory here first,
+
+00:11:04.907 --> 00:11:07.560
+and since, again, this is going to be
+
+00:11:07.560 --> 00:11:08.960
+opening up in a new buffer.
+
+00:11:08.960 --> 00:11:09.960
+I don't need to see that.
+
+00:11:09.960 --> 00:11:11.407
+I'm going to run it.
+
+00:11:11.407 --> 00:11:13.680
+And what's going to happen is
+
+00:11:13.680 --> 00:11:17.120
+this is actually not going to work.
+
+00:11:17.120 --> 00:11:18.160
+And it doesn't work,
+
+00:11:18.160 --> 00:11:20.320
+Not for any particular reason I can control.
+
+00:11:20.320 --> 00:11:24.880
+It's unfortunately that the repo is broken,
+
+00:11:24.880 --> 00:11:26.307
+but that is a totally valid
+
+00:11:26.307 --> 00:11:29.040
+result of our investigation.
+
+00:11:29.040 --> 00:11:33.107
+One of the things that I really love
+
+00:11:33.107 --> 00:11:37.640
+to do with Org mode is to actually use it for
+
+00:11:37.640 --> 00:11:38.240
+literate programming,
+
+00:11:38.240 --> 00:11:43.080
+because Org mode has a pretty capable
+
+00:11:43.080 --> 00:11:46.000
+code generation facility built into it.
+
+00:11:46.000 --> 00:11:47.440
+It's called tangling.
+
+00:11:47.440 --> 00:11:51.720
+So, if I go ahead and take my document...
+
+00:11:51.720 --> 00:11:54.107
+This is for a little Arduino project,
+
+00:11:54.107 --> 00:11:56.907
+where I was figuring out to spin things around
+
+00:11:56.907 --> 00:12:00.074
+using an old Roomba motor.
+
+00:12:00.074 --> 00:12:05.280
+I can go ahead and write a script like this,
+
+00:12:05.280 --> 00:12:09.400
+and then notice, I use the tangle variable
+
+00:12:09.400 --> 00:12:11.520
+that is just going to determine
+
+00:12:11.520 --> 00:12:13.560
+where that file gets written
+
+00:12:13.560 --> 00:12:17.680
+when we call the command `org-babel-tangle`.
+
+00:12:17.680 --> 00:12:20.080
+So, if I go ahead and run this,
+
+00:12:20.080 --> 00:12:21.800
+you can see down in the minibuffer,
+
+00:12:21.800 --> 00:12:23.040
+it's going to write to
+
+00:12:23.040 --> 00:12:26.707
+`/tmp/go-batsy-playground/go-batsy-playground.ino`.
+
+00:12:26.707 --> 00:12:27.840
+That's where this right here would write,
+
+00:12:29.240 --> 00:12:33.480
+and then I could run commands on it.
+
+00:12:33.480 --> 00:12:36.574
+Then I want to start being able to use this
+
+00:12:36.574 --> 00:12:38.600
+to build out a program.
+
+00:12:38.600 --> 00:12:42.000
+I'm going ahead and writing in prose
+
+00:12:42.000 --> 00:12:43.440
+and interspersing it with code.
+
+00:12:43.440 --> 00:12:47.160
+So, it's the inverse of code,
+
+00:12:47.160 --> 00:12:49.374
+in which you intersperse comments, [here]
+
+00:12:49.374 --> 00:12:51.640
+you write prose, and then you intersperse code
+
+00:12:51.640 --> 00:12:54.920
+where as needed.
+
+00:12:54.920 --> 00:12:58.120
+Tangle is implicitly defined up at the higher level
+
+00:12:58.120 --> 00:12:59.640
+in this property block right here,
+
+00:12:59.640 --> 00:13:02.600
+which I will talk about in a little bit.
+
+00:13:02.600 --> 00:13:04.720
+But if you want to see what properties
+
+00:13:04.720 --> 00:13:07.400
+are available at any given time,
+
+00:13:07.400 --> 00:13:10.140
+you can hit `org-babel-view-src-block-info`
+
+00:13:10.140 --> 00:13:14.274
+right there, and you can see that tangle is enabled.
+
+00:13:14.274 --> 00:13:16.440
+All of these blocks have the exact same tangle.
+
+00:13:16.440 --> 00:13:20.800
+If I run and see what it is, it's just going to
+
+00:13:20.800 --> 00:13:23.680
+write to this directory to `go-batsy.ino`.
+
+00:13:23.680 --> 00:13:28.920
+`org-babel-tangle` is going to go ahead
+
+00:13:28.920 --> 00:13:30.640
+and tangle all these source code blocks,
+
+00:13:30.640 --> 00:13:33.174
+and I can go ahead and look at my file
+
+00:13:33.174 --> 00:13:34.440
+and here it is.
+
+00:13:34.440 --> 00:13:36.240
+This is the full Arduino file
+
+00:13:36.240 --> 00:13:37.360
+that was generated from there.
+
+00:13:37.360 --> 00:13:40.807
+I start writing code here,
+
+00:13:40.807 --> 00:13:43.320
+and I'm basically doing it in a prose way.
+
+00:13:43.320 --> 00:13:44.640
+As I'm thinking about it,
+
+00:13:44.640 --> 00:13:46.080
+I write down what I'm going to do.
+
+00:13:46.080 --> 00:13:49.240
+Now these braces, we haven't seen these before.
+
+00:13:49.240 --> 00:13:50.440
+This is an aspect of Org called `noweb`,
+
+00:13:52.680 --> 00:13:55.374
+which again is not too much of a
+
+00:13:55.374 --> 00:13:56.400
+templating system too.
+
+00:13:56.400 --> 00:13:58.960
+But it does one thing, which is insert code,
+
+00:13:58.960 --> 00:14:00.200
+which turns out to be enough.
+
+00:14:00.200 --> 00:14:03.640
+So, this right here basically says,
+
+00:14:03.640 --> 00:14:08.507
+take that block with that exact name
+
+00:14:08.507 --> 00:14:09.960
+and just insert here.
+
+00:14:09.960 --> 00:14:13.760
+If you want to see exactly what a block expands to,
+
+00:14:13.760 --> 00:14:15.160
+you're going to come in here.
+
+00:14:15.160 --> 00:14:18.320
+You're going to run `org-babel-expand-src-block`,
+
+00:14:18.320 --> 00:14:21.000
+and there we go. That's what this block expands to.
+
+00:14:21.000 --> 00:14:22.080
+That's what all those places
+
+00:14:22.080 --> 00:14:24.807
+of this little bits and pieces expand to.
+
+00:14:24.807 --> 00:14:26.120
+So, that becomes really useful, and notice
+
+00:14:28.120 --> 00:14:29.960
+basically we just take these little blocks
+
+00:14:29.960 --> 00:14:32.520
+that are not going to be tangled directly
+
+00:14:32.520 --> 00:14:33.920
+but it will be in this other block.
+
+00:14:33.920 --> 00:14:38.074
+And we turn off their tangling.
+
+00:14:38.074 --> 00:14:40.680
+Now that you have some sort of tangling,
+
+00:14:40.680 --> 00:14:42.880
+you want to be able to interact with those files
+
+00:14:42.880 --> 00:14:46.707
+that are written to that directory.
+
+00:14:46.707 --> 00:14:48.960
+So, right here I have an area
+
+00:14:48.960 --> 00:14:52.760
+where I can do things like run a compiler.
+
+00:14:52.760 --> 00:14:55.160
+Now what does that compiler do?
+
+00:14:55.160 --> 00:14:57.840
+Well, this right here references
+
+00:14:57.841 --> 00:15:01.874
+a source code block that appears in another Org file.
+
+00:15:01.874 --> 00:15:04.520
+And I find that when doing these sort of things
+
+00:15:04.520 --> 00:15:06.007
+it can be useful to have a little
+
+00:15:06.007 --> 00:15:08.000
+utility Org directory.
+
+00:15:08.000 --> 00:15:10.374
+So, here it is, `org/ci.org`.
+
+00:15:10.374 --> 00:15:11.640
+This is just part of my repo.
+
+00:15:11.640 --> 00:15:14.140
+We open up, and here we go.
+
+00:15:14.140 --> 00:15:15.200
+I have a compile function.
+
+00:15:15.200 --> 00:15:18.360
+Basically, it's doing some stuff
+
+00:15:18.360 --> 00:15:20.480
+to clean up things correctly.
+
+00:15:20.480 --> 00:15:23.520
+But then using that same `async-shell-command`
+
+00:15:23.520 --> 00:15:26.280
+to open things up and a new buffer.
+
+00:15:26.280 --> 00:15:28.674
+In this case, named after
+
+00:15:28.674 --> 00:15:31.200
+whatever heading it was under.
+
+00:15:31.200 --> 00:15:35.160
+And then we're going to go ahead and inside of it
+
+00:15:35.160 --> 00:15:39.874
+run Arduino CLI command to compile,
+
+00:15:39.874 --> 00:15:43.560
+and pass that into `watchexec`.
+
+00:15:43.560 --> 00:15:46.120
+which is a little Rust program
+
+00:15:46.120 --> 00:15:49.520
+that watches inode[??] files for any changes,
+
+00:15:49.520 --> 00:15:51.240
+and when they detect them, we will run this.
+
+00:15:51.240 --> 00:15:56.160
+If I were to, for example, add a line here,
+
+00:15:56.160 --> 00:15:59.360
+and now run `org-babel-tangle`,
+
+00:15:59.360 --> 00:16:02.400
+you can see watchexec immediately
+
+00:16:02.400 --> 00:16:04.480
+picks it up and restarts it.
+
+00:16:04.480 --> 00:16:07.474
+Now it's kind of a pain to remember
+
+00:16:07.475 --> 00:16:09.680
+to run `org-babel-tangle` all the time.
+
+00:16:09.680 --> 00:16:13.807
+So, I can come here and click this button.
+
+00:16:13.807 --> 00:16:17.040
+It asks me to execute it there.
+
+00:16:17.040 --> 00:16:18.280
+And what does that do?
+
+00:16:18.280 --> 00:16:23.280
+Here you go. It's just a very simple hyperlink,
+
+00:16:23.280 --> 00:16:25.600
+but to the Elisp protocol.
+
+00:16:25.600 --> 00:16:30.600
+The Elisp protocol just adds a hook that says,
+
+00:16:30.600 --> 00:16:35.107
+whenever a document is saved, run `org-babel-tangle`.
+
+00:16:35.107 --> 00:16:37.600
+And now that I've run that, I can go ahead,
+
+00:16:37.600 --> 00:16:39.307
+come in here, and delete that.
+
+00:16:39.307 --> 00:16:42.340
+And look at that. It tangles automatically for me.
+
+00:16:42.340 --> 00:16:45.040
+Because I don't want to actually have this
+
+00:16:45.040 --> 00:16:49.480
+playground script tangle to my real file,
+
+00:16:49.480 --> 00:16:51.440
+I need this concept of
+
+00:16:51.440 --> 00:16:52.760
+some sort of workspace directory.
+
+00:16:52.760 --> 00:16:54.880
+And a workspace directory
+
+00:16:54.880 --> 00:16:58.280
+what I really want is a variable that is tied to
+
+00:16:58.280 --> 00:17:02.674
+where in my document hierarchy this appears.
+
+00:17:02.674 --> 00:17:06.680
+I want a dynamically scoped variable
+
+00:17:06.680 --> 00:17:08.240
+that's scoped to my document.
+
+00:17:08.240 --> 00:17:12.560
+And you can do that. For example, in this case,
+
+00:17:12.560 --> 00:17:15.280
+I have in my properties
+
+00:17:15.280 --> 00:17:20.080
+a key value declared `workspace-directory`,
+
+00:17:20.080 --> 00:17:22.080
+[it] goes into a temp directory.
+
+00:17:22.080 --> 00:17:24.480
+And here, by running `org-get-entry`
+
+00:17:24.480 --> 00:17:25.800
+starting at the current point,
+
+00:17:25.800 --> 00:17:27.507
+find `workspace-directory`
+
+00:17:27.507 --> 00:17:28.760
+with a second parameter 1.
+
+00:17:28.760 --> 00:17:31.520
+You can see down in the minibuffer,
+
+00:17:31.520 --> 00:17:37.174
+goes to `/tmp/go-batsy-playground/`.
+
+00:17:37.174 --> 00:17:39.720
+This right here is going to override
+
+00:17:42.040 --> 00:17:44.307
+the `workspace-directory` at the top level,
+
+00:17:44.307 --> 00:17:47.607
+which is dot. Dot means here.
+
+00:17:47.607 --> 00:17:48.880
+That's what makes sure
+
+00:17:48.880 --> 00:17:50.680
+that the rest of these tangle to
+
+00:17:50.680 --> 00:17:54.560
+that go-batsy file right relevant to here.
+
+00:17:54.560 --> 00:17:55.740
+And that does mean that we need
+
+00:17:55.740 --> 00:17:58.207
+a little bit more complex thing here.
+
+00:17:58.207 --> 00:18:01.760
+So, we're saying go ahead and `org-entry-get`
+
+00:18:01.760 --> 00:18:04.800
+the `workspace-directory`.
+
+00:18:04.800 --> 00:18:06.807
+If anyone hasn't seen this syntax,
+
+00:18:06.807 --> 00:18:16.040
+this dash arrow is from the dash.el library,
+
+00:18:16.040 --> 00:18:19.240
+which is basically a big library of all
+
+00:18:19.240 --> 00:18:20.940
+the utility functions that you wish
+
+00:18:20.940 --> 00:18:22.880
+Emacs Lisp had. They're well-named.
+
+00:18:22.880 --> 00:18:24.480
+I highly, highly recommend it.
+
+00:18:24.480 --> 00:18:26.080
+This is the threading operator.
+
+00:18:26.080 --> 00:18:28.200
+So, we're just basically taking it,
+
+00:18:28.200 --> 00:18:29.760
+getting the `workspace-directory`,
+
+00:18:29.760 --> 00:18:32.307
+if it happens to be dot, then we're just going to
+
+00:18:32.307 --> 00:18:33.320
+return the current directory,
+
+00:18:33.320 --> 00:18:36.000
+otherwise whatever directory said.
+
+00:18:36.000 --> 00:18:39.240
+And then I want to just take a moment
+
+00:18:39.240 --> 00:18:41.280
+and look at the rest of this structure.
+
+00:18:41.280 --> 00:18:43.080
+So, `workspace-directory` we talked about.
+
+00:18:43.080 --> 00:18:46.774
+`header-args` if you noticed, none of my
+
+00:18:46.774 --> 00:18:48.707
+code blocks for the most part
+
+00:18:48.707 --> 00:18:50.840
+have any header arguments.
+
+00:18:50.840 --> 00:18:53.174
+You can drop the `header-args` property,
+
+00:18:53.174 --> 00:18:55.607
+which is going to be header arguments
+
+00:18:55.607 --> 00:18:57.840
+that are added automatically
+
+00:18:57.840 --> 00:19:03.407
+to all source code blocks under this heading.
+
+00:19:03.407 --> 00:19:05.407
+`header-args+`. Well,
+
+00:19:05.407 --> 00:19:06.540
+sometimes you don't want to type…
+
+00:19:06.540 --> 00:19:07.507
+you have a bunch of args,
+
+00:19:07.507 --> 00:19:08.240
+you don't want to type them out
+
+00:19:08.240 --> 00:19:09.440
+in this one big line.
+
+00:19:09.440 --> 00:19:11.040
+So, you basically are adding a new header-arg
+
+00:19:13.320 --> 00:19:15.407
+to the existing list of header.
+
+00:19:15.407 --> 00:19:18.160
+And then you can have header-args that are specific
+
+00:19:18.160 --> 00:19:20.440
+to certain languages, like, for example,
+
+00:19:20.440 --> 00:19:21.560
+this `default-directory` var is going to be set
+
+00:19:23.720 --> 00:19:25.200
+for all Emacs Lisps.
+
+00:19:25.200 --> 00:19:29.574
+And for all Arduinos, evaluation will be disabled,
+
+00:19:29.574 --> 00:19:32.440
+and tangling will be automatically enabled.
+
+00:19:32.440 --> 00:19:35.307
+These are just some of the workflows that become
+
+00:19:35.307 --> 00:19:38.320
+useful when you're actually doing the coding.
+
+00:19:38.320 --> 00:19:41.374
+[Future George]: Oh, hello again!
+
+00:19:41.374 --> 00:19:45.307
+Me from the six months from now.
+
+00:19:45.307 --> 00:19:49.107
+[George]: Cool.
+
+00:19:49.107 --> 00:19:51.000
+[Future George]: The talk got over, people liked it,
+
+00:19:51.000 --> 00:19:53.040
+thought the pacing was all over the place.
+
+00:19:53.040 --> 00:19:56.360
+[George]: Yeah, I had to cut two thirds of it,
+
+00:19:56.360 --> 00:19:59.800
+going to be filling in those gaps in the Etherpad.
+
+00:19:59.800 --> 00:20:03.520
+[Future George]: And the editing was uneven, at best.
+
+00:20:03.520 --> 00:20:05.507
+[George]: I got way better at it
+
+00:20:05.507 --> 00:20:06.680
+as I worked on it, didn't I?
+
+00:20:06.680 --> 00:20:09.960
+Kdenlive is pretty cool.
+
+00:20:09.960 --> 00:20:13.540
+But yeah, I wanted to take a shot at
+
+00:20:13.540 --> 00:20:16.040
+something different, and I figured if anyone can
+
+00:20:16.040 --> 00:20:17.760
+appreciate trying something different,
+
+00:20:17.760 --> 00:20:20.120
+it's EmacsConf, right?
+
+00:20:20.120 --> 00:20:21.520
+I hope people found it useful.
+
+00:20:21.520 --> 00:20:22.600
+[Future George]: Yeah, some did.
+
+00:20:22.600 --> 00:20:26.920
+Oh, I should tell you about the coming Orca war.
diff --git a/2022/cfp.md b/2022/cfp.md
new file mode 100644
index 00000000..5b07d426
--- /dev/null
+++ b/2022/cfp.md
@@ -0,0 +1,229 @@
+[[!meta title="Call for Participation"]]
+[[!meta copyright="Copyright &copy; 2020 Amin Bandali, Sacha Chua,
+David Bremner<br />
+Copyright &copy; 2021 Amin Bandali, Sacha Chua, Leo Vivier,
+Sebastian Crane<br />
+Copyright &copy; 2022 Amin Bandali"]]
+<!-- cfp.md is exported from cfp.org, please modify that instead. -->
+
+
+# Call for Participation
+
+[EmacsConf 2022](https://emacsconf.org/2022/) will be a virtual conference on **December 3 and 4,
+2022 (Sat-Sun)**. If you'd like to present at the conference, please
+[submit your proposal](https://emacsconf.org/2022/cfp/) by **September 30, 2022**.
+
+EmacsConf 2022 is about the joy of [Emacs](https://www.gnu.org/software/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: [2021](https://emacsconf.org/2021/schedule/), [2020](https://emacsconf.org/2020/schedule/), [2019](https://emacsconf.org/2019/schedule/), [2015](https://emacsconf.org/2015/schedule/),
+[2013](https://emacsconf.org/2013/#program). You might also find some neat ideas on the [ideas](https://emacsconf.org/2022/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 [your favourite IRC client](ircs://irc.libera.chat:6697/emacsconf), or by visiting
+[chat.emacsconf.org](https://chat.emacsconf.org) in your web browser.
+
+All kinds of people use Emacs for all kinds of things. We'd love it
+if EmacsConf 2022 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 proficient enough to share their thoughts.
+If you let them know that you value their knowledge and experiences,
+and maybe even suggest something that you think others would like to
+hear about, they may realize that they do have something worth sharing
+and that we would love to hear from them.
+
+
+# Important dates
+
+For EmacsConf 2022, we are planning for 9am to 5pm Toronto/EST
+(2pm-10pm UTC) on December 3 and 4. Depending on people's
+availability, it might be two half-days.
+
+<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">CFP opens</td>
+<td class="org-left">July 17, 2022</td>
+</tr>
+
+
+<tr>
+<td class="org-left">CFP closes</td>
+<td class="org-left">September 30, 2022</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Speaker notifications</td>
+<td class="org-left">October 15, 2022</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Schedule published</td>
+<td class="org-left">October 31, 2022</td>
+</tr>
+
+
+<tr>
+<td class="org-left">EmacsConf 2022!</td>
+<td class="org-left">December 3 and 4, 2022</td>
+</tr>
+</tbody>
+</table>
+
+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 [get in touch](https://emacsconf.org/contact/)!).
+
+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.
+
+<a name="formats"></a>
+
+
+# Talk formats
+
+We'd like EmacsConf 2022 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 [publicly](https://lists.gnu.org/mailman/listinfo/emacsconf-org) or [privately](https://lists.gnu.org/mailman/listinfo/emacsconf-org-private). We'll be
+happy to work something out with you.
+
+
+# Preparing and submitting your proposal
+
+We're aware that it can be challenging and intimidating to prepare and
+submit a proposal to a conference, and we want to help make it less
+so. Come say hi to us on our IRC channel `#emacsconf` on
+`irc.libera.chat`, and we'd be happy to try and answer any questions
+or concerns you may have about writing your proposal or submitting it.
+We'd also love to receive suggestions on how we can best help you and
+other prospective speakers interested in giving a talk at EmacsConf.
+
+Once you're ready to submit your proposal, the [submit](https://emacsconf.org/2022/submit/) page has the
+instructions on how to submit your talk. The submissions will then be
+reviewed by a selection committee (please [let us know](https://emacsconf.org/contact/) if you would
+like to help review submissions as part of this 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, [emacsconf-discuss](https://lists.gnu.org/mailman/listinfo/emacsconf-discuss),
+for discussion and announcements about the EmacsConf conference.
+
+If you'd like to propose something other than a talk, like restreaming
+the conference, you can also use this CFP to share your ideas with us.
+
+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 [planning](https://emacsconf.org/2022/planning/) page
+and come say hi to us at `#emacsconf` on `irc.libera.chat`.
+
+Importantly, as EmacsConf continues to grow and receive increasingly
+more talk/session proposal submissions each year, we have thought
+about adding multiple parallel tracks during the conference days to
+accommodate the large number of sessions. However, we're currently
+a very small team and we would need your help to do it! If you're
+interested in helping stream a parallel EmacsConf track and have a
+reliable internet connection with decent speed and bandwidth, please
+[get in touch](https://emacsconf.org/contact/) with us so we can help get you set up for streaming.
+We'd also likely need more volunteers still for each track, for
+example a host for that track to announce the next talk (this can also
+be done by the streamer if the streamer is interested and able to) and
+another volunteer to help check in speakers of upcoming live sessions.
+
+If you are interested and able to help with any of the above, please
+reach out to us; we'd love to have your help!
+
+In addition to the [emacsconf-discuss](https://lists.gnu.org/mailman/listinfo/emacsconf-discuss) list, feel free to subscribe to
+[emacsconf-org](https://lists.gnu.org/mailman/listinfo/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 2022 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 [free software](https://www.gnu.org/philosophy/free-sw.html), much like previous EmacsConf conferences.
+Articles and documentation about the EmacsConf infrastructure are
+still underway, and will be announced on the emacsconf-discuss list
+when available. If you are curious about the EmacsConf infrastructure
+or are interested in working on it, please join our `#emacsconf-infra`
+channel on `irc.libera.chat` and say hi!
+
diff --git a/2022/cfp.org b/2022/cfp.org
new file mode 100644
index 00000000..f2126250
--- /dev/null
+++ b/2022/cfp.org
@@ -0,0 +1,242 @@
+#+title: EmacsConf 2022
+#+subtitle: Online Conference
+#+date: December 3 and 4, 2022
+#+options: author:nil toc:nil
+
+#+begin_export md
+[[!meta title="Call for Participation"]]
+[[!meta copyright="Copyright &copy; 2020 Amin Bandali, Sacha Chua,
+David Bremner<br />
+Copyright &copy; 2021 Amin Bandali, Sacha Chua, Leo Vivier,
+Sebastian Crane<br />
+Copyright &copy; 2022 Amin Bandali"]]
+<!-- cfp.md is exported from cfp.org, please modify that instead. -->
+#+end_export
+
+* COMMENT How to export this file :noexport:
+
+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
+
+[[elisp:(org-md-export-to-markdown)][Export this file to Markdown]]
+
+* Call for Participation
+
+[[https://emacsconf.org/2022/][EmacsConf 2022]] will be a virtual conference on *December 3 and 4,
+2022 (Sat-Sun)*. If you'd like to present at the conference, please
+[[https://emacsconf.org/2022/cfp/][submit your proposal]] by *September 30, 2022*.
+
+EmacsConf 2022 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/2021/schedule/][2021]], [[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/2022/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 2022 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 proficient enough to share their thoughts.
+If you let them know that you value their knowledge and experiences,
+and maybe even suggest something that you think others would like to
+hear about, they may realize that they do have something worth sharing
+and that we would love to hear from them.
+
+* Important dates
+
+For EmacsConf 2022, we are planning for 9am to 5pm Toronto/EST
+(2pm-10pm UTC) on December 3 and 4. Depending on people's
+availability, it might be two half-days.
+
+| CFP opens | July 17, 2022 |
+| CFP closes | September 30, 2022 |
+| Speaker notifications | October 15, 2022 |
+| Schedule published | October 31, 2022 |
+| EmacsConf 2022! | December 3 and 4, 2022 |
+
+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.
+
+#+md: <a name="formats"></a>
+* Talk formats
+
+We'd like EmacsConf 2022 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.
+
+* Preparing and submitting your proposal
+
+We're aware that it can be challenging and intimidating to prepare and
+submit a proposal to a conference, and we want to help make it less
+so. Come say hi to us on our IRC channel =#emacsconf= on
+=irc.libera.chat=, and we'd be happy to try and answer any questions
+or concerns you may have about writing your proposal or submitting it.
+We'd also love to receive suggestions on how we can best help you and
+other prospective speakers interested in giving a talk at EmacsConf.
+
+Once you're ready to submit your proposal, the [[https://emacsconf.org/2022/submit/][submit]] page has the
+instructions on how to submit your talk. The submissions will then be
+reviewed by a selection committee (please [[https://emacsconf.org/contact/][let us know]] if you would
+like to help review submissions as part of this 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.
+
+If you'd like to propose something other than a talk, like restreaming
+the conference, you can also use this CFP to share your ideas with us.
+
+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/2022/planning/][planning]] page
+and come say hi to us at =#emacsconf= on =irc.libera.chat=.
+
+Importantly, as EmacsConf continues to grow and receive increasingly
+more talk/session proposal submissions each year, we have thought
+about adding multiple parallel tracks during the conference days to
+accommodate the large number of sessions. However, we're currently
+a very small team and we would need your help to do it! If you're
+interested in helping stream a parallel EmacsConf track and have a
+reliable internet connection with decent speed and bandwidth, please
+[[https://emacsconf.org/contact/][get in touch]] with us so we can help get you set up for streaming.
+We'd also likely need more volunteers still for each track, for
+example a host for that track to announce the next talk (this can also
+be done by the streamer if the streamer is interested and able to) and
+another volunteer to help check in speakers of upcoming live sessions.
+
+If you are interested and able to help with any of the above, please
+reach out to us; we'd love to have your help!
+
+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 2022 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.
+Articles and documentation about the EmacsConf infrastructure are
+still underway, and will be announced on the emacsconf-discuss list
+when available. If you are curious about the EmacsConf infrastructure
+or are interested in working on it, please join our =#emacsconf-infra=
+channel on =irc.libera.chat= and say hi!
+
+* COMMENT Copyright & License
+
+Copyright (c) 2020 Amin Bandali, Sacha Chua, David Bremner
+Copyright (c) 2021 Amin Bandali, Sacha Chua, Leo Vivier,
+Sebastian Crane
+Copyright (c) 2022 Amin Bandali
+
+The EmacsConf 2022 Call for Participation 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/2022/decisions.md b/2022/decisions.md
new file mode 100644
index 00000000..d9bfb5b1
--- /dev/null
+++ b/2022/decisions.md
@@ -0,0 +1,90 @@
+
+# Table of Contents
+
+- [How do we want to schedule talks?](#schedule)
+ - [Notes](#schedule-notes)
+ - [Option I: Drop back down to one track](#back-to-one)
+ - [Option H: Gen starts with high-level use cases, second day has Hyperbole](#gen-to-specific)
+ - [Option A: General and development tracks - 15/25 buffers, 60 min lunch, dev starts at 10](#gen-and-dev)
+
+
+<a id="schedule"></a>
+
+# TODO How do we want to schedule talks?
+
+
+<a id="schedule-notes"></a>
+
+## Notes
+
+- Green: no availability constraints
+- Red: invalid because of availability constraint
+- Dashed: IRC/pad Q&A, not live
+
+Host role:
+
+- Give the speaker a heads-up before their Q&A session begins
+- If needed, read the questions from the pad to the speaker (Many speakers are comfortable reading the pad on their own.)
+- Give the speaker time warnings before the end of their Q&A session on the stream. Interested participants can continue
+
+Streamer role:
+
+- Switch between playing the prerec and joining the Q&A session
+- Adjust audio volume at the beginning of the Q&A session
+- (optional) Switch scene layouts to focus on different things
+
+Shifts will be Sat AM, Sat PM, Sun AM, or Sun PM per track. People can take multiple shifts.
+
+Updating the images requires `emacsconf-schedule.el` from
+`git@git.emacsconf.org:emacsconf-el` and `emacsconf-org-file` set to
+wherever the private conf org file is.
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-10-04 Tue]</span></span>
+
+- Added option H. General starts with general Org use cases and moves on to more niche things on day 2.
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-10-04 Tue]</span></span>
+
+- Discussed option G with zaeph on #emacsconf-org. zaeph prefers
+ option A over option G because it gives people more choices -
+ they can hop from talk to talk.
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-10-03 Mon]</span></span>
+
+- Discussed with bandali and zaeph on #emacsconf-org
+- Decided on Option A with B, C, or F as fallbacks depending on volunteer roster
+- Better for the viewers and the volunteers
+
+
+<a id="back-to-one"></a>
+
+## Option I: Drop back down to one track
+
+- 45 minutes lunch, 5 minutes between talks, two 5-minute breaks per day
+- Color indicates talk status (gray: waiting, light yellow: processing, yellow: to assign, light green: captioning, green: captioned and ready)
+
+- ![img](schedule-option-back-to-one.svg)
+
+
+<a id="gen-to-specific"></a>
+
+## Option H: Gen starts with high-level use cases, second day has Hyperbole
+
+- compared to A, general audience will be more interested in Org use cases than in Hyperbole, and then we can look at specific techniques on day 2
+
+- ![img](schedule-option-gen-to-specific.svg)
+
+
+<a id="gen-and-dev"></a>
+
+## Option A: General and development tracks - 15/25 buffers, 60 min lunch, dev starts at 10
+
+- Lots of space for Q&A and hallway conversations
+- People can probably find lots of sessions that interest them throughout the day
+- If they decide a talk isn't for them, they can switch and catch another one
+- Stagger live Q&A sessions so that just in case we have only one streamer, they can bounce back and forth
+- Can give some talks extra time if we want
+- Could use dedicated host/streamer(s) for dev track; if not, they can probably pick up questions themselves
+
+- ![img](schedule-option-gen-and-dev.svg)
+
diff --git a/2022/decisions/index.org b/2022/decisions/index.org
new file mode 100644
index 00000000..75f617ec
--- /dev/null
+++ b/2022/decisions/index.org
@@ -0,0 +1,327 @@
+#+EXPORT_FILE_NAME: ../decisions.md
+#+TOC: headlines 3
+
+* TODO How do we want to schedule talks?
+:PROPERTIES:
+:CUSTOM_ID: schedule
+:END:
+
+** Notes
+:PROPERTIES:
+:CUSTOM_ID: schedule-notes
+:END:
+
+- Green: no availability constraints
+- Red: invalid because of availability constraint
+- Dashed: IRC/pad Q&A, not live
+
+Host role:
+- Give the speaker a heads-up before their Q&A session begins
+- If needed, read the questions from the pad to the speaker (Many speakers are comfortable reading the pad on their own.)
+- Give the speaker time warnings before the end of their Q&A session on the stream. Interested participants can continue
+
+Streamer role:
+- Switch between playing the prerec and joining the Q&A session
+- Adjust audio volume at the beginning of the Q&A session
+- (optional) Switch scene layouts to focus on different things
+
+Shifts will be Sat AM, Sat PM, Sun AM, or Sun PM per track. People can take multiple shifts.
+
+Updating the images requires =emacsconf-schedule.el= from
+=git@git.emacsconf.org:emacsconf-el= and =emacsconf-org-file= set to
+wherever the private conf org file is.
+
+[2022-10-04 Tue]
+- Added option H. General starts with general Org use cases and moves on to more niche things on day 2.
+
+[2022-10-04 Tue]
+- Discussed option G with zaeph on #emacsconf-org. zaeph prefers
+ option A over option G because it gives people more choices -
+ they can hop from talk to talk.
+
+[2022-10-03 Mon]
+- Discussed with bandali and zaeph on #emacsconf-org
+- Decided on Option A with B, C, or F as fallbacks depending on volunteer roster
+- Better for the viewers and the volunteers
+** Option J: One track interleaved
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-back-to-one-interleaved.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")
+ ("saturday closing remarks" "16:30" "18:00")
+ ("sunday closing remarks" "16:30" "18:00")))
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Saturday, December 3" :start "2022-12-03 09:00")
+ sat-open
+journalism school treesitter handwritten lspbridge science asmblox buddy wayland
+lunch
+meetups sqlite buttons mail realestate maint health eev python haskell sat-close
+ ("Sunday, December 4" :start "2022-12-04 09:00")
+ sun-open
+survey orgyear rolodex rde orgsuperlinks justl orgvm rms
+lunch
+detached hyperorg eshell workflows async grail
+jupyter dbus indieweb devel localizing
+fanfare
+sun-close)))
+ (emacsconf-schedule-break-time 0)
+ (emacsconf-schedule-lunch-time 30)
+ (emacsconf-schedule-default-buffer-minutes 5)
+ (emacsconf-schedule-svg-modify-functions '(emacsconf-schedule-svg-color-by-status))
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 5)
+ (emacsconf-schedule-strategies '((lambda (info) (mapcar (lambda (o) (plist-put o :track "General")) info))
+ emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-video-time
+ emacsconf-schedule-round-start-to-five
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time))
+)
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-back-to-one-interleaved.svg]]
+:end:
+
+Some options:
+- back to one track; Q&A on alternate stream
+ - main orgas on main stream?
+ - schedule thrashing, limited time between talks
+ - lots of live talks
+- two tracks, sachac runs around behind the scenes
+- *two tracks, sachac starts off doing the streaming with other people shadowing*
+ - someone else needs to do checkin and my other shifts
+
+
+** Option I: Drop back down to one track
+:PROPERTIES:
+:CUSTOM_ID: back-to-one
+:END:
+
+- 45 minutes lunch, 5 minutes between talks, two 5-minute breaks per day
+- Color indicates talk status (gray: waiting, light yellow: processing, yellow: to assign, light green: captioning, green: captioned and ready)
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-back-to-one.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")
+ ("saturday closing remarks" "16:30" "18:00")
+ ("sunday closing remarks" "16:30" "18:00")))
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Saturday, December 3" :start "2022-12-03 09:00")
+ sat-open
+journalism handwritten rolodex
+science
+break buddy meetups buttons devel workflows lunch health realestate indieweb orgvm orgsuperlinks
+break
+ school jupyter community hyperorg localizing fanfare asmblox
+ sat-close
+ ("Sunday, December 4" :start "2022-12-04 09:00")
+ sun-open
+ survey orgyear rde lspbridge break treesitter
+ eshell justl
+ rms lunch
+ sqlite detached
+ async eev python mail break maint dbus wayland haskell grail
+ sun-close)))
+ (emacsconf-schedule-break-time 0)
+ (emacsconf-schedule-lunch-time 45)
+ (emacsconf-schedule-default-buffer-minutes 5)
+ (emacsconf-schedule-svg-modify-functions '(emacsconf-schedule-svg-color-by-status))
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 5)
+
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-video-time
+ emacsconf-schedule-round-start-to-five
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time))
+)
+#+end_src
+
+#+RESULTS:
+:results:
+- localizing: Starts at 15:58 before 16:00
+- haskell: Starts at 15:59 before 16:00
+- [[file:schedule-option-back-to-one.svg]]
+:end:p
+
+** Option H: Gen starts with high-level use cases, second day has Hyperbole
+:PROPERTIES:
+:CUSTOM_ID: gen-to-specific
+:END:
+
+- compared to A, general audience will be more interested in Org use cases than in Hyperbole, and then we can look at specific techniques on day 2
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-gen-to-specific.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints '(("LUNCH" "11:30" "13:30")))
+ (emacsconf-schedule-default-buffer-minutes 15)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 25)
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("GEN Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ journalism
+ school
+ handwritten
+ (break :track "General")
+ science
+ (lunch :start "12:00" :track "General")
+ meetups
+ buddy
+ community
+ (break :track "General")
+ realestate
+ health
+ jupyter
+
+ ("Saturday closing remarks" . "2022-12-03 17:00")
+ ("GEN Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ survey
+ orgyear
+ rolodex
+ (break :track "General")
+ links buttons
+ (lunch :start "12:00" :track "General")
+ hyperorg
+ workflows
+
+ (break :track "General")
+ orgvm
+ indieweb
+ fanfare
+ ("Sunday closing remarks" . "2022-12-04 17:00")
+ ("DEV Saturday, December 3" . "2022-12-03 10:00")
+ localizing treesitter lspbridge
+ (lunch :start "12:00" :track "Development")
+ sqlite
+
+mail
+(break :track "Development")
+eev python
+maint (haskell)
+ ("DEV Sunday, December 4" . "2022-12-04 10:00")
+ rde
+ justl
+tramp
+(lunch :track "Development" :start "12:00")
+detached
+eshell
+async
+(break :track "Development")
+asmblox
+dbus
+wayland
+)))
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 60)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks ("General" "Development"))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks ("General" "Development")))))
+
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-gen-to-specific.svg]]
+:end:
+
+** Option A: General and development tracks - 15/25 buffers, 60 min lunch, dev starts at 10
+:PROPERTIES:
+:CUSTOM_ID: gen-and-dev
+:END:
+
+- Lots of space for Q&A and hallway conversations
+- People can probably find lots of sessions that interest them throughout the day
+- If they decide a talk isn't for them, they can switch and catch another one
+- Stagger live Q&A sessions so that just in case we have only one streamer, they can bounce back and forth
+- Can give some talks extra time if we want
+- Could use dedicated host/streamer(s) for dev track; if not, they can probably pick up questions themselves
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-gen-and-dev.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints '(("LUNCH" "11:30" "13:30")))
+ (emacsconf-schedule-default-buffer-minutes 15)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 25)
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("GEN Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ survey orgyear rolodex
+ (break . "10:45")
+ links buttons
+ (lunch . "12:00")
+ hyperorg realestate health
+ break
+ jupyter workflows
+
+ ("Saturday closing remarks" . "2022-12-03 17:00")
+ ("GEN Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ journalism
+ handwritten
+ break
+ school science lunch
+ meetups buddy
+ community
+break orgvm
+ indieweb fanfare
+ ("Sunday closing remarks" . "2022-12-04 17:00")
+ ("DEV Saturday, December 3" . "2022-12-03 10:00")
+ localizing treesitter lspbridge
+ (lunch :track "Development")
+ sqlite
+mail
+eev python
+(break :start "15:00" :track "Development") maint (haskell . "2022-12-03 16:00")
+ ("DEV Sunday, December 4" . "2022-12-04 10:00")
+ justl (rde . "10:30")
+eshell
+ (lunch :track "Development")
+ detached
+ tramp async
+ (break :track "Development")
+ asmblox dbus wayland
+ )) )
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 60)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks ("General" "Development"))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks ("General" "Development")))))
+
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-gen-and-dev.svg]]
+:end:
+
diff --git a/2022/decisions/index.org_archive b/2022/decisions/index.org_archive
new file mode 100644
index 00000000..18c44252
--- /dev/null
+++ b/2022/decisions/index.org_archive
@@ -0,0 +1,462 @@
+# -*- mode: org -*-
+
+
+Archived entries from file /home/sacha/proj/emacsconf/wiki/2022/decisions/index.org
+
+
+* Option B: Two afternoon tracks (dev starts at 13:30), 10/20 buffer, 60 min lunch
+:PROPERTIES:
+:CUSTOM_ID: two-afternoons
+:ARCHIVE_TIME: 2022-10-04 Tue 23:45
+:ARCHIVE_FILE: ~/proj/emacsconf/wiki/2022/decisions/index.org
+:ARCHIVE_OLPATH: How do we want to schedule talks?
+:ARCHIVE_CATEGORY: index
+:END:
+
+- Good option if we don't have enough hosts/streamers to cover both days
+- Some room to breathe, some dev talks still on the main track
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-two-afternoon-tracks.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")))
+ (emacsconf-schedule-default-buffer-minutes 10)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 20)
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("GEN Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ survey journalism orgyear rolodex
+ break
+ links buttons hyperorg
+ lunch
+ meetups buddy school science
+ break
+ realestate health
+ "Saturday closing remarks"
+ ("DEV Saturday afternoon" . "2022-12-03 13:30")
+ eshell detached asmblox break maint mail haskell
+ ("Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ localizing handwritten treesitter
+ break
+ orgvm indieweb rde
+ justl
+ lunch
+ jupyter
+ workflows async
+ break
+community fanfare
+("Sunday closing remarks" . "2022-12-04 17:00")
+ ("DEV Sunday afternoon" . "2022-12-04 13:30")
+ tramp
+ sqlite eev python wayland dbus
+ lspbridge
+ )))
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 60)
+ (emacsconf-schedule-max-time 30)
+
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks (("^GEN" "^DEV")
+ ("^DEV" "^Sunday")))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks (("^Sunday" "^DEV Sunday")
+ ("^DEV Sunday"))))))
+
+
+#+end_src
+
+#+RESULTS:
+:results:
+- LUNCH: Ends at 13:45 after 13:30
+- [[file:schedule-option-two-afternoon-tracks.svg]]
+:end:
+
+
+* Option C: One afternoon track, 5/10 minute buffers, 60 minute lunch
+:PROPERTIES:
+:CUSTOM_ID: one-afternoon
+:ARCHIVE_TIME: 2022-10-04 Tue 23:45
+:ARCHIVE_FILE: ~/proj/emacsconf/wiki/2022/decisions/index.org
+:ARCHIVE_OLPATH: How do we want to schedule talks?
+:ARCHIVE_CATEGORY: index
+:END:
+
+- Lightens up the schedule a little bit, allows us to test out tracks without committing too much
+- Needs an extra host and streamer for one afternoon
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-one-afternoon-track.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")
+ ("saturday closing remarks" "16:30" "18:00")
+ ("sunday closing remarks" "16:30" "18:00")))
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("GEN Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ survey journalism orgyear rolodex
+ break
+ links buttons hyperorg
+ lunch
+ meetups buddy school science community
+ break
+ realestate health jupyter
+ "Saturday closing remarks"
+ ("DEV Saturday afternoon" . "2022-12-03 13:30")
+ eshell detached asmblox break maint mail wayland lspbridge
+ ("Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ localizing handwritten treesitter
+ break
+ orgvm indieweb rde
+ justl
+ lunch
+ workflows tramp async sqlite eev python
+ break
+ dbus haskell fanfare
+ "Sunday closing remarks")))
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 60)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-default-buffer-minutes 5)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 10)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks (("^GEN" "^DEV")
+ ("^DEV" "^Sunday")))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks (("^Sunday"))))))
+
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-one-afternoon-track.svg]]
+:end:
+
+
+* Option D: Remove buffer from non-live talks (not recommended)
+:PROPERTIES:
+:CUSTOM_ID: no-irc
+:ARCHIVE_TIME: 2022-10-04 Tue 23:45
+:ARCHIVE_FILE: ~/proj/emacsconf/wiki/2022/decisions/index.org
+:ARCHIVE_OLPATH: How do we want to schedule talks?
+:ARCHIVE_CATEGORY: index
+:END:
+
+- Considerations:
+ - Frees up about 20 minutes on each day, so we might be able to squeeze in two more talks sideways.
+ - Pretty frenetic
+ - Not recommended
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-only-live-qa.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")
+ ("saturday closing remarks" "16:30" "18:00")
+ ("sunday closing remarks" "16:30" "18:00")))
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ survey journalism orgyear handwritten rolodex
+ break
+ links buttons hyperorg
+ lunch
+ meetups buddy school science community realestate
+ break
+ health jupyter orgvm indieweb workflows
+ "Saturday closing remarks"
+ ("Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ localizing lspbridge treesitter
+ break
+ justl rde eshell detached asmblox
+ lunch
+ tramp async sqlite eev python mail
+ break
+ dbus wayland maint haskell fanfare
+ "Sunday closing remarks")))
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 30)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-default-buffer-minutes 0)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 10)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks (("^Saturday" "^Sunday")))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks (("^Sunday"))))))
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-only-live-qa.svg]]
+:end:
+
+
+* Option E: Reduce buffer to non-round numbers (3/7 minutes, like 2021); 10min break 30min lunch (not recommended)
+:PROPERTIES:
+:CUSTOM_ID: non-round
+:ARCHIVE_TIME: 2022-10-04 Tue 23:45
+:ARCHIVE_FILE: ~/proj/emacsconf/wiki/2022/decisions/index.org
+:ARCHIVE_OLPATH: How do we want to schedule talks?
+:ARCHIVE_CATEGORY: index
+:END:
+
+- Schedule looks too precise, sets expectations; timekeeping is more challenging
+- Pretty frenetic
+- Could probably use shifts for hosts or streamers
+- Not recommended
+
+#+begin_src emacs-lisp :results value :exports results :var filename="schedule-option-non-round-buffer.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")
+ ("saturday closing remarks" "16:30" "18:00")
+ ("sunday closing remarks" "16:30" "18:00")))
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ survey journalism orgyear handwritten rolodex
+ break
+ links buttons hyperorg
+ lunch
+ meetups buddy school science community realestate
+ break
+ health jupyter orgvm indieweb workflows
+ "Saturday closing remarks"
+ ("Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ localizing lspbridge treesitter
+ break
+ justl rde eshell detached asmblox
+ lunch
+ tramp async sqlite eev python mail
+ break
+ dbus wayland maint haskell fanfare
+ "Sunday closing remarks")))
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 30)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-default-buffer-minutes 3)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 7)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks (("^Saturday" "^Sunday")))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks (("^Sunday")))))))
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-non-round-buffer.svg]]
+:end:
+
+
+* Option F: Pack everything in one long day (current schedule)
+:PROPERTIES:
+:CUSTOM_ID: long
+:ARCHIVE_TIME: 2022-10-04 Tue 23:45
+:ARCHIVE_FILE: ~/proj/emacsconf/wiki/2022/decisions/index.org
+:ARCHIVE_OLPATH: How do we want to schedule talks?
+:ARCHIVE_CATEGORY: index
+:END:
+
+- Considerations:
+ - Difficult to accommodate extra talks
+ - Host/streamer have a very long intense day
+- Ideas:
+ - Split up hosting duties into shifts (volunteers can read the questions)
+ - Use prerecorded intros and outros
+ - Split up streaming duties into shifts (volunteers can adjust audio volume, switch to the right BBB room)
+ - Set up cloud streaming so that streamers can work in shifts
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-one-full-day.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints
+ '(("LUNCH" "11:30" "13:30")
+ ("saturday closing remarks" "16:30" "18:00")
+ ("sunday closing remarks" "16:30" "18:00")))
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Saturday, December 3" . "2022-12-03 09:00")
+ "Saturday opening remarks"
+ survey journalism orgyear handwritten rolodex
+ break
+ links buttons hyperorg
+ lunch
+ meetups buddy school science community realestate
+ break
+ health jupyter orgvm indieweb workflows
+ "Saturday closing remarks"
+ ("Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ localizing lspbridge treesitter
+ break
+ justl rde eshell detached asmblox
+ lunch
+ tramp async sqlite eev python mail
+ break
+ dbus wayland haskell maint fanfare
+ "Sunday closing remarks")))
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 30)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-default-buffer-minutes 5)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 10)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time-at-most-max-time
+ emacsconf-schedule-tweak-allocations))
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks (("^Saturday" "^Sunday")))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks (("^Sunday"))))))
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-one-full-day.svg]]
+:end:
+
+
+* Option G: Time-aligned
+:PROPERTIES:
+:CUSTOM_ID: gen-and-dev-aligned
+:ARCHIVE_TIME: 2022-10-04 Tue 23:45
+:ARCHIVE_FILE: ~/proj/emacsconf/wiki/2022/decisions/index.org
+:ARCHIVE_OLPATH: How do we want to schedule talks?
+:ARCHIVE_CATEGORY: index
+:END:
+
+- Line up the starts and the Q&A; easier to display in a table, but
+ then we will really need to have multiple hosts/streamers, and
+ people will have to choose.
+
+#+begin_src emacs-lisp :exports results :var filename="schedule-option-gen-and-dev-aligned.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints '(("LUNCH" "11:30" "13:30")))
+ (emacsconf-schedule-default-buffer-minutes 15)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 15)
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("GEN Saturday, December 3" . "2022-12-03 08:55")
+ "Saturday opening remarks"
+ (survey . "9:00")
+ (orgyear . "9:30")
+ (rolodex . "10:00")
+ break
+ (links . "11:00")
+ buttons
+ (lunch . "12:00")
+ hyperorg
+ realestate
+ health
+ (break . "15:00")
+ jupyter (workflows . "16:00")
+
+ ("Saturday closing remarks" . "2022-12-03 16:45")
+ ("GEN Sunday, December 4" . "2022-12-04 09:00")
+ "Sunday opening remarks"
+ journalism
+ handwritten
+ school
+ break science meetups (lunch . "12:00")
+ community
+ buddy
+ orgvm
+ (break . "14:45")
+ indieweb fanfare
+ ("Sunday closing remarks" . "2022-12-04 16:30")
+ ("DEV Saturday, December 3" . "2022-12-03 10:00")
+ localizing (treesitter . "11:00") rde
+ (lunch :start "12:00" :track "Development")
+ mail
+
+sqlite eev python (break :track "Development")
+maint (haskell . "2022-12-03 16:00")
+ ("DEV Sunday, December 4" . "2022-12-04 10:00")
+(justl . "10:05") (lspbridge . "10:50")
+ eshell (lunch :start "12:00" :track "Development")
+ tramp
+ detached
+ asmblox (break :start "14:45" :track "Development") async wayland
+ (dbus . "16:00") )) )
+ (emacsconf-schedule-break-time 10)
+ (emacsconf-schedule-lunch-time 60)
+ (emacsconf-schedule-max-time 30)
+ (emacsconf-schedule-tweaked-allocations '(("indieweb" . 20)
+ ("maint" . 20)
+ ("workflows" . 20)))
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-buffer-time
+ emacsconf-schedule-tweak-allocations))
+ (emacsconf-schedule-validate-live-q-and-a-sessions-buffer nil)
+ (tracks '((:label "Saturday"
+ :start "2022-12-03 9:00"
+ :end "2022-12-03 18:00"
+ :tracks ("General" "Development"))
+ (:label "Sunday"
+ :start "2022-12-04 9:00"
+ :end "2022-12-04 18:00"
+ :tracks ("General" "Development")))))
+
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:schedule-option-gen-and-dev-aligned.svg]]
+:end:
diff --git a/2022/decisions/schedule-option-back-to-one.svg b/2022/decisions/schedule-option-back-to-one.svg
new file mode 100644
index 00000000..6e736572
--- /dev/null
+++ b/2022/decisions/schedule-option-back-to-one.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:10- 9:30 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="15" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(44,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 9:35- 9:43 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="54" y="15" opacity="0.8" width="12" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(64,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:48-10:10 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="75" y="15" opacity="0.8" width="34" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(107,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:15-10:32 Writing and organizing literature notes for scientific writing</title> <rect x="117" y="15" opacity="0.8" width="26" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(141,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 10:37-10:45 The Emacs Buddy initiative</title> <rect x="152" y="15" opacity="0.8" width="12" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(162,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 10:50-11:10 Attending and organizing Emacs meetups</title> <rect x="172" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(201,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 11:15-11:26 Linking personal info with Hyperbole implicit buttons</title> <rect x="211" y="15" opacity="0.8" width="17" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(226,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 11:31-11:37 Emacs development updates</title> <rect x="236" y="15" opacity="0.8" width="9" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(243,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 11:42-12:03 Org workflows for developers</title> <rect x="254" y="15" opacity="0.8" width="32" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(284,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot" data-slug="health"> <title> 12:53- 1:18 Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="365" y="15" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(402,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 1:23- 1:48 Real estate and Org table formulas</title> <rect x="412" y="15" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(449,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 1:53- 2:10 Putting Org Mode on the Indieweb</title> <rect x="459" y="15" opacity="0.8" width="26" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(483,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 2:15- 2:25 orgvm: a simple HTTP server for org</title> <rect x="494" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(507,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 2:30- 2:39 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="517" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(529,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 2:44- 2:53 Back to school with Emacs</title> <rect x="539" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(551,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 2:58- 3:18 Edit live Jupyter notebook cells with Emacs</title> <rect x="561" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(590,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 3:23- 3:53 Powerful productivity with Hyperbole and Org Mode</title> <rect x="600" y="15" opacity="0.8" width="47" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(645,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:13- 4:23 Fanfare for the Common Emacs User</title> <rect x="679" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(692,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(742,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 3:58- 4:08 Pre-localizing Emacs</title> <rect x="655" y="50" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="red"></rect> <g transform="translate(668,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 4:28- 4:45 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="702" y="50" opacity="0.8" width="26" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(726,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,100)"> <title> Schedule for Sunday</title> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:10- 9:30 Results of the 2022 Emacs Survey</title> <rect x="15" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect> <g transform="translate(44,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect> <g transform="translate(67,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 4:34- 4:54 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="712" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(741,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:59- 5:09 Sunday closing remarks</title> <rect x="751" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(764,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 9:50-10:14 rde Emacs introduction</title> <rect x="78" y="50" opacity="0.8" width="37" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(113,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client" data-slug="lspbridge"> <title> 10:19-10:39 lsp-bridge: complete asynchronous LSP client</title> <rect x="123" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect> <g transform="translate(152,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:44-10:56 Tree-sitter beyond syntax highlighting</title> <rect x="163" y="50" opacity="0.8" width="18" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(179,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 11:01-11:16 Top 10 reasons why you should be using Eshell</title> <rect x="189" y="50" opacity="0.8" width="23" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(210,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 11:21-11:32 justl: Driving recipes within Emacs</title> <rect x="221" y="50" opacity="0.8" width="17" height="34" stroke="black" stroke-dasharray="5,5,5" fill="green"></rect> <g transform="translate(236,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:37-11:55 What I'd like to see in Emacs</title> <rect x="246" y="50" opacity="0.8" width="28" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(272,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 12:45- 1:07 Using SQLite as a data source: a framework and an example</title> <rect x="352" y="50" opacity="0.8" width="34" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(384,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:12- 1:23 Getting detached from Emacs</title> <rect x="395" y="50" opacity="0.8" width="17" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(410,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 1:28- 1:46 Emacs was async before async was cool</title> <rect x="420" y="50" opacity="0.8" width="28" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(446,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 1:51- 1:56 Bidirectional links with eev</title> <rect x="456" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect> <g transform="translate(461,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 2:01- 2:06 Short hyperlinks to Python docs</title> <rect x="472" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect> <g transform="translate(477,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 2:11- 2:49 Revisiting the anatomy of Emacs mail user agents</title> <rect x="487" y="50" opacity="0.8" width="59" height="34" stroke="black" stroke-dasharray="" fill="green"></rect> <g transform="translate(544,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:54- 3:14 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="555" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(584,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:19- 3:39 The Wheels on D-Bus</title> <rect x="594" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(623,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 3:44- 3:54 Emacs should become a Wayland compositor</title> <rect x="633" y="50" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect> <g transform="translate(646,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 3:59- 4:29 Haskell code exploration with Emacs</title> <rect x="657" y="50" opacity="0.8" width="47" height="34" stroke="black" stroke-dasharray="" fill="red"></rect> <g transform="translate(702,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-gen-and-dev-aligned.svg b/2022/decisions/schedule-option-gen-and-dev-aligned.svg
new file mode 100644
index 00000000..554707c7
--- /dev/null
+++ b/2022/decisions/schedule-option-gen-and-dev-aligned.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="nil" title="GEN Saturday, December 3"> <rect x="-8" y="15" opacity="0.8" width="-126771" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Saturday, December 3</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="-8" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-3,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="0" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(27,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="44" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(56,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="88" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(115,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="140" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(152,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="177" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(189,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="214" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(226,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="355" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(397,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="422" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(449,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="474" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(501,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="nil" title="BREAK"> <rect x="533" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(545,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="548" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(560,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="622" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(649,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="688" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(693,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="nil" title="GEN Sunday, December 4"> <rect x="2133" y="15" opacity="0.8" width="-128912" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="2133" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2138,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="2140" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2167,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="2192" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2204,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="2229" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(2256,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="nil" title="BREAK"> <rect x="2281" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2293,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="2296" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2323,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="2348" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2360,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="nil" title="LUNCH"> <rect x="2400" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2486,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="2488" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2530,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="2555" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(2567,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="2592" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2604,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="nil" title="BREAK"> <rect x="2644" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2656,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="2659" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2686,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="2711" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2723,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="2800" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2812,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="nil" title="DEV Saturday, December 3"> <rect x="88" y="15" opacity="0.8" width="-126867" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Saturday, December 3</text></g></a> <a href="nil" title="DEV Sunday, December 4"> <rect x="2222" y="15" opacity="0.8" width="-129001" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="88" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(115,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="177" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(189,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="214" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(241,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="355" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(397,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="422" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(449,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="474" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(479,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="503" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(508,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="nil" title="BREAK"> <rect x="533" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(545,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="548" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(575,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="622" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(664,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="2229" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(2241,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="2296" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(2323,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="2348" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2360,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="nil" title="LUNCH"> <rect x="2400" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2486,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="2488" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2530,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="2555" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2567,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="2592" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2604,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="BREAK"> <rect x="2644" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2656,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="2659" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="2711" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2723,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="2755" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2782,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="nil" title="GEN Saturday, December 3"> <rect x="-2141" y="15" opacity="0.8" width="-126771" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128914,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Saturday, December 3</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="-2141" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-2136,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="-2134" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-2107,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="-2089" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-2077,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="-2045" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-2018,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="-1993" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1981,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="-1956" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1944,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="-1919" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1907,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="nil" title="LUNCH"> <rect x="-1867" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="-1778" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1736,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="-1712" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1685,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="-1660" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1633,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="nil" title="BREAK"> <rect x="-1600" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1588,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="-1586" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1574,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="-1512" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1485,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="-1445" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1440,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="nil" title="GEN Sunday, December 4"> <rect x="0" y="15" opacity="0.8" width="-128912" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128914,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="7" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="59" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(71,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="96" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(123,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="nil" title="BREAK"> <rect x="148" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(160,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="162" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(189,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="214" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(226,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="355" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(397,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="422" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(434,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="459" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(471,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="nil" title="BREAK"> <rect x="511" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(523,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="525" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(552,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="577" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(589,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="666" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(678,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="nil" title="DEV Saturday, December 3"> <rect x="-2045" y="15" opacity="0.8" width="-126867" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128914,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Saturday, December 3</text></g></a> <a href="nil" title="DEV Sunday, December 4"> <rect x="88" y="15" opacity="0.8" width="-129001" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128915,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="-2045" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-2018,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="-1956" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-1944,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="-1919" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1892,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="nil" title="LUNCH"> <rect x="-1867" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1781,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="-1778" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1736,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="-1712" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1685,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="-1660" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1655,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="-1630" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1625,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="nil" title="BREAK"> <rect x="-1600" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1588,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="-1586" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1559,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="-1512" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1470,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="96" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(108,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="162" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(189,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="214" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(226,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="355" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(397,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="422" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="459" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(471,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="BREAK"> <rect x="511" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(523,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="525" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(552,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="577" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(589,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="622" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(649,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-gen-and-dev.svg b/2022/decisions/schedule-option-gen-and-dev.svg
new file mode 100644
index 00000000..d23dd3f1
--- /dev/null
+++ b/2022/decisions/schedule-option-gen-and-dev.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="nil" title="GEN Saturday, December 3"> <rect x="0" y="15" opacity="0.8" width="-126770" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126772,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Saturday, December 3</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="59" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(71,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="96" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(123,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="155" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(167,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="170" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(182,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="222" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(234,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="355" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(397,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="437" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(464,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="488" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(515,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="nil" title="BREAK"> <rect x="555" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(567,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="570" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(582,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="622" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(649,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="711" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(716,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="nil" title="GEN Sunday, December 4"> <rect x="2133" y="15" opacity="0.8" width="-128904" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126773,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="2133" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2138,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="2140" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2167,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="2207" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2219,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="nil" title="BREAK"> <rect x="2259" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2271,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="2274" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(2301,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="2325" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2352,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="nil" title="LUNCH"> <rect x="2392" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2478,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="2481" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2493,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="2533" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(2545,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="2570" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2612,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="nil" title="BREAK"> <rect x="2651" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2663,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="2666" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2678,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="2718" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2745,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="2785" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2797,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="2844" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2856,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="nil" title="DEV Saturday, December 3"> <rect x="88" y="15" opacity="0.8" width="-126859" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126773,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Saturday, December 3</text></g></a> <a href="nil" title="DEV Sunday, December 4"> <rect x="2222" y="15" opacity="0.8" width="-128993" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126773,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="88" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(115,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="155" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(167,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="192" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(219,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="nil" title="LUNCH"> <rect x="244" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(330,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="333" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(360,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="400" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(442,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="481" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(486,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="511" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(516,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="nil" title="BREAK"> <rect x="533" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(545,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="548" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(575,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="622" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(664,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="2222" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(2234,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="2266" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2293,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="2333" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2345,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="nil" title="LUNCH"> <rect x="2385" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2471,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="2474" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2486,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="2525" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2567,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="2607" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2634,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="nil" title="BREAK"> <rect x="2674" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="2688" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2700,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="2740" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2767,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="2807" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2819,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="nil" title="GEN Saturday, December 3"> <rect x="-2134" y="15" opacity="0.8" width="-126770" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128906,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Saturday, December 3</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="-2134" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-2129,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="-2126" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-2099,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="-2075" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-2063,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="-2038" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-2011,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="-1978" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1966,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="-1963" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1951,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="-1912" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1900,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="nil" title="LUNCH"> <rect x="-1867" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="-1778" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1736,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="-1697" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1670,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="-1645" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1618,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="nil" title="BREAK"> <rect x="-1578" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1566,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="-1563" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1551,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="-1512" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1485,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="-1423" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1418,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="nil" title="GEN Sunday, December 4"> <rect x="0" y="15" opacity="0.8" width="-128904" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128906,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="7" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="74" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(86,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="nil" title="BREAK"> <rect x="125" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(137,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="140" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(167,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="192" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(219,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="nil" title="LUNCH"> <rect x="259" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(345,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="348" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(360,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="400" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(412,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="437" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(479,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="nil" title="BREAK"> <rect x="518" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(530,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="533" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(545,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="585" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(612,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="651" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(663,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="711" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(723,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="nil" title="DEV Saturday, December 3"> <rect x="-2045" y="15" opacity="0.8" width="-126859" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128906,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Saturday, December 3</text></g></a> <a href="nil" title="DEV Sunday, December 4"> <rect x="88" y="15" opacity="0.8" width="-128993" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128907,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="-2045" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-2018,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="-1978" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-1966,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="-1941" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1914,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="nil" title="LUNCH"> <rect x="-1889" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1803,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="-1800" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1773,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="-1734" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1692,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="-1652" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1647,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="-1623" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1618,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="nil" title="BREAK"> <rect x="-1600" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1588,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="-1586" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1559,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="-1512" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1470,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="88" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(100,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="133" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(160,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="200" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(212,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="nil" title="LUNCH"> <rect x="251" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(337,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="340" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(352,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="392" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="474" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(501,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="nil" title="BREAK"> <rect x="540" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(552,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="555" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(567,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="607" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(634,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="674" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-gen-to-specific.svg b/2022/decisions/schedule-option-gen-to-specific.svg
new file mode 100644
index 00000000..6ec146cd
--- /dev/null
+++ b/2022/decisions/schedule-option-gen-to-specific.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="nil" title="GEN Saturday, December 3"> <rect x="0" y="15" opacity="0.8" width="-126747" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126749,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Saturday, December 3</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="7" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="74" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(101,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="125" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(137,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="nil" title="BREAK"> <rect x="177" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(189,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="192" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(219,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="355" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(367,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="407" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(419,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="444" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(486,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="nil" title="BREAK"> <rect x="525" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(537,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="540" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(567,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="592" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(619,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="659" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(671,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="711" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(716,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="nil" title="GEN Sunday, December 4"> <rect x="2133" y="15" opacity="0.8" width="-128880" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126749,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="2133" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2138,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="2140" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(2167,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="2192" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(2204,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="2229" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(2256,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="2281" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2293,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="2296" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2308,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="2348" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2360,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="nil" title="LUNCH"> <rect x="2400" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2486,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="2488" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2530,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="2570" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2597,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="nil" title="BREAK"> <rect x="2637" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2649,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="2651" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2663,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="2703" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2730,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="2770" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2782,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="2844" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2856,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="nil" title="DEV Saturday, December 3"> <rect x="88" y="15" opacity="0.8" width="-126836" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126750,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Saturday, December 3</text></g></a> <a href="nil" title="DEV Sunday, December 4"> <rect x="2222" y="15" opacity="0.8" width="-128969" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-126749,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="88" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(115,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="155" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(167,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="192" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(219,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="355" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(382,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="422" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(464,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="nil" title="BREAK"> <rect x="503" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(515,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="518" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(523,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="548" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(553,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="577" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(604,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="644" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="2222" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2249,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="2288" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(2300,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="2325" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2367,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="nil" title="LUNCH"> <rect x="2400" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2486,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="2488" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2500,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="2540" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2552,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="2592" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2619,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="nil" title="BREAK"> <rect x="2659" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(2671,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="2674" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="2725" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(2752,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="2792" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(2804,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="nil" title="GEN Saturday, December 3"> <rect x="-2134" y="15" opacity="0.8" width="-126747" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128883,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Saturday, December 3</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="-2134" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-2129,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="-2126" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-2099,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="-2060" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-2033,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="-2008" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1996,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="nil" title="BREAK"> <rect x="-1956" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1944,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="-1941" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1914,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="nil" title="LUNCH"> <rect x="-1867" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1781,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="-1778" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1766,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="-1726" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1714,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="-1689" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1647,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="nil" title="BREAK"> <rect x="-1608" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1596,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="-1593" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1566,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="-1541" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1514,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="-1475" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1463,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="-1423" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1418,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="nil" title="GEN Sunday, December 4"> <rect x="0" y="15" opacity="0.8" width="-128880" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128882,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> GEN Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="59" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(71,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="96" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(123,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="148" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(160,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="162" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(174,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="214" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(226,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="15" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="355" y="15" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(397,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="437" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(464,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="nil" title="BREAK"> <rect x="503" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(515,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="518" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(530,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="570" y="15" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(597,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="637" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(649,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="711" y="15" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(723,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="nil" title="DEV Saturday, December 3"> <rect x="-2045" y="15" opacity="0.8" width="-126836" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128883,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Saturday, December 3</text></g></a> <a href="nil" title="DEV Sunday, December 4"> <rect x="88" y="15" opacity="0.8" width="-128969" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-128883,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> DEV Sunday, December 4</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="-2045" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-2018,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="-1978" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(-1966,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="-1941" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1914,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="nil" title="LUNCH"> <rect x="-1867" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1781,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="-1778" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1751,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="-1712" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1670,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="nil" title="BREAK"> <rect x="-1630" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(-1618,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="-1615" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1610,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="-1586" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(-1581,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="-1556" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(-1529,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="-1489" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(-1447,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="88" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(115,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="155" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(167,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="192" y="50" opacity="0.8" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(234,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="nil" title="LUNCH"> <rect x="266" y="50" opacity="0.8" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(352,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="355" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(367,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="407" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(419,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="459" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(486,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="nil" title="BREAK"> <rect x="525" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(537,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="540" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(552,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="592" y="50" opacity="0.8" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(619,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="659" y="50" opacity="0.8" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(671,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-non-round-buffer.svg b/2022/decisions/schedule-option-non-round-buffer.svg
new file mode 100644
index 00000000..875c4cc5
--- /dev/null
+++ b/2022/decisions/schedule-option-non-round-buffer.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="41" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(68,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="81" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(93,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="100" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(112,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="125" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(152,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="160" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(172,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="174" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(186,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="200" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(212,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="225" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(267,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="nil" title="LUNCH"> <rect x="280" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(322,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="324" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(336,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="349" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(361,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="368" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(395,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="402" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(429,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="442" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(484,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="497" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(524,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="nil" title="BREAK"> <rect x="531" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(543,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="546" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(573,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="586" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(598,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="611" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(623,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="637" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(664,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="677" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(704,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="717" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(722,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="47" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(74,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="81" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(93,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="nil" title="BREAK"> <rect x="100" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(112,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="115" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(127,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="134" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(161,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="174" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(186,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="200" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(212,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="225" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(237,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="LUNCH"> <rect x="250" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(292,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="294" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(336,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="349" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(376,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="389" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(416,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="429" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="441" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(446,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="453" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(495,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="nil" title="BREAK"> <rect x="508" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(520,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="522" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(549,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="562" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(574,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="588" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(615,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="628" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(670,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="682" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(694,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="708" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(720,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-one-afternoon-track.svg b/2022/decisions/schedule-option-one-afternoon-track.svg
new file mode 100644
index 00000000..594c10ac
--- /dev/null
+++ b/2022/decisions/schedule-option-one-afternoon-track.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="44" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(71,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="88" y="15" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(100,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="111" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(138,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="148" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(160,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="162" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(174,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="192" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(204,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="222" y="15" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(264,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="nil" title="LUNCH"> <rect x="281" y="15" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(367,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="370" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(382,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="400" y="15" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(412,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="422" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(449,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="459" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(486,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="503" y="15" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(545,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="nil" title="BREAK"> <rect x="562" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(574,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="577" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(604,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="614" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(641,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="659" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(671,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="688" y="15" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(693,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="400" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(412,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="429" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(441,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="459" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(471,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="BREAK"> <rect x="488" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(500,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="503" y="50" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(530,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="548" y="50" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(590,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="607" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(619,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="637" y="50" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(664,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="51" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(63,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="81" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(93,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="nil" title="BREAK"> <rect x="103" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(115,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="118" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(130,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="148" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(175,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="192" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(219,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="237" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(249,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="nil" title="LUNCH"> <rect x="259" y="15" width="88" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(345,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="348" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(375,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="392" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="451" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(478,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="496" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(523,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="540" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(545,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="555" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(560,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="nil" title="BREAK"> <rect x="570" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(582,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="585" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(612,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="629" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(671,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="688" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(700,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="718" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(730,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-one-full-day.svg b/2022/decisions/schedule-option-one-full-day.svg
new file mode 100644
index 00000000..4934402d
--- /dev/null
+++ b/2022/decisions/schedule-option-one-full-day.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="44" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(71,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="88" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(100,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="111" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(123,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="140" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(167,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="177" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(189,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="192" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(204,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="222" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(234,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="251" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(293,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="nil" title="LUNCH"> <rect x="311" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(353,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="355" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(367,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="385" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(397,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="407" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="444" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(471,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="488" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(530,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="548" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(575,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="nil" title="BREAK"> <rect x="585" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(597,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="600" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(627,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="644" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(656,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="674" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="703" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(730,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="748" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(775,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="792" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(797,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="51" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(78,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="88" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(100,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="nil" title="BREAK"> <rect x="111" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(123,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="125" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(137,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="148" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(175,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="192" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(204,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="222" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(234,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="251" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(263,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="LUNCH"> <rect x="281" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(323,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="325" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(367,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="385" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(412,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="429" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(456,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="474" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(479,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="488" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(493,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="503" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(545,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="nil" title="BREAK"> <rect x="562" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(574,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="577" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(604,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="622" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(634,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="651" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(693,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="711" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(738,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="755" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(767,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="785" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(797,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-only-live-qa.svg b/2022/decisions/schedule-option-only-live-qa.svg
new file mode 100644
index 00000000..849eb6c8
--- /dev/null
+++ b/2022/decisions/schedule-option-only-live-qa.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="37" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(64,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="81" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(93,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="96" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(108,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="125" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(152,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="155" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(167,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="170" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(182,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="200" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(212,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="229" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(271,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="nil" title="LUNCH"> <rect x="288" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(330,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="333" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(345,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="362" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(374,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="377" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(404,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="407" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="451" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(493,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="511" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(538,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="nil" title="BREAK"> <rect x="540" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(552,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="555" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(582,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="600" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(612,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="629" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(641,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="659" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(686,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="703" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(730,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="748" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(753,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" width="7" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="7" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="51" y="15" width="29" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(78,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="81" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(93,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="nil" title="BREAK"> <rect x="96" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(108,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="111" y="15" width="14" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(123,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="125" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(152,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="170" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(182,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="200" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(212,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="229" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(241,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="LUNCH"> <rect x="259" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(301,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="303" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(345,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="362" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(389,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="407" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(434,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="451" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(456,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="459" y="15" width="7" height="69" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(464,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="466" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(508,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="nil" title="BREAK"> <rect x="525" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(537,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="540" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(567,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="585" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(597,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="614" y="15" width="29" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(641,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="659" y="15" width="44" height="69" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(701,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="718" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(730,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="748" y="15" width="14" height="69" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(760,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/decisions/schedule-option-two-afternoon-tracks.svg b/2022/decisions/schedule-option-two-afternoon-tracks.svg
new file mode 100644
index 00000000..8a8132b9
--- /dev/null
+++ b/2022/decisions/schedule-option-two-afternoon-tracks.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/" title="Saturday opening remarks"> <rect x="0" y="15" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="7" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="51" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(78,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org"> <rect x="111" y="15" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(123,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="140" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(167,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="nil" title="BREAK"> <rect x="185" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(197,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="200" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(212,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="229" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(241,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="259" y="15" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(301,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="nil" title="LUNCH"> <rect x="333" y="15" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(419,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="422" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(434,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="451" y="15" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(463,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs"> <rect x="481" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(508,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="525" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(552,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="nil" title="BREAK"> <rect x="585" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(597,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="600" y="15" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(627,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="644" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(671,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Saturday closing remarks"> <rect x="703" y="15" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(708,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Saturday closing remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="400" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(412,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs"> <rect x="429" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(441,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="459" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(471,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="nil" title="BREAK"> <rect x="488" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(500,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="503" y="50" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(530,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="562" y="50" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(604,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="637" y="50" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(679,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g> <g transform="translate(0,100)"> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/" title="Sunday opening remarks"> <rect x="0" y="15" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday opening remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="7" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(34,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="66" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(78,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="96" y="15" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(108,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="nil" title="BREAK"> <rect x="125" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(137,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="140" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(152,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="170" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(197,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction"> <rect x="229" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(256,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="288" y="15" width="14" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(300,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="nil" title="LUNCH"> <rect x="318" y="15" width="88" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(404,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> LUNCH</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="407" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(419,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers"> <rect x="437" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(464,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool"> <rect x="496" y="15" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(523,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="nil" title="BREAK"> <rect x="555" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="white"></rect> <g transform="translate(567,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> BREAK</text></g></a> <a href="https://emacsconf.org/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="570" y="15" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(612,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="644" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(656,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/" title="Sunday closing remarks"> <rect x="711" y="15" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(723,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> Sunday closing remarks</text></g></a> <a href="https://emacsconf.org/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="400" y="50" width="44" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(442,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="474" y="50" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(501,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev"> <rect x="533" y="50" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(538,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="555" y="50" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(560,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="577" y="50" width="14" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(589,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="607" y="50" width="29" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(634,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="666" y="50" width="29" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(693,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(88,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(177,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(266,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(355,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(444,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(533,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(622,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(711,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="darkgray" x="0" y="83" font-size="10" text-anchor="middle"> 5</text></g></g></svg> \ No newline at end of file
diff --git a/2022/draft-schedule.md b/2022/draft-schedule.md
new file mode 100644
index 00000000..b79784aa
--- /dev/null
+++ b/2022/draft-schedule.md
@@ -0,0 +1,53 @@
+This is a *DRAFT* schedule.
+<svg width="600" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="600" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sat</text> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <title> Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="6" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(29,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs"> <title> Back to school with Emacs</title> <rect x="56" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <title> How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="93" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(103,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <title> Writing and organizing literature notes for scientific writing</title> <rect x="143" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(166,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <title> Attending and organizing Emacs meetups</title> <rect x="300" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(310,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative"> <title> The Emacs Buddy initiative</title> <rect x="337" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(347,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <title> The ship that builds itself: How we used Emacs to develop a workshop for communities</title> <rect x="362" y="15" opacity="0.8" width="37" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(397,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas"> <title> Real estate and Org table formulas</title> <rect x="437" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <title> Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="475" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <title> Edit live Jupyter notebook cells with Emacs</title> <rect x="525" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(535,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <title> orgvm: a simple HTTP server for org</title> <rect x="562" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(572,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <title> Tree-sitter beyond syntax highlighting</title> <rect x="75" y="75" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(85,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <title> lsp-bridge: complete asynchronous LSP client</title> <rect x="100" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(123,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <title> asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="137" y="75" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(147,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <title> Emacs should become a Wayland compositor</title> <rect x="181" y="75" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(191,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <title> Using SQLite as a data source: a framework and an example</title> <rect x="300" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(323,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <title> Revisiting the anatomy of Emacs mail user agents</title> <rect x="356" y="75" opacity="0.8" width="37" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(391,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <title> Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="437" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev"> <title> Bidirectional links with eev</title> <rect x="493" y="75" opacity="0.8" width="6" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(497,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs"> <title> Short hyperlinks to Python docs</title> <rect x="512" y="75" opacity="0.8" width="6" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(516,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs"> <title> Haskell code exploration with Emacs</title> <rect x="531" y="75" opacity="0.8" width="37" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(566,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(75,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(150,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(225,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(375,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(450,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(525,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></svg>
+
+Jump to: <a href="#date-2022-12-03">Sat Dec 3</a> - <a href="#date-2022-12-04">Sun Dec 4</a><a name="date-2022-12-03"></a>
+# Saturday Dec 3, 2022
+<div class="schedule" data-start="2022-12-03T14:00:00+0000" data-end="2022-12-03T22:00:00+0000" data-tracks="General,Development">
+[[!template id=sched title="Emacs journalism (or everything's a nail if you hit it with Emacs)" url="/2022/talks/journalism" speakers="Alfred Zanini" q-and-a="live" track="General" slug="journalism" time="20" startutc="2022-12-03T14:05:00+0000" endutc="2022-12-03T14:25:00+0000" start="9:05" end="9:25"]]
+[[!template id=sched title="Back to school with Emacs" url="/2022/talks/school" speakers="Daniel Rösel" q-and-a="IRC" track="General" slug="school" time="20" startutc="2022-12-03T14:45:00+0000" endutc="2022-12-03T15:05:00+0000" start="9:45" end="10:05"]]
+[[!template id=sched title="Tree-sitter beyond syntax highlighting" url="/2022/talks/treesitter" speakers="Abin Simon" q-and-a="IRC" track="Development" slug="treesitter" time="10" startutc="2022-12-03T15:00:00+0000" endutc="2022-12-03T15:10:00+0000" start="10:00" end="10:10"]]
+[[!template id=sched title="How to incorporate handwritten notes into Emacs Orgmode" url="/2022/talks/handwritten" speakers="Bala Ramadurai" q-and-a="live" track="General" slug="handwritten" time="10" startutc="2022-12-03T15:15:00+0000" endutc="2022-12-03T15:25:00+0000" start="10:15" end="10:25"]]
+[[!template id=sched title="lsp-bridge: complete asynchronous LSP client" url="/2022/talks/lspbridge" speakers="Andy Stewart, Matthew Zeng" q-and-a="IRC" track="Development" slug="lspbridge" time="20" startutc="2022-12-03T15:20:00+0000" endutc="2022-12-03T15:40:00+0000" start="10:20" end="10:40"]]
+[[!template id=sched title="asm-blox: a game based on WebAssembly that no one asked for" url="/2022/talks/asmblox" speakers="Zachary Romero" q-and-a="live" track="Development" slug="asmblox" time="10" startutc="2022-12-03T15:50:00+0000" endutc="2022-12-03T16:00:00+0000" start="10:50" end="11:00"]]
+[[!template id=sched title="Writing and organizing literature notes for scientific writing" url="/2022/talks/science" speakers="Vidianos" q-and-a="live" track="General" slug="science" time="20" startutc="2022-12-03T15:55:00+0000" endutc="2022-12-03T16:15:00+0000" start="10:55" end="11:15"]]
+[[!template id=sched title="Emacs should become a Wayland compositor" url="/2022/talks/wayland" speakers="Michael Bauer" q-and-a="live" track="Development" slug="wayland" time="10" startutc="2022-12-03T16:25:00+0000" endutc="2022-12-03T16:35:00+0000" start="11:25" end="11:35"]]
+[[!template id=sched title="Attending and organizing Emacs meetups" url="/2022/talks/meetups" speakers="Bhavin Gandhi" q-and-a="live" track="General" slug="meetups" time="10" startutc="2022-12-03T18:00:00+0000" endutc="2022-12-03T18:10:00+0000" start="1:00" end="1:10"]]
+[[!template id=sched title="Using SQLite as a data source: a framework and an example" url="/2022/talks/sqlite" speakers="Andrew Hyatt" q-and-a="live" track="Development" slug="sqlite" time="20" startutc="2022-12-03T18:00:00+0000" endutc="2022-12-03T18:20:00+0000" start="1:00" end="1:20"]]
+[[!template id=sched title="The Emacs Buddy initiative" url="/2022/talks/buddy" speakers="Andrea" q-and-a="IRC" track="General" slug="buddy" time="10" startutc="2022-12-03T18:30:00+0000" endutc="2022-12-03T18:40:00+0000" start="1:30" end="1:40"]]
+[[!template id=sched title="Revisiting the anatomy of Emacs mail user agents" url="/2022/talks/mail" speakers="Mohsen BANAN" q-and-a="live" track="Development" slug="mail" time="30" startutc="2022-12-03T18:45:00+0000" endutc="2022-12-03T19:15:00+0000" start="1:45" end="2:15"]]
+[[!template id=sched title="The ship that builds itself: How we used Emacs to develop a workshop for communities" url="/2022/talks/community" speakers="Noorah Alhasan, Joseph Corneli, Leo Vivier" q-and-a="live" track="General" slug="community" time="30" startutc="2022-12-03T18:50:00+0000" endutc="2022-12-03T19:20:00+0000" start="1:50" end="2:20"]]
+[[!template id=sched title="Real estate and Org table formulas" url="/2022/talks/realestate" speakers="Daniel Gopar" q-and-a="pad" track="General" slug="realestate" time="20" startutc="2022-12-03T19:50:00+0000" endutc="2022-12-03T20:10:00+0000" start="2:50" end="3:10"]]
+[[!template id=sched title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" url="/2022/talks/maint" speakers="Sid Kasivajhula" q-and-a="live" track="Development" slug="maint" time="20" startutc="2022-12-03T19:50:00+0000" endutc="2022-12-03T20:10:00+0000" start="2:50" end="3:10"]]
+[[!template id=sched title="Health data journaling and visualization with Org Mode and GNUplot" url="/2022/talks/health" speakers="David O'Toole" q-and-a="live" track="General" slug="health" time="20" startutc="2022-12-03T20:20:00+0000" endutc="2022-12-03T20:40:00+0000" start="3:20" end="3:40"]]
+[[!template id=sched title="Bidirectional links with eev" url="/2022/talks/eev" speakers="Eduardo Ochs" q-and-a="IRC" track="Development" slug="eev" time="5" startutc="2022-12-03T20:35:00+0000" endutc="2022-12-03T20:40:00+0000" start="3:35" end="3:40"]]
+[[!template id=sched title="Short hyperlinks to Python docs" url="/2022/talks/python" speakers="Eduardo Ochs" q-and-a="IRC" track="Development" slug="python" time="5" startutc="2022-12-03T20:50:00+0000" endutc="2022-12-03T20:55:00+0000" start="3:50" end="3:55"]]
+[[!template id=sched title="Edit live Jupyter notebook cells with Emacs" url="/2022/talks/jupyter" speakers="Blaine Mooers" q-and-a="live" track="General" slug="jupyter" time="10" startutc="2022-12-03T21:00:00+0000" endutc="2022-12-03T21:10:00+0000" start="4:00" end="4:10"]]
+[[!template id=sched title="Haskell code exploration with Emacs" url="/2022/talks/haskell" speakers="Yuchen Pei" q-and-a="live" track="Development" slug="haskell" time="30" startutc="2022-12-03T21:05:00+0000" endutc="2022-12-03T21:35:00+0000" start="4:05" end="4:35"]]
+[[!template id=sched title="orgvm: a simple HTTP server for org" url="/2022/talks/orgvm" speakers="Corwin Brust" q-and-a="live" track="General" slug="orgvm" time="10" startutc="2022-12-03T21:30:00+0000" endutc="2022-12-03T21:40:00+0000" start="4:30" end="4:40"]]
+</div>
+
+<svg width="600" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="600" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sun</text> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <title> Results of the 2022 Emacs Survey</title> <rect x="6" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(29,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org"> <title> This Year in Org</title> <rect x="43" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(53,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <title> Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="75" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(98,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <title> Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="125" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(135,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <title> Linking personal info with Hyperbole implicit buttons</title> <rect x="162" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(172,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <title> Powerful productivity with Hyperbole and Org Mode</title> <rect x="300" y="15" opacity="0.8" width="37" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(335,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers"> <title> Org workflows for developers</title> <rect x="362" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(385,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers"> <title> GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="412" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(435,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <title> Putting Org Mode on the Indieweb</title> <rect x="475" y="15" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <title> Fanfare for the Common Emacs User</title> <rect x="525" y="15" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(535,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction"> <title> rde Emacs introduction</title> <rect x="75" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(98,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs"> <title> justl: Driving recipes within Emacs</title> <rect x="131" y="75" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(141,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <title> Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="156" y="75" opacity="0.8" width="37" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(191,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs"> <title> Getting detached from Emacs</title> <rect x="300" y="75" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(310,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <title> Top 10 reasons why you should be using Eshell</title> <rect x="343" y="75" opacity="0.8" width="12" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(353,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool"> <title> Emacs was async before async was cool</title> <rect x="387" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(410,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus"> <title> The Wheels on D-Bus</title> <rect x="456" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(479,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs"> <title> Pre-localizing Emacs</title> <rect x="525" y="75" opacity="0.8" width="25" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(548,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(75,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(150,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(225,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(375,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(450,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(525,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></svg>
+
+Jump to: <a href="#date-2022-12-03">Sat Dec 3</a> - <a href="#date-2022-12-04">Sun Dec 4</a><a name="date-2022-12-04"></a>
+# Sunday Dec 4, 2022
+<div class="schedule" data-start="2022-12-04T14:00:00+0000" data-end="2022-12-04T22:00:00+0000" data-tracks="General,Development">
+[[!template id=sched title="Results of the 2022 Emacs Survey" url="/2022/talks/survey" speakers="Timothy" q-and-a="IRC" track="General" slug="survey" time="20" startutc="2022-12-04T14:05:00+0000" endutc="2022-12-04T14:25:00+0000" start="9:05" end="9:25"]]
+[[!template id=sched title="This Year in Org" url="/2022/talks/orgyear" speakers="Timothy" q-and-a="IRC" track="General" slug="orgyear" time="10" startutc="2022-12-04T14:35:00+0000" endutc="2022-12-04T14:45:00+0000" start="9:35" end="9:45"]]
+[[!template id=sched title="Build a Zettelkasten with the Hyperbole Rolodex" url="/2022/talks/rolodex" speakers="Ramin Honary" q-and-a="IRC" track="General" slug="rolodex" time="20" startutc="2022-12-04T15:00:00+0000" endutc="2022-12-04T15:20:00+0000" start="10:00" end="10:20"]]
+[[!template id=sched title="rde Emacs introduction" url="/2022/talks/rde" speakers="Andrew Tropin" q-and-a="live" track="Development" slug="rde" time="20" startutc="2022-12-04T15:00:00+0000" endutc="2022-12-04T15:20:00+0000" start="10:00" end="10:20"]]
+[[!template id=sched title="Linking headings with org-super-links (poor-man's Zettelkasten)" url="/2022/talks/orgsuperlinks" speakers="Karl Voit" q-and-a="live" track="General" slug="orgsuperlinks" time="10" startutc="2022-12-04T15:40:00+0000" endutc="2022-12-04T15:50:00+0000" start="10:40" end="10:50"]]
+[[!template id=sched title="justl: Driving recipes within Emacs" url="/2022/talks/justl" speakers="Sibi Prabakaran" q-and-a="IRC" track="Development" slug="justl" time="10" startutc="2022-12-04T15:45:00+0000" endutc="2022-12-04T15:55:00+0000" start="10:45" end="10:55"]]
+[[!template id=sched title="Elisp and the TRAMP: How to NOT write code you don't have to" url="/2022/talks/tramp" speakers="Grant Shangreaux" q-and-a="live" track="Development" slug="tramp" time="30" startutc="2022-12-04T16:05:00+0000" endutc="2022-12-04T16:35:00+0000" start="11:05" end="11:35"]]
+[[!template id=sched title="Linking personal info with Hyperbole implicit buttons" url="/2022/talks/buttons" speakers="Mats Lidell" q-and-a="live" track="General" slug="buttons" time="10" startutc="2022-12-04T16:10:00+0000" endutc="2022-12-04T16:20:00+0000" start="11:10" end="11:20"]]
+[[!template id=sched title="Powerful productivity with Hyperbole and Org Mode" url="/2022/talks/hyperorg" speakers="Robert Weiner" q-and-a="live" track="General" slug="hyperorg" time="30" startutc="2022-12-04T18:00:00+0000" endutc="2022-12-04T18:30:00+0000" start="1:00" end="1:30"]]
+[[!template id=sched title="Getting detached from Emacs" url="/2022/talks/detached" speakers="Niklas Eklund" q-and-a="live" track="Development" slug="detached" time="10" startutc="2022-12-04T18:00:00+0000" endutc="2022-12-04T18:10:00+0000" start="1:00" end="1:10"]]
+[[!template id=sched title="Top 10 reasons why you should be using Eshell" url="/2022/talks/eshell" speakers="Howard Abrams" q-and-a="live" track="Development" slug="eshell" time="10" startutc="2022-12-04T18:35:00+0000" endutc="2022-12-04T18:45:00+0000" start="1:35" end="1:45"]]
+[[!template id=sched title="Org workflows for developers" url="/2022/talks/workflows" speakers="George Mauer" q-and-a="live" track="General" slug="workflows" time="20" startutc="2022-12-04T18:50:00+0000" endutc="2022-12-04T19:10:00+0000" start="1:50" end="2:10"]]
+[[!template id=sched title="Emacs was async before async was cool" url="/2022/talks/async" speakers="Michael Herstine" q-and-a="live" track="Development" slug="async" time="20" startutc="2022-12-04T19:10:00+0000" endutc="2022-12-04T19:30:00+0000" start="2:10" end="2:30"]]
+[[!template id=sched title="GRAIL---A Generalized Representation and Aggregation of Information Layers" url="/2022/talks/grail" speakers="Sameer Pradhan" q-and-a="live" track="General" slug="grail" time="20" startutc="2022-12-04T19:30:00+0000" endutc="2022-12-04T19:50:00+0000" start="2:30" end="2:50"]]
+[[!template id=sched title="The Wheels on D-Bus" url="/2022/talks/dbus" speakers="Ian Eure" q-and-a="live" track="Development" slug="dbus" time="20" startutc="2022-12-04T20:05:00+0000" endutc="2022-12-04T20:25:00+0000" start="3:05" end="3:25"]]
+[[!template id=sched title="Putting Org Mode on the Indieweb" url="/2022/talks/indieweb" speakers="Michael Herstine" q-and-a="live" track="General" slug="indieweb" time="20" startutc="2022-12-04T20:20:00+0000" endutc="2022-12-04T20:40:00+0000" start="3:20" end="3:40"]]
+[[!template id=sched title="Fanfare for the Common Emacs User" url="/2022/talks/fanfare" speakers="John Cummings" q-and-a="live" track="General" slug="fanfare" time="10" startutc="2022-12-04T21:00:00+0000" endutc="2022-12-04T21:10:00+0000" start="4:00" end="4:10"]]
+[[!template id=sched title="Pre-localizing Emacs" url="/2022/talks/localizing" speakers="Jean-Christophe Helary" q-and-a="live" track="Development" slug="localizing" time="20" startutc="2022-12-04T21:00:00+0000" endutc="2022-12-04T21:20:00+0000" start="4:00" end="4:20"]]
+<div class="cancelled">Cancelled:<ul><li>Emacs News highlights - Sacha Chua</li></ul></div></div> \ No newline at end of file
diff --git a/2022/ideas.md b/2022/ideas.md
new file mode 100644
index 00000000..adca52ba
--- /dev/null
+++ b/2022/ideas.md
@@ -0,0 +1,13 @@
+[[!meta title="Ideas"]]
+[[!meta copyright="Copyright &copy; 2020, 2021, 2022 Amin Bandali"]]
+
+This is _the_ place to collect ideas for talks and other sessions for
+EmacsConf 2022. :-)
+
+Be sure to check out the ideas from previous years as well:
+[[2021|2021/ideas]], [[2020|2020/ideas]], [[2019|2019/ideas]],
+[[2015|2015/ideas]].
+
+## Ideas
+
+### _Add your idea here!_
diff --git a/2022/info/asmblox-after.md b/2022/info/asmblox-after.md
new file mode 100644
index 00000000..e1ce67d3
--- /dev/null
+++ b/2022/info/asmblox-after.md
@@ -0,0 +1,306 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="asmblox-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hi, I'm Zach and today I'll be giving""" start="00:00:00.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""a presentation on asm-blox,""" start="00:00:03.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""a programming game inspired by WebAssembly.""" start="00:00:05.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So programming games came into prominence""" start="00:00:08.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""about a decade ago and are loved for providing""" start="00:00:10.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""interesting programming challenges""" start="00:00:13.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""without all the messiness of real world programming.""" start="00:00:14.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""I wanted to make a programming game""" start="00:00:17.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and I decided to base it off of TIS-100,""" start="00:00:19.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""having a pretty basic UI.""" start="00:00:24.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It seemed pretty doable in Emacs.""" start="00:00:28.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""TIS 100 is a programming game""" start="00:00:30.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""where you write a fictional assembly language""" start="00:00:33.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""into a grid of cells which can each""" start="00:00:35.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""communicate with one another,""" start="00:00:37.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""you're tasked with solving""" start="00:00:39.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""fairly simple CS 101 like problems.""" start="00:00:41.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""To mix things up a bit I decided to base""" start="00:00:44.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the language of asm-blox off of""" start="00:00:48.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""WebAssembly, which is stack based,""" start="00:00:49.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""as opposed to TIS-100 which is registered based.""" start="00:00:52.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here you can see the same program""" start="00:00:55.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""written in the game TIS-100,""" start="00:00:59.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""what it looks like in asm-blox,""" start="00:01:01.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and the original WebAssembly that it's based off of.""" start="00:01:03.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""With that said, let's get into a demo.""" start="00:01:08.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This is the game board.""" start="00:01:10.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It's a 4 by 3 grid.""" start="00:01:12.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Each cell has a stack of size 4.""" start="00:01:14.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""First off, I'll show some of the stack editing commands.""" start="00:01:16.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can add a value with the const function.""" start="00:01:20.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here we're adding two values to this stack""" start="00:01:23.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""to get added, and eventually the stack gets overflowed.""" start="00:01:27.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can fix that as follows with the clear command,""" start="00:01:33.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""so that clears the stack.""" start="00:01:37.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can duplicate values on the stack.""" start="00:01:40.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This duplicates the item at the bottom of the stack.""" start="00:01:43.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""10 gets put on, 20 gets put on,""" start="00:01:45.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""then 10 will get duplicated""" start="00:01:48.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and put on the top of the stack.""" start="00:01:50.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can increment. For example, this increments""" start="00:01:52.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the second to bottom, the second to bottom""" start="00:01:55.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""from the stack.""" start="00:01:58.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So 10, 20, increment that, clear.""" start="00:01:59.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""That's basic stack operations.""" start="00:02:04.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Next up, we have numeric commands.""" start="00:02:07.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""For example, here, if we add &quot;add&quot;,""" start="00:02:11.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it pops two values off the stack,""" start="00:02:12.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""adds them, and pushes the result on.""" start="00:02:14.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Another way we can write this is as follows.""" start="00:02:17.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can have the add here""" start="00:02:20.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then nest the two constants,""" start="00:02:22.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then this does the same thing.""" start="00:02:26.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""First, the inner constant operations run,""" start="00:02:28.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then the outer add operation runs.""" start="00:02:31.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can nest as deeply as we want.""" start="00:02:35.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""There's also subtraction, multiplication, and whatnot.""" start="00:02:40.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Next up are Boolean operations.""" start="00:02:44.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Zero counts as true.""" start="00:02:46.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Anything else--sorry, zero counts as false.""" start="00:02:49.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Anything else is true.""" start="00:02:51.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""For example, this would give us false and true,""" start="00:02:52.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""so that result should be false.""" start="00:03:01.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Zero gets put on the stack,""" start="00:03:04.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""one gets put on, and then the &quot;and&quot; operation.""" start="00:03:06.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So there's also or, not,""" start="00:03:08.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and various numerical comparison operations""" start="00:03:12.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""like greater than and less than.""" start="00:03:17.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Next up are the port operations.""" start="00:03:21.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can send values to other cells as follows.""" start="00:03:22.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here we create a value""" start="00:03:27.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then send it right.""" start="00:03:29.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Let's run this.""" start="00:03:33.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The 10 goes on the stack,""" start="00:03:35.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then it gets sent to the right.""" start="00:03:37.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here it's waiting for this cell to pick it up.""" start="00:03:38.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It can pick it up just as follows.""" start="00:03:41.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So left... and then why don't we have it""" start="00:03:44.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""drop that value after it gets it.""" start="00:03:47.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So the 10 gets sent to the right.""" start="00:03:49.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This one picks it up and drops it.""" start="00:03:53.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Lastly, we have control flow,""" start="00:04:00.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""which is a bit tricky,""" start="00:04:03.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""but with this visual,""" start="00:04:04.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it helps explain it.""" start="00:04:06.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""There are two block constructs, &quot;block&quot; and &quot;loop&quot;,""" start="00:04:08.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and there's two jumping constructs, &quot;br&quot; and &quot;brif&quot;.""" start="00:04:12.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So if &quot;loop&quot; is jumped to,""" start="00:04:16.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the control flow goes to the beginning,""" start="00:04:23.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the top of the loop.""" start="00:04:25.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""If a block is jumped to,""" start="00:04:26.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it goes to the end of the block,""" start="00:04:28.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and these various blocks""" start="00:04:31.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""are identified by their level of nestedness.""" start="00:04:33.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""From the point of view of this jump statement,""" start="00:04:36.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""this &quot;br&quot; statement, this is block level 0,""" start="00:04:40.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""this is 1, this is 2.""" start="00:04:45.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So here, &quot;br 1&quot; would be referring to this loop.""" start="00:04:46.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""What this [br 1] would do is,""" start="00:04:49.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it would jump to this loop right here.""" start="00:04:51.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""If we were to do this [br 2], what this would do is,""" start="00:04:54.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""this would jump past this block right here.""" start="00:04:57.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So as another example, this right here,""" start="00:05:02.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""this is a loop that generates increasing numbers.""" start="00:05:09.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Let's see. Next up, we have modules.""" start="00:05:15.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This is an example of a stack module.""" start="00:05:22.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""In addition to stack, there's also heaps.""" start="00:05:26.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""What this does is it allows us to create""" start="00:05:28.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""an extra stack that we can push and pop items onto.""" start="00:05:34.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This one can have as large size as we need.""" start="00:05:38.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here it has a size of 20.""" start="00:05:41.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It's taking values from up""" start="00:05:43.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and exposing those values on the left.""" start="00:05:46.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This loop right here, it generates numbers,""" start="00:05:51.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and it's putting them onto the stack.""" start="00:05:57.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We can see here that those numbers""" start="00:05:59.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""are being exposed to this cell right here.""" start="00:06:00.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It's just taking values, and eventually,""" start="00:06:03.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it's going to overflow and cause an error.""" start="00:06:07.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""That finishes the basic commands.""" start="00:06:11.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Why don't we try solving this puzzle.""" start="00:06:14.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The puzzle description is right here.""" start="00:06:16.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We want to read a value from I.""" start="00:06:21.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Send 1 to G if I is greater than 0.""" start="00:06:23.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Send 1 to E if it's equal to 0.""" start="00:06:28.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Send 1 to L if it's less than 0.""" start="00:06:30.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""And then all the other ones, we send 0 to.""" start="00:06:32.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""First things first, let's send the value we get""" start="00:06:35.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""from the input down as follows.""" start="00:06:40.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Let's send that value right.""" start="00:06:44.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""You get from up.""" start="00:06:49.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Okay. So next, we're getting a value on the left.""" start="00:06:51.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Now we want to compare if this number is greater than 0.""" start="00:06:54.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""If it's greater than 0, we send 1 to G.""" start="00:06:58.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Let's perform the greater than operation""" start="00:06:59.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""on that item we just got, and we're comparing it to 0.""" start="00:07:03.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Now that result, we're going to send down,""" start="00:07:08.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and we're going to send this original value""" start="00:07:11.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""we got from here to the right.""" start="00:07:13.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here, we do a similar step.""" start="00:07:16.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We get the value from the left,""" start="00:07:19.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""but this time, we have to do an equal operation.""" start="00:07:20.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Is that number we got equal to 0?""" start="00:07:22.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We send that result down,""" start="00:07:25.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then send this number to the right.""" start="00:07:28.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Lastly, we get this number from the left.""" start="00:07:32.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here, we need to compare if it's less than 0.""" start="00:07:38.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We send that result down,""" start="00:07:42.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and now lastly, we drop that remaining value.""" start="00:07:45.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Okay, let's--oh, and then lastly,""" start="00:07:50.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""we need to send down the value we get up.""" start="00:07:53.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Send down, up, send down, up.""" start="00:07:56.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Okay, so let's try running this.""" start="00:08:02.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Let's see. We notice that""" start="00:08:04.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the numbers are coming in from I.""" start="00:08:08.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""They're going through our various conditions""" start="00:08:10.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and should be sending all the correct values.""" start="00:08:14.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It looks like we're not getting any errors so far.""" start="00:08:18.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Let's speed this up.""" start="00:08:23.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""That completes the puzzle.""" start="00:08:26.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Now let's get into some of the implementation details.""" start="00:08:33.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The first thing is the game loop.""" start="00:08:42.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The game loop is... So this is actually extremely simple.""" start="00:08:46.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""All the state for the entire game""" start="00:08:50.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""is stored in just a few variables.""" start="00:08:52.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""There's one variable storing""" start="00:08:54.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the text of each cell as a vector of strings.""" start="00:08:56.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""There's a single function""" start="00:09:01.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""that renders the entire game, the entire board.""" start="00:09:06.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""There's a single function that would render""" start="00:09:09.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""this entire screen based off of the state,""" start="00:09:11.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then the game waits for you to press a key.""" start="00:09:13.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The key usually, depending on what action you perform,""" start="00:09:19.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""updates the state and causes a re-render.""" start="00:09:24.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It's an extremely simple game loop,""" start="00:09:27.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""but it makes implementing it pretty easy.""" start="00:09:29.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""To demonstrate how this game loop works,""" start="00:09:32.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""I have a simple demo prepared.""" start="00:09:35.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This is a game of tic-tac-toe.""" start="00:09:38.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Let me show this real fast.""" start="00:09:41.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It's an extremely simple implementation,""" start="00:09:44.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""but it follows the same principles""" start="00:09:49.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""that I used in asm-blox.""" start="00:09:51.466" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""First, we have the state defined in variables.""" start="00:09:53.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Here we have two pieces of state.""" start="00:09:57.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We have which player's turn it is""" start="00:09:59.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and the state of the game board.""" start="00:10:01.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The player turn can be nil if it's empty,""" start="00:10:03.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the string &quot;x&quot; or the string &quot;o&quot;.""" start="00:10:06.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Then the game board is a list of nine board elements.""" start="00:10:08.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So that's the state.""" start="00:10:14.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Then we have a helper function.""" start="00:10:16.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""You can go into the details,""" start="00:10:18.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""but it just returns true""" start="00:10:19.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""if the board has a winning player.""" start="00:10:21.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Part two is the rendering function.""" start="00:10:25.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Only based off of the game state,""" start="00:10:30.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""we have a function that erases the buffer""" start="00:10:32.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and draws this from scratch.""" start="00:10:36.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""That's this part right here.""" start="00:10:40.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Lastly, we have the action.""" start="00:10:45.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""We have one action which is bound to RET,""" start="00:10:46.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and it places a player token.""" start="00:10:51.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Once it places a player token,""" start="00:10:55.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it rerenders the board,""" start="00:10:59.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and all the rerendering is handled by this function.""" start="00:11:03.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Then we have just creating of the mode""" start="00:11:06.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and initialization function.""" start="00:11:12.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""With these three steps""" start="00:11:14.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it clearly separates out all of the state,""" start="00:11:16.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""the rendering, and the actions,""" start="00:11:20.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and it makes implementing it very simple.""" start="00:11:22.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""One trick that's used here and that I use""" start="00:11:25.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""in my asm-blox game is that""" start="00:11:29.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""when I render the board,""" start="00:11:32.383" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""I propertize the text to contain extra information.""" start="00:11:33.317" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""For example, here, each cell has""" start="00:11:40.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""a tic-tac-toe index to indicate which number cell it is.""" start="00:11:45.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""This has index 0, 1, 2, all the way up to 8.""" start="00:11:49.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""That way, for placing, the only thing it has to do""" start="00:11:53.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""is just look at its position""" start="00:11:58.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""based off of the text property.""" start="00:12:01.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It makes implementation extremely simple.""" start="00:12:04.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Next up, we have the implementation of the code cells.""" start="00:12:07.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""If you notice, here it's kind of weird""" start="00:12:14.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""how it's like a buffer, but each cell kind of acts""" start="00:12:16.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""like its own buffer, and it has its own limits.""" start="00:12:21.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""All of the Emacs editing--""" start="00:12:25.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""well, some of the Emacs editing commands kind of work,""" start="00:12:27.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""like beginning-of-line, end-of-line, end-of-buffer.""" start="00:12:30.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""How is that done?""" start="00:12:35.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Well, it's all just a trick, actually.""" start="00:12:38.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Each cell has text properties of which line it's at""" start="00:12:41.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and its cell coordinates.""" start="00:12:47.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Whenever a key is pressed for editing, moving lines--""" start="00:12:48.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""there's even kind of more complicated things""" start="00:12:54.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""like switching cells around--""" start="00:12:58.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""so all of that,""" start="00:13:00.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it knows which position it's in,""" start="00:13:03.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it knows what cell it's in,""" start="00:13:05.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then it copies the text of the cell,""" start="00:13:08.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""because remember, the contents of the cell""" start="00:13:12.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""are stored in internal state.""" start="00:13:16.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It copies that cell contents into a temporary buffer.""" start="00:13:18.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It then moves the point to whichever line it was""" start="00:13:23.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""in the game board.""" start="00:13:27.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It performs the action.""" start="00:13:31.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It makes sure that the resulting text isn't""" start="00:13:33.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""longer than the cell width or the cell height.""" start="00:13:36.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""If everything checks out,""" start="00:13:40.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""it updates the state and calls a re-render.""" start="00:13:42.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So there's nothing going on in here""" start="00:13:45.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""that's, like, actually inserting a letter A.""" start="00:13:48.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It's all updating the state and causing a re-render.""" start="00:13:51.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""So this makes things like certain""" start="00:14:00.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""internal Emacs editing constructs""" start="00:14:03.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""pretty hard to use, like undoing.""" start="00:14:06.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Normally the undoing construct""" start="00:14:09.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""works off the contents of the buffer.""" start="00:14:12.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""But if your buffer is actually just""" start="00:14:15.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""a reflection of the internal state,""" start="00:14:17.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""then how does undoing work?""" start="00:14:20.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Well, it pretty much is kind of a hack.""" start="00:14:21.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""I mean, undoing is here,""" start="00:14:24.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""but it's pretty much redone""" start="00:14:27.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""in a not so configurable, not so modifiable way.""" start="00:14:32.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Pretty much everything is like that,""" start="00:14:37.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""from these parentheses highlighting...""" start="00:14:40.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Normally, parentheses highlighting""" start="00:14:42.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""would be kind of weird,""" start="00:14:46.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""with cross-line parentheses and everything.""" start="00:14:47.244" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""All of that had to be redone.""" start="00:14:49.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="""Another point about how this is implemented""" start="00:14:52.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""is the assembly text to executable code.""" start="00:14:58.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""If you're familiar with WebAssembly""" start="00:15:02.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""you might have encountered a tool wat-wasm.""" start="00:15:05.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It basically converts the WebAssembly text format""" start="00:15:10.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""to byte code.""" start="00:15:16.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""And what I do here... It goes through a similar process.""" start="00:15:18.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Normally, when you're writing this text format,""" start="00:15:22.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""you can nest things as deeply as you want.""" start="00:15:28.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Basically, what happens is it flattens out everything.""" start="00:15:30.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It kind of knows the order""" start="00:15:33.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""that all these things are going to get executed,""" start="00:15:35.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and then it puts it into one single line""" start="00:15:38.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""that it can just run through and execute.""" start="00:15:40.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""The same thing for the loops and blocks.""" start="00:15:44.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""It internally generates labels and jump statements.""" start="00:15:48.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""So that concludes this presentation.""" start="00:15:52.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""Thank you for listening,""" start="00:15:58.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="""and I hope you enjoy the rest of the conference.""" start="00:15:59.667" video="mainVideo-asmblox" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [zacromero@posteo.net](mailto:zacromero@posteo.net?subject=Comment%20for%20EmacsConf%202022%20asmblox%3A%20asm-blox%3A%20a%20game%20based%20on%20WebAssembly%20that%20no%20one%20asked%20for)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/asmblox-before.md b/2022/info/asmblox-before.md
new file mode 100644
index 00000000..d8c509ff
--- /dev/null
+++ b/2022/info/asmblox-before.md
@@ -0,0 +1,44 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Zachary Romero shares a game he wrote and how he made it. Afterwards, he will handle questions over BigBlueButton.
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="asmblox-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="asmblox-mainVideo" data="""
+00:00.000 Introduction
+00:30.680 TIS-100
+00:44.960 WebAssembly
+01:08.040 Basic stack operations
+02:07.640 Numeric commands
+02:44.680 Boolean operations
+03:21.400 Port operations
+04:00.240 Control flow
+05:15.720 Modules
+06:14.480 Puzzle
+08:33.040 The game loop
+09:35.200 Tic-tac-toe
+11:25.880 Text properties
+12:07.800 Code cells
+14:00.920 Undo
+14:37.560 Parentheses
+14:52.360 Assembly text to executable code
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.webm">Download --main.webm (238MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/rfZ2V1DZNgpMh18gKrsXmY">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="asmblox-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="asmblox-qanda" data="""
+00:00.000 Introduction
+01:12.600 Why did you choose an internal state versus many 'state buffers'?
+02:10.720 Do you have plans to port shenzhen.io to Emacs?
+02:29.960 Did this use WASM?
+02:59.800 Why wasm rather than a more traditional Assembly dialect? It wouldn't be harder to implement, right?
+05:08.960 Any next projects on your mind?
+05:52.680 Does this work with any other paren-based editing packages?
+06:46.920 What kind of tool could use this idea?
+07:56.280 How did you go about designing the puzzles?
+08:39.320 What are your favorite changes in the upcoming Emacs 29?
+09:07.480 Are there tools to add more puzzles?
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.webm">Download --answers.webm (24MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--answers--chapters.vtt">Download --answers--chapters.vtt</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/asmblox-nav.md b/2022/info/asmblox-nav.md
new file mode 100644
index 00000000..f28a2155
--- /dev/null
+++ b/2022/info/asmblox-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/science">Writing and organizing literature notes for scientific writing</a>
+Next by track: <a href="/2022/talks/buddy">The Emacs Buddy initiative</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/async-after.md b/2022/info/async-after.md
new file mode 100644
index 00000000..28a74f96
--- /dev/null
+++ b/2022/info/async-after.md
@@ -0,0 +1,396 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="async-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hey everyone. I'm Michael,""" start="00:00:00.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and I'm going to be talking to you today""" start="00:00:02.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""about asynchronous programming in Emacs Lisp.""" start="00:00:04.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I'm located in the San Francisco Bay Area,""" start="00:00:07.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""where I'm a developer as well as""" start="00:00:10.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a long time Emacs user.""" start="00:00:11.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""You may have heard of async""" start="00:00:14.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""or asynchronous programming.""" start="00:00:15.981" video="mainVideo-async" id="subtitle"]]
+[[!template text="""The idea has been around for decades,""" start="00:00:18.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""but it first gained widespread attention""" start="00:00:20.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in JavaScript back in the aughts.""" start="00:00:23.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And in the teens it gained tremendous popularity""" start="00:00:26.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in the DevOps world with Go lang.""" start="00:00:29.521" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And just in the last few years,""" start="00:00:31.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""support for async programming has landed in Rust.""" start="00:00:33.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Well, it can be done in Emacs as well,""" start="00:00:37.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and this talk will demonstrate that""" start="00:00:40.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""by walking you through a little problem""" start="00:00:42.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that I actually solved for myself.""" start="00:00:44.600" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""Like a lot of these stories,""" start="00:00:47.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it begins with scratching a personal itch.""" start="00:00:49.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""In my case, automating my music server.""" start="00:00:51.920" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I use something called the Music Player Daemon""" start="00:00:55.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""locally, and as the name suggests,""" start="00:00:57.537" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it just kind of hangs out in the background.""" start="00:01:00.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Reads music files,""" start="00:01:03.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and talks to assorted sound drivers.""" start="00:01:04.771" video="mainVideo-async" id="subtitle"]]
+[[!template text="""In fact, it is so focused on""" start="00:01:08.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that mission that it doesn't even offer""" start="00:01:09.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a user interface.""" start="00:01:11.354" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Instead, it serves an API""" start="00:01:12.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and invites application developers""" start="00:01:14.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to build clients on top of that API.""" start="00:01:16.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, so let's hop into a vterm,""" start="00:01:19.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and I'd like to show you the MPD client I use""" start="00:01:22.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""for my daily driver, something called NCMP CPP.""" start="00:01:25.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Doesn't exactly roll off the tongue,""" start="00:01:29.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""but I've got a playlist,""" start="00:01:31.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I can browse the file system,""" start="00:01:33.461" video="mainVideo-async" id="subtitle"]]
+[[!template text="""looks like I can search my music library,""" start="00:01:36.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""yada yada yada.""" start="00:01:39.344" video="mainVideo-async" id="subtitle"]]
+[[!template text="""It's got all the basic features.""" start="00:01:40.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""The point that I want to make is that""" start="00:01:42.560" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""NCMP CPP is a completely independent project""" start="00:01:44.854" video="mainVideo-async" id="subtitle"]]
+[[!template text="""of MPD, separate and distinct.""" start="00:01:50.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""It does all of its work by simply communicating""" start="00:01:53.680" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with the Music Player Demon over the API.""" start="00:01:57.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Well, I wanted to program to that API""" start="00:02:01.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""only from within Emacs.""" start="00:02:03.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Now, there are already Emacs MPD clients out there,""" start="00:02:05.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""but I didn't really want a full-blown client.""" start="00:02:09.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I just wanted a few small tweaks""" start="00:02:11.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""over my current configuration.""" start="00:02:14.137" video="mainVideo-async" id="subtitle"]]
+[[!template text="""A command to skip to the next song.""" start="00:02:16.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Maybe shove the current track into the mode line.""" start="00:02:19.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Things like this.""" start="00:02:22.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I needed an Elisp API that would let me do this.""" start="00:02:24.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, well, let's get out of ncmpcpp,""" start="00:02:28.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and let's get into a netcat session""" start="00:02:32.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with my local MPD server.""" start="00:02:37.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""As you can see, we get a welcome string.""" start="00:02:39.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, it is a server goes first protocol.""" start="00:02:43.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""But after that it's a very familiar""" start="00:02:46.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""text based request response oriented protocol.""" start="00:02:49.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I can ask for the volume.""" start="00:02:53.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I can ask for the status.""" start="00:02:56.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""But in particular I wanted an asynchronous API.""" start="00:02:58.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""If I issue a command like""" start="00:03:06.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""find every track in my library,""" start="00:03:07.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that's going to produce a lot of data.""" start="00:03:11.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""That's a human perceptible pause""" start="00:03:15.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""as Emacs processes all the input.""" start="00:03:18.920" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""What I wanted was a style of programming""" start="00:03:22.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""where I could fire off my command,""" start="00:03:25.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""have the Emacs command loop keep working,""" start="00:03:28.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and only invoke some callback""" start="00:03:31.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""when there was data available.""" start="00:03:33.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Well, Emacs is famously single threaded,""" start="00:03:35.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""so it shouldn't come as a surprise that it offers""" start="00:03:38.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a rich set of primitives that enable the sort of""" start="00:03:42.221" video="mainVideo-async" id="subtitle"]]
+[[!template text="""network programming that I wanted to do.""" start="00:03:45.654" video="mainVideo-async" id="subtitle"]]
+[[!template text="""In particular, it offers""" start="00:03:48.271" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a function called `make-network-process`.""" start="00:03:50.671" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Now this method offers""" start="00:03:53.404" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a bewildering variety of options,""" start="00:03:54.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""but at the heart of the matter""" start="00:03:57.721" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it opens a network connection""" start="00:03:59.487" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to some endpoint out there,""" start="00:04:01.054" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and we can configure it to be non-blocking.""" start="00:04:02.687" video="mainVideo-async" id="subtitle"]]
+[[!template text="""It returns a handle that you can use to refer""" start="00:04:06.104" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to this network connection with other methods.""" start="00:04:10.421" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Other methods such as `process-send-string`,""" start="00:04:13.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""which as the name suggests,""" start="00:04:17.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""allows you to send textual data""" start="00:04:19.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to the remote endpoint of your network connection.""" start="00:04:21.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""You can also use it with `set-process-filter`,""" start="00:04:26.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""which allows you to associate a callback""" start="00:04:29.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with your network connection.""" start="00:04:32.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""That callback will be invoked""" start="00:04:33.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""when there is data available""" start="00:04:35.920" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in the process's read buffer.""" start="00:04:37.804" video="mainVideo-async" id="subtitle"]]
+[[!template text="""In other words,""" start="00:04:40.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in a request response oriented protocol""" start="00:04:41.254" video="mainVideo-async" id="subtitle"]]
+[[!template text="""like that of MPD, you open your socket""" start="00:04:44.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with `make-network-process`,""" start="00:04:47.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""send your request via `process-send-string`""" start="00:04:50.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and life will just continue in Emacs""" start="00:04:53.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""until some data shows up""" start="00:04:56.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in the process's read buffer,""" start="00:04:57.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""at which point your callback will be invoked.""" start="00:05:00.720" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""It turns out this was enough""" start="00:05:05.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""for a purpose built async runtime.""" start="00:05:07.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Let's work through the sequence of events""" start="00:05:12.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""when opening a connection""" start="00:05:14.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and firing off a few commands in this style.""" start="00:05:16.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, let's imagine a library""" start="00:05:18.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that offers a connection object of some sort,""" start="00:05:22.887" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a caller, and an MPD server out on the network.""" start="00:05:25.767" video="mainVideo-async" id="subtitle"]]
+[[!template text="""The caller will presumably get themselves""" start="00:05:29.487" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a connection object by invoking some sort""" start="00:05:31.807" video="mainVideo-async" id="subtitle"]]
+[[!template text="""of connect method on our library.""" start="00:05:34.954" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We can handle this through `make-network-process`,""" start="00:05:38.327" video="mainVideo-async" id="subtitle"]]
+[[!template text="""but we're going to invoke `make-network-process`""" start="00:05:41.047" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with nowait equal to true,""" start="00:05:45.487" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in other words asynchronously.""" start="00:05:47.167" video="mainVideo-async" id="subtitle"]]
+[[!template text="""That means the method is going to return immediately.""" start="00:05:50.567" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We won't even know if the connection is up,""" start="00:05:52.927" video="mainVideo-async" id="subtitle"]]
+[[!template text="""let alone what the response would be.""" start="00:05:56.327" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""This has some implications.""" start="00:05:59.247" video="mainVideo-async" id="subtitle"]]
+[[!template text="""At this point we've returned control to the caller,""" start="00:06:01.807" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the Emacs event loop is proceeding""" start="00:06:05.247" video="mainVideo-async" id="subtitle"]]
+[[!template text="""quite happily, and so the caller is free""" start="00:06:08.247" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to start using our connection object.""" start="00:06:11.304" video="mainVideo-async" id="subtitle"]]
+[[!template text="""They might say issue a status command.""" start="00:06:15.047" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, well, in our library""" start="00:06:18.367" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we don't have a connection yet.""" start="00:06:20.248" video="mainVideo-async" id="subtitle"]]
+[[!template text="""How on earth are we going to service this?""" start="00:06:22.887" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Well, we can simply give ourselves a queue""" start="00:06:26.607" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and note down the fact that""" start="00:06:29.807" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we owe a status command.""" start="00:06:31.820" video="mainVideo-async" id="subtitle"]]
+[[!template text="""That's pretty quick.""" start="00:06:34.567" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We've now returned control back to our caller,""" start="00:06:35.647" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and they are again free to issue more commands.""" start="00:06:38.087" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Maybe they issue a play command.""" start="00:06:40.527" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, well, we're going to go deeper into depth,""" start="00:06:42.567" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and note that we also owe a play command.""" start="00:06:45.167" video="mainVideo-async" id="subtitle"]]
+[[!template text="""At some point in the indeterminate future,""" start="00:06:51.127" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the connection will get up,""" start="00:06:54.007" video="mainVideo-async" id="subtitle"]]
+[[!template text="""MPD will allocate resources to track a new client.""" start="00:06:57.598" video="mainVideo-async" id="subtitle"]]
+[[!template text="""They will write the welcome string into the socket,""" start="00:07:03.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and those bytes are going to show up""" start="00:07:06.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in the Emacs process's read buffer,""" start="00:07:07.920" video="mainVideo-async" id="subtitle"]]
+[[!template text="""at which point our callback will be invoked.""" start="00:07:10.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We can parse the welcome string, maybe""" start="00:07:13.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""note the version of that connection object""" start="00:07:17.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that might come in handy.""" start="00:07:19.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""But the key point is our callback needs to""" start="00:07:20.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""take a look at the queue and notice:""" start="00:07:23.021" video="mainVideo-async" id="subtitle"]]
+[[!template text="""&quot;Oh. We owe a status command,&quot;""" start="00:07:25.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and so we'll invoke `process-send-string`,""" start="00:07:27.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and send the status command down the pipe.""" start="00:07:29.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Again, at some indeterminate time in the future""" start="00:07:32.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""some bytes are going to show up""" start="00:07:36.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in our process's read buffer""" start="00:07:38.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and our callback will again be invoked.""" start="00:07:41.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We've got volume is 75 plus a lot of other stuff,""" start="00:07:44.721" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and here we come to the next problem.""" start="00:07:48.560" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""If our caller invoked status,""" start="00:07:50.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""they probably wanted to know about the status,""" start="00:07:54.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""so how shall we get them to them?""" start="00:07:56.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Well, there's really not a lot of options""" start="00:07:59.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""at this point except the callback.""" start="00:08:02.601" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, so change of plan.""" start="00:08:04.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Our queue is no longer a queue of commands.""" start="00:08:07.568" video="mainVideo-async" id="subtitle"]]
+[[!template text="""It's going to be a queue of commands""" start="00:08:11.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with associated callbacks.""" start="00:08:13.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We read the response off the socket,""" start="00:08:15.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""invoke our caller supplied callback,""" start="00:08:20.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and then pop the queue.""" start="00:08:23.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""At this point our callback""" start="00:08:26.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""(the library callback) needs to know""" start="00:08:28.920" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that we still have a pending command,""" start="00:08:32.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we fire that off down the pipe,""" start="00:08:34.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""at some indeterminate time in the future""" start="00:08:35.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we get a response,""" start="00:08:38.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""our callback is invoked,""" start="00:08:40.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we invoke the caller supplied callback,""" start="00:08:42.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and we pop the queue.""" start="00:08:45.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""The structure of such a program""" start="00:08:47.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""is best viewed as a finite state machine.""" start="00:08:53.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And this is typically where you end up""" start="00:08:55.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in asynchronous programming,""" start="00:08:57.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""at least when you don't have a runtime grafted""" start="00:08:59.835" video="mainVideo-async" id="subtitle"]]
+[[!template text="""onto your program the way you do with Go lang,""" start="00:09:02.551" video="mainVideo-async" id="subtitle"]]
+[[!template text="""or when you don't have sort of extensive""" start="00:09:04.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""library support the way you do with Rust.""" start="00:09:07.251" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Your data structure exists in one of these states""" start="00:09:09.680" video="mainVideo-async" id="subtitle"]]
+[[!template text="""at any given time,""" start="00:09:14.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and when input shows up on your file descriptor,""" start="00:09:15.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""you transition along one of these edges""" start="00:09:18.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to a new state.""" start="00:09:21.368" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""Cool. So, let's take a look at some of the code""" start="00:09:24.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that flows from this.""" start="00:09:28.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, let's hop over to an Emacs""" start="00:09:30.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and take a look at how we might code this up.""" start="00:09:32.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""If you recall the sequence diagrams I shared,""" start="00:09:35.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we're going to be scribbling down the command""" start="00:09:38.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and the callback that we'll be invoking""" start="00:09:40.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""upon its completion.""" start="00:09:42.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""The first thing I did was""" start="00:09:43.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""give myself a little command struct.""" start="00:09:44.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""With that, I was able to define""" start="00:09:47.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the connection object.""" start="00:09:51.159" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We're going to be storing""" start="00:09:52.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the handle to the connection.""" start="00:09:55.134" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We're going to write down the protocol version""" start="00:09:56.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that we harvest from the welcome message,""" start="00:09:59.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and of course we'll be recording""" start="00:10:02.117" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the command queue as well.""" start="00:10:04.249" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And so I gave myself a little connection object,""" start="00:10:06.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""connection struct with those three attributes.""" start="00:10:08.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""With the data model squared away,""" start="00:10:12.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it was really pretty easy""" start="00:10:15.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to code up the connect implementation.""" start="00:10:16.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I'm eliding some details for exposition purposes,""" start="00:10:19.918" video="mainVideo-async" id="subtitle"]]
+[[!template text="""but in the event it's really not that more complex""" start="00:10:25.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""than what you see here.""" start="00:10:29.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We're going to unpack the arguments,""" start="00:10:31.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""figure out where the MPD server is""" start="00:10:32.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to which you would like us to connect.""" start="00:10:35.651" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We'll connect via `make-network-process`.""" start="00:10:37.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We'll associate a library defined callback""" start="00:10:40.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""with that connection via `set-process-filter`.""" start="00:10:42.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Then we'll instantiate the connection object""" start="00:10:45.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and return it to the caller.""" start="00:10:48.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Once the caller has a connection object,""" start="00:10:51.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""they're free to send commands down that connection.""" start="00:10:53.818" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, what we're doing here is simply""" start="00:10:57.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""instantiating a command object""" start="00:11:00.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""on the basis of the caller supplied arguments""" start="00:11:02.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and appending it to the queue.""" start="00:11:05.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Then the last thing we do,""" start="00:11:07.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and I've just indicated this with a comment,""" start="00:11:08.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""is we kick the queue.""" start="00:11:10.920" video="mainVideo-async" id="subtitle"]]
+[[!template text="""This kind of goes back""" start="00:11:12.680" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to the state transition diagram""" start="00:11:14.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I laid out earlier.""" start="00:11:16.680" video="mainVideo-async" id="subtitle"]]
+[[!template text="""What this means is the logic for saying,""" start="00:11:18.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""well, if we're awaiting the completion""" start="00:11:22.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""of a previously sent command,""" start="00:11:24.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""there's really not much more to be done.""" start="00:11:25.851" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We're just going to push this command""" start="00:11:27.501" video="mainVideo-async" id="subtitle"]]
+[[!template text="""onto the queue and return.""" start="00:11:30.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""On the other hand, if the queue is empty""" start="00:11:31.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""on entry to `elmpd-send`,""" start="00:11:34.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""there's no reason not to just""" start="00:11:37.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""immediately send the command.""" start="00:11:38.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""This is an example of the sort of client side code""" start="00:11:40.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that results from this API.""" start="00:11:46.600" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""So, you can see here, we are giving ourselves""" start="00:11:48.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a connection to the MPD server on the localhost.""" start="00:11:51.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We're going to send the get volume command""" start="00:11:54.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""down that connection.""" start="00:11:57.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And if that command completes and all is well,""" start="00:11:58.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we'll just send a message to Emacs.""" start="00:12:02.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Unfortunately, you can't see my minibuffer,""" start="00:12:05.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""so I'll hop over to the Messages buffer.""" start="00:12:07.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And there's our result.""" start="00:12:11.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""The volume is 43.""" start="00:12:12.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Great, I thought.""" start="00:12:15.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Simple, clean, responsive, easy to code to.""" start="00:12:18.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""That is unfortunately not the end of the story.""" start="00:12:24.160" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""Let's continue this example a little bit.""" start="00:12:27.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Let's imagine that""" start="00:12:31.736" video="mainVideo-async" id="subtitle"]]
+[[!template text="""if the volume comes back from the server""" start="00:12:33.301" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and it is less than 50,""" start="00:12:35.501" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we would like to set it to 50.""" start="00:12:37.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, this is interesting""" start="00:12:39.335" video="mainVideo-async" id="subtitle"]]
+[[!template text="""because we have two commands""" start="00:12:41.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and whether or not we send the second command""" start="00:12:43.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it is going to depend on""" start="00:12:45.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the response we get from the first.""" start="00:12:46.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay. I thought, well, that's fine.""" start="00:12:48.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I can simply put that logic in the callback""" start="00:12:51.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that I specified for the get volume command.""" start="00:12:55.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, here we are we check the return code,""" start="00:12:58.701" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we parse the volume, we compare it to 50,""" start="00:13:01.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and if it's less we just invoke `elmpd-send` again""" start="00:13:04.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""from the first command's callback.""" start="00:13:08.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Okay, I could live with that""" start="00:13:10.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it's not the worst thing I've ever seen.""" start="00:13:14.051" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""Let's extend this example a little further,""" start="00:13:15.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and this is contrived, but bear with me.""" start="00:13:19.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Let us suppose that if we do set the volume to 50,""" start="00:13:21.868" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we'd like to get the volume one more time just to""" start="00:13:25.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""make sure that our change took on the server.""" start="00:13:28.635" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We can play the same game.""" start="00:13:30.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We will put that logic in the callback""" start="00:13:33.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that we specified for the set volume command.""" start="00:13:37.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And here we are, we check the return code,""" start="00:13:40.168" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we send a message to Emacs,""" start="00:13:43.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we send the get volume command again""" start="00:13:45.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""along with its own callback.""" start="00:13:49.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And at this point I hope it's clear""" start="00:13:51.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""(the problem that is emerging),""" start="00:13:55.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and if it's not yet, let me note that so far""" start="00:13:57.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we're only handling the happy path""" start="00:14:01.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""in each of these callbacks.""" start="00:14:03.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""We really ought to do something about the error path.""" start="00:14:04.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""For purposes of illustration, let's just say,""" start="00:14:06.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""we send a message to Emacs""" start="00:14:10.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that means it would look like this.""" start="00:14:12.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""At this point that I really think""" start="00:14:14.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it's impossible to deny that this API is actually""" start="00:14:17.335" video="mainVideo-async" id="subtitle"]]
+[[!template text="""not that easy to program to.""" start="00:14:20.851" video="mainVideo-async" id="subtitle"]]
+[[!template text="""If there are any JavaScript devs watching,""" start="00:14:23.280" video="mainVideo-async" id="subtitle"]]
+[[!template text="""you're probably chuckling right now""" start="00:14:27.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""because I have discovered for myself""" start="00:14:28.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""what they call &quot;callback hell&quot;.""" start="00:14:30.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""If you are returning""" start="00:14:33.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the results of asynchronous function invocations""" start="00:14:37.868" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to their caller via callbacks,""" start="00:14:40.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""you pretty much inevitably end up in this sort of""" start="00:14:42.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""deeply nested sequence of callbacks""" start="00:14:45.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that is difficult to write, difficult to read,""" start="00:14:48.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and difficult to reason about.""" start="00:14:50.768" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""And yet when I was stuck in this situation""" start="00:14:53.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it just seemed like it really shouldn't be this bad.""" start="00:14:57.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""If I give myself this sort of tabular data structure,""" start="00:15:00.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I felt that this expressed precisely the same logic""" start="00:15:05.320" video="mainVideo-async" id="subtitle"]]
+[[!template text="""just in a much easier to read manner.""" start="00:15:10.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I could, in my mind's eye,""" start="00:15:12.868" video="mainVideo-async" id="subtitle"]]
+[[!template text="""see the code for transforming this data structure,""" start="00:15:15.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""which is really just a list,""" start="00:15:19.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""into the code that you just""" start="00:15:21.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""saw in the previous slide,""" start="00:15:23.585" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and really if Lisp is good at anything""" start="00:15:25.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it is list processing right.""" start="00:15:29.440" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And it was really at this point""" start="00:15:31.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""that a little bit of enlightenment dawned.""" start="00:15:33.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I learned that Lisp is homo iconic,""" start="00:15:36.368" video="mainVideo-async" id="subtitle"]]
+[[!template text="""which is just means that the language itself""" start="00:15:40.800" video="mainVideo-async" id="subtitle"]]
+[[!template text="""is a data structure in that language.""" start="00:15:46.040" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Lisp code is, after all, just a list.""" start="00:15:49.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And the power of Lisp macros""" start="00:15:53.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""is taking that data structure,""" start="00:15:57.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""some data structure that you've defined,""" start="00:15:59.760" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and doing exactly what I wanted to do.""" start="00:16:02.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Transforming it from one list into another,""" start="00:16:04.640" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the destination list being Lisp code.""" start="00:16:07.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, I got busy, and I coded up my first Lisp macro,""" start="00:16:11.835" video="mainVideo-async" id="subtitle"]]
+[[!template text="""which I called `elmpd-chain`.""" start="00:16:16.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And that lengthy list of, you know,""" start="00:16:19.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""three or four nested callbacks""" start="00:16:21.600" video="mainVideo-async" id="subtitle"]]
+[[!template text="""gets turned into this,""" start="00:16:24.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""which I hope you'll agree is much simpler""" start="00:16:25.920" video="mainVideo-async" id="subtitle"]]
+[[!template text="""much easier to read, much easier to reason about.""" start="00:16:29.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""And if you're morbidly curious,""" start="00:16:32.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""you can expand your macros,""" start="00:16:36.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and this invocation of `elmpd-chain` expands to this.""" start="00:16:40.160" video="mainVideo-async" id="subtitle"]]
+[[!template text="""So, that's my story.""" start="00:16:44.200" video="mainVideo-async" id="subtitle"]]
+[[!template new="1" text="""In all fairness, I should note that""" start="00:16:46.400" video="mainVideo-async" id="subtitle"]]
+[[!template text="""the MPD protocol has some subtleties""" start="00:16:50.840" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and complexities that I didn't really get into,""" start="00:16:53.501" video="mainVideo-async" id="subtitle"]]
+[[!template text="""both due to time constraints""" start="00:16:56.880" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and because they're not terribly relevant""" start="00:16:58.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""to the points I wanted to touch on.""" start="00:17:00.520" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I should also note that there's""" start="00:17:02.000" video="mainVideo-async" id="subtitle"]]
+[[!template text="""a fair amount of work in the library itself""" start="00:17:05.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""around accumulating partial responses""" start="00:17:07.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""as they show up in the buffer""" start="00:17:11.240" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and dispatching them piecemeal to the caller.""" start="00:17:12.560" video="mainVideo-async" id="subtitle"]]
+[[!template text="""That was really too complex to get into here.""" start="00:17:16.120" video="mainVideo-async" id="subtitle"]]
+[[!template text="""If you would like to see the code,""" start="00:17:20.468" video="mainVideo-async" id="subtitle"]]
+[[!template text="""it's available on GitHub as well as MELPA.""" start="00:17:22.360" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I'll be putting a version of this talk""" start="00:17:25.080" video="mainVideo-async" id="subtitle"]]
+[[!template text="""on my personal site,""" start="00:17:29.200" video="mainVideo-async" id="subtitle"]]
+[[!template text="""and you can always reach out to me personally,""" start="00:17:30.480" video="mainVideo-async" id="subtitle"]]
+[[!template text="""I hang out on IRC as sp1ff,""" start="00:17:33.720" video="mainVideo-async" id="subtitle"]]
+[[!template text="""or you can just email me as sp1ff@pobox.com.""" start="00:17:36.960" video="mainVideo-async" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:17:41.920" video="mainVideo-async" id="subtitle"]]
+
+
+
+Captioner: bhavin192
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20async%3A%20Emacs%20was%20async%20before%20async%20was%20cool)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/async-before.md b/2022/info/async-before.md
new file mode 100644
index 00000000..3b3c1068
--- /dev/null
+++ b/2022/info/async-before.md
@@ -0,0 +1,39 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+# Talk
+
+<div class="vid"><video controls preload="none" id="async-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="async-mainVideo" data="""
+00:00.000 Asynchronous programming
+00:47.200 Automating my music player
+01:42.600 Working with the API
+03:22.080 make-network-process
+05:05.200 The sequence of events
+05:57.920 Queues
+07:50.480 Callbacks
+09:24.240 Client-side code
+11:48.080 Demo
+12:27.760 Logic
+13:15.520 Callback hell
+14:53.520 Lisp macros
+16:46.400 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.webm">Download --main.webm (98MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/6mKNBvuubwoWFA9SFsgUQS">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="async-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="async-qanda" data="""
+00:00.000 Introduction
+00:21.600 How does this approach compare to using tq.el, Emacs' built-in library for transaction queues?
+01:10.480 Have you considered using the aio.el library (written by Chris Wellons) that implements async/await for Emacs lisp using promises?
+02:45.440 Are you aware that EMMS has an MPD client? There's also mpc.el built into Emacs.
+05:20.360 Have you seen the Lonesome Pine Specials?
+07:44.400 Would using dynamic/special vars add anything interesting / easier to async elisp in your opinion?
+10:16.560 How does your project compare to some of the other MPD clients?
+11:55.040 Can you share the code to the macro that creates the callback tree?
+14:42.880 There's another package (chuntaro?) in addition to wellon's aio that also implements a coroutine trampoline on the emacs event loop. any thoughts on the async/await paradigm generally red/blue functions, etc?
+15:03.440 Any thoughts on the async await paradigm generally, red-blue functions, etc.?
+21:06.320 Do you think it's a viable future for Emacs to get out of callback hell?
+24:39.320 Generators
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.webm">Download --answers.webm (34MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--answers--chapters.vtt">Download --answers--chapters.vtt</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/async-nav.md b/2022/info/async-nav.md
new file mode 100644
index 00000000..4898e531
--- /dev/null
+++ b/2022/info/async-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/workflows">Org workflows for developers</a>
+Next by track: <a href="/2022/talks/grail">GRAIL---A Generalized Representation and Aggregation of Information Layers</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/buddy-after.md b/2022/info/buddy-after.md
new file mode 100644
index 00000000..c662c571
--- /dev/null
+++ b/2022/info/buddy-after.md
@@ -0,0 +1,156 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="buddy-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, welcome to my talk, the Emacs Buddy Initiative.""" start="00:00:00.000" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Who am I?""" start="00:00:03.920" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I'm Andrea. I work as a Clojure Software Engineer""" start="00:00:04.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""somewhere in the middle of the UK.""" start="00:00:07.000" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And I started with Emacs during my PhD,""" start="00:00:09.000" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""thanks to my PhD supervisor""" start="00:00:12.520" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""that introduced me to this tool.""" start="00:00:14.120" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And from now and from then,""" start="00:00:15.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I am basically using it for everything.""" start="00:00:17.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""You can find more about this everything""" start="00:00:20.320" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""at ag91.github.io, that is my blog.""" start="00:00:22.160" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So let's get into the talk.""" start="00:00:26.520" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""Why Emacs Buddy?""" start="00:00:27.900" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Emacs Buddy is an initiative to bring us together.""" start="00:00:29.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And the reason is because Emacs is a limitless tool.""" start="00:00:32.920" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So you can keep learning about it,""" start="00:00:36.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""you can keep expanding it,""" start="00:00:38.800" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""and also takes time to get up to speed.""" start="00:00:41.040" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So you may actually extend Emacs""" start="00:00:44.800" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""or you may actually get introduced,""" start="00:00:48.680" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""start using Emacs,""" start="00:00:50.620" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""but you could fall into all the traps""" start="00:00:52.320" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""or all the wasted times that other users have already gone through.""" start="00:00:56.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And so, since there are a lot of amazing people""" start="00:01:00.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""in the Emacs community,""" start="00:01:04.600" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""why do every time redo the same error?""" start="00:01:07.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So let's bring us together.""" start="00:01:10.120" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And it would be amazing to get a one-to-one relation.""" start="00:01:12.160" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So I have somebody that actually knows what you want to do,""" start="00:01:17.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""what you want to achieve with Emacs,""" start="00:01:21.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""and supports you because they have done a similar path to yours.""" start="00:01:23.400" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And so they can remove some of the obstacles for you.""" start="00:01:27.440" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""So what can you expect?""" start="00:01:32.720" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""The main thing is guidance on your Emacs journey,""" start="00:01:34.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""because the Emacs journey is infinite, it doesn't really end.""" start="00:01:37.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""But the farther you go,""" start="00:01:41.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""the more value you get from this amazing tool.""" start="00:01:44.080" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And that helps you save time.""" start="00:01:46.800" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And at the same time, you can meet like-minded people.""" start="00:01:50.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And so you can learn about Emacs or about your context,""" start="00:01:54.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""if they are in, for example, if you are a physicist,""" start="00:01:59.080" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""they are physicists or they are interested in the field.""" start="00:02:02.920" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""You may not only learn about Emacs,""" start="00:02:07.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""but you can learn also something about the field.""" start="00:02:09.160" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And anyway, the idea is that you can move forward together.""" start="00:02:11.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""Somebody asked, why not just mailing lists or Reddit?""" start="00:02:17.040" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Well, the point is that mailing list is many people""" start="00:02:20.400" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""can help you solve one issue that you have.""" start="00:02:24.640" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And that naturally doesn't become a discussion""" start="00:02:28.520" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""of where you are from, what are you trying to achieve,""" start="00:02:31.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""and where you want to move forward with using this editor""" start="00:02:35.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""or using this tool.""" start="00:02:40.000" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Instead, here, we want something more personal,""" start="00:02:42.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""something more like you tell your story.""" start="00:02:45.640" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And if I can help you achieve what you need,""" start="00:02:48.640" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I am also interested in your story as a buddy.""" start="00:02:53.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""So given that, how do you get in touch with a buddy?""" start="00:02:58.960" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Well, the thing is easy.""" start="00:03:03.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Just ping me at this email, andrea-dev@hotmail.com.""" start="00:03:04.680" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And I can put you in touch with one of the buddies""" start="00:03:12.720" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""that are available.""" start="00:03:15.400" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Or you can contact them personally, directly,""" start="00:03:16.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""because on the web page, on the Emacs Buddy web page,""" start="00:03:20.200" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""there are links to their material or their websites.""" start="00:03:26.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And sometimes you can find the contact yourself.""" start="00:03:32.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Anyway, I am a facilitator.""" start="00:03:35.600" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So if you contact me, I will find the contact for the person""" start="00:03:37.160" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""that you want to get in touch.""" start="00:03:41.920" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""You can also get in touch with me.""" start="00:03:43.080" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I'm a buddy myself.""" start="00:03:44.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""How did it go so far?""" start="00:03:47.960" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Well, from when I started the initiative,""" start="00:03:49.600" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""more or less we had 10 buddies.""" start="00:03:52.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""We had 10 buddies that are available to help you""" start="00:03:55.040" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""with your Emacs journey.""" start="00:03:58.720" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And I buddyed myself, or I got in touch""" start="00:04:01.520" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""with people that wanted a buddy, about eight people.""" start="00:04:04.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Each of these conversations was quite interesting.""" start="00:04:10.680" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""I decided to paraphrase one.""" start="00:04:14.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I had this user that got in touch and said:""" start="00:04:19.640" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""&quot;I used Emacs for 10 years.""" start="00:04:23.520" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I'm curious about the initiative,""" start="00:04:25.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""and here is my GitHub that I started writing recently,""" start="00:04:27.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Elisp projects&quot;, projects in Elisp to extend Emacs.""" start="00:04:32.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I looked at their code.""" start="00:04:37.680" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I suggested, &quot;Oh, why don't you use dash?""" start="00:04:40.840" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""It's something that I'm familiar with.""" start="00:04:43.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Maybe you may like it as well.&quot;""" start="00:04:45.300" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And then I started asking, &quot;Oh, what do you do with Emacs?""" start="00:04:49.440" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Have you tried a note taking tool like Org Roam?&quot;""" start="00:04:51.720" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And then the conversation started.""" start="00:04:56.000" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So &quot;yeah, I tried Org Roam version one.""" start="00:04:58.040" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I use my own thing.""" start="00:05:00.200" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""But what is it...""" start="00:05:01.200" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I'm curious about version two.""" start="00:05:02.880" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Did you use it?""" start="00:05:04.240" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Do you know about Luhmann?&quot;""" start="00:05:05.840" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""That is the inspiration of Org Roam""" start="00:05:07.080" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""and the backlinking and stuff.""" start="00:05:09.862" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And then I started the conversation about that.""" start="00:05:13.240" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And we discussed about functional programming.""" start="00:05:15.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""We discussed a bit about philosophy and went on.""" start="00:05:18.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""And then this conversation is not currently going.""" start="00:05:23.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So we arrived to a point in which it sort of died out.""" start="00:05:29.160" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""But if I want or if they want, they can ping me back.""" start="00:05:32.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I can ping them.""" start="00:05:36.680" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So it's sort of a reference of this person exists""" start="00:05:37.440" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""and is an interesting person to chat with when I have something""" start="00:05:40.800" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""to say to them.""" start="00:05:44.440" video="mainVideo-buddy" id="subtitle"]]
+[[!template new="1" text="""And what if you want to be a buddy?""" start="00:05:48.360" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Well, if you want to be a buddy, it's easy as well.""" start="00:05:50.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So basically, just open a PR on the Emacs buddy repository.""" start="00:05:54.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""That is something that I am maintaining at the moment.""" start="00:06:02.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Or simply send me the information.""" start="00:06:05.280" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Somebody just sent me an email with the information.""" start="00:06:07.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""I have created the commit to make it public available.""" start="00:06:10.000" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""The information is just your name, a summary,""" start="00:06:14.720" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""what kind of user you are so that you can attract""" start="00:06:18.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""the right people to you, and a link to your material""" start="00:06:21.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""so that if they are curious about your summary or about you,""" start="00:06:28.040" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""they can actually go and check and even contact you directly.""" start="00:06:31.960" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""If they contact via me, I will know your email anyway""" start="00:06:35.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""from the PR you open.""" start="00:06:40.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So that is all.""" start="00:06:44.320" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""There are ideas to maybe... if... this is basically""" start="00:06:45.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""an advertisement for this initiative""" start="00:06:53.040" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""so that we can get people that want to be helped""" start="00:06:54.760" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""or people that want to help.""" start="00:06:57.640" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""It's building up organically, so no rush""" start="00:07:01.200" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""to make this thing grow, escalate enormously.""" start="00:07:03.600" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""But for example, there are ideas to join this with the meetup""" start="00:07:08.640" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""talk that is being happening in the conference.""" start="00:07:12.480" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""So for example, if you find out something very interesting,""" start="00:07:15.720" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""you can bring the discussion that you have with your buddy""" start="00:07:19.520" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""into a meetup so that the group with which you speak is bigger.""" start="00:07:22.200" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""There are ideas like that.""" start="00:07:27.560" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""But first of all, just get in touch if you want to find""" start="00:07:28.920" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""like-minded people that want to help you with your Emacs""" start="00:07:33.120" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""journey or if you want to help others.""" start="00:07:36.600" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:07:38.920" video="mainVideo-buddy" id="subtitle"]]
+[[!template text="""Enjoy the rest of the talks and chat to you soon.""" start="00:07:39.800" video="mainVideo-buddy" id="subtitle"]]
+
+
+
+Captioner: andrea
+
+Questions or comments? Please e-mail [andrea-dev@hotmail.com](mailto:andrea-dev@hotmail.com?subject=Comment%20for%20EmacsConf%202022%20buddy%3A%20The%20Emacs%20Buddy%20initiative)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/buddy-before.md b/2022/info/buddy-before.md
new file mode 100644
index 00000000..5b6a0e8f
--- /dev/null
+++ b/2022/info/buddy-before.md
@@ -0,0 +1,16 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Andrea shares how to connect with an Emacs Buddy for one-to-one peer mentoring. Afterwards, he will answer questions over IRC.
+
+<div class="vid"><video controls preload="none" id="buddy-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="buddy-mainVideo" data="""
+00:00.000 Introduction
+00:27.900 Why Emacs Buddy?
+01:32.720 What can you expect?
+02:17.040 Why not just mailing lists or Reddit?
+02:58.960 How do you get in touch with a buddy?
+03:47.960 How did it go?
+04:14.760 Example
+05:48.360 What if you want to be a buddy?
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.webm">Download --main.webm (16MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.opus">Download --main.opus (5.9MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buddy--the-emacs-buddy-initiative--andrea--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/rGaAhFjM5GCvNHBhs39JA3">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/buddy-nav.md b/2022/info/buddy-nav.md
new file mode 100644
index 00000000..1bb28aa9
--- /dev/null
+++ b/2022/info/buddy-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/asmblox">asm-blox: a game based on WebAssembly that no one asked for</a>
+Next by track: <a href="/2022/talks/wayland">Emacs should become a Wayland compositor</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/buttons-after.md b/2022/info/buttons-after.md
new file mode 100644
index 00000000..44c9be69
--- /dev/null
+++ b/2022/info/buttons-after.md
@@ -0,0 +1,238 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="buttons-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hi everyone! I'm Mats Liddell.""" start="00:00:00.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""In this talk, I will show""" start="00:00:06.280" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""how you can link to personal data""" start="00:00:07.320" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""using Hyperbole's support for implicit button types.""" start="00:00:09.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Before starting, a few words about me.""" start="00:00:13.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""I work as a software engineer,""" start="00:00:16.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and in my spare time""" start="00:00:18.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""I'm co-maintaining the Hyperbole package""" start="00:00:19.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""together with the package author Bob Weiner.""" start="00:00:21.280" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Hyperbole dates back to 1993,""" start="00:00:24.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and have had some inactive years in the past,""" start="00:00:27.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""but work is now active again.""" start="00:00:29.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The package is available""" start="00:00:31.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""through the GNU ELPA package archive.""" start="00:00:33.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The talk will focus on""" start="00:00:36.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""creation of implicit button types.""" start="00:00:37.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""For more info on Hyperbole,""" start="00:00:39.600" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""listen to other presentations""" start="00:00:41.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and check out the package documentation.""" start="00:00:43.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""What I want you to take with you from this talk is""" start="00:00:46.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that the implicit button types""" start="00:00:50.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""can make patterns in your files into buttons;""" start="00:00:51.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and that new implicit button types""" start="00:00:54.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""can quickly be created by using""" start="00:00:56.600" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""the `defil` and the `defal` macros.""" start="00:00:58.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""So what is an implicit button type?""" start="00:01:01.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""I think of it as a text pattern""" start="00:01:05.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that has some extended meaning.""" start="00:01:06.800" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""When you see the pattern in the text,""" start="00:01:08.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you can think of it as a button type.""" start="00:01:10.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""When you press the button,""" start="00:01:12.800" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""something related to that meaning happens.""" start="00:01:13.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It can be jumping to some place,""" start="00:01:16.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""opening an external tool, doing some computation.""" start="00:01:19.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So there can be some action""" start="00:01:22.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""associated with the pattern.""" start="00:01:24.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""To make it clear, let's look at some examples.""" start="00:01:29.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Let's start with something that is maybe so obvious""" start="00:01:33.320" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that you don't even think of it as a pattern: a file name.""" start="00:01:36.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""When you see such a string in text,""" start="00:01:39.600" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you will naturally associate it with a file on disk,""" start="00:01:41.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and if you would click on it,""" start="00:01:45.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you would probably expect that file to open.""" start="00:01:46.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""In the first sentence on the slide,""" start="00:01:52.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you might recognize the file name""" start="00:01:55.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""for the bash initialization file, ~/.bashrc.""" start="00:01:56.840" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Hyperbole comes with built-in support""" start="00:02:01.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""for recognizing files and directory path names""" start="00:02:03.840" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""as implicit button types in text.""" start="00:02:06.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""For Hyperbole to take action on the button type,""" start="00:02:08.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you move the cursor within the button""" start="00:02:11.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and press M-RET or use a mouse click.""" start="00:02:13.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So let's try that.""" start="00:02:16.320" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Similar for the path, /usr/local in the next sentence.""" start="00:02:22.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""That will open the corresponding""" start="00:02:27.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""directory using dired-mode.""" start="00:02:29.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""Other examples of built-in implicit button types""" start="00:02:37.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that Hyperbole recognizes are email addresses,""" start="00:02:39.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""web addresses, requests for comment documents""" start="00:02:43.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""in the form of RFC followed by a number,""" start="00:02:47.320" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""GNU debbugs issues, plus many more.""" start="00:02:50.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""These are some examples""" start="00:02:53.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""of implicit button types with built-in support.""" start="00:02:55.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""I list them here to give you an idea""" start="00:02:58.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""how the text pattern in itself is enough""" start="00:02:59.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""for the system to recognize it""" start="00:03:02.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""as something actionable.""" start="00:03:03.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""So as shown, Hyperbole has built-in support""" start="00:03:10.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""for implicit buttons.""" start="00:03:12.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""There's only one problem here.""" start="00:03:14.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The behavior is predefined.""" start="00:03:16.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""There is of course a trade off.""" start="00:03:17.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It is convenient to get""" start="00:03:20.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""many button types out of the box""" start="00:03:21.560" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""with likely good standard behavior""" start="00:03:23.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and that works in many places.""" start="00:03:25.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""But what if you would want to create""" start="00:03:27.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""your own completely new mapping,""" start="00:03:29.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""possibly to your own data?""" start="00:03:31.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It is here that Hyperbole's support for creating""" start="00:03:32.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""new implicit button types comes in.""" start="00:03:38.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""For the full pattern matching button type,""" start="00:03:41.280" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""like for the filename and examples we just looked at,""" start="00:03:43.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you need to define the implicit button""" start="00:03:46.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""using the macro, `defib`.""" start="00:03:48.755" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The downside of that is""" start="00:03:50.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you need to code at the elisp level.""" start="00:03:53.280" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""However, if you are creating a new pattern""" start="00:03:54.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that has well-defined delimiters,""" start="00:03:57.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""there is support for that in an easier way.""" start="00:03:59.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""These support functions, or rather macros,""" start="00:04:01.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""are `defil` and `defal`.""" start="00:04:03.800" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""We will look at those macros soon,""" start="00:04:06.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""but first, my definition of personal data.""" start="00:04:08.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""I think of personal data as something""" start="00:04:13.400" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that you would like to link to,""" start="00:04:18.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""but it's not necessarily in a form""" start="00:04:19.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""supported by any known tool.""" start="00:04:21.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It might be stored on a web server, local storage,""" start="00:04:23.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""or could even be some computation""" start="00:04:26.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""rather than a link.""" start="00:04:28.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""What all these cases have in common is that""" start="00:04:29.400" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""you want to be able to reference it""" start="00:04:32.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""in a short, and for you, descriptive way.""" start="00:04:34.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So when you write text, you can use""" start="00:04:36.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""a new implicit type to create the connection.""" start="00:04:38.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""This might be a bit abstract,""" start="00:04:44.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""so let's look at an example.""" start="00:04:46.600" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Suppose you have a flat file structure""" start="00:04:48.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""with some notes in each file.""" start="00:04:51.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It can look like this.""" start="00:04:52.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""In the data folder, we have two files""" start="00:04:54.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that represents the notes we have taken.""" start="00:04:57.400" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""We now want to be able to link to these notes""" start="00:05:00.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""from outside of the data folder.""" start="00:05:02.840" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Let's make an implicit button type""" start="00:05:07.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that opens a file in this structure.""" start="00:05:08.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""To make the pattern stand out in text,""" start="00:05:10.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""we use double braces as start and stop delimiters.""" start="00:05:13.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""An implicit button instance""" start="00:05:16.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""would then look like this.""" start="00:05:20.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""We can create that using the `defil` macro like this.""" start="00:05:22.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""This invocation of the field""" start="00:05:27.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""creates a button type &quot;demo-link-to-file&quot;""" start="00:05:31.840" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""with the start delimiter of &quot;{{&quot;""" start="00:05:34.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and then delimiters of &quot;}}&quot;,""" start="00:05:37.280" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""the regular expression &quot;.*&quot; pattern""" start="00:05:40.560" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to match everything between the delimiters,""" start="00:05:43.320" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and finally, the action defined by the link expression.""" start="00:05:45.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Pattern substitution is performed""" start="00:05:48.800" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""on the link expression before evaluation""" start="00:05:52.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""so that the text that is in between the delimiters""" start="00:05:54.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""is inserted where the &quot;\\&&quot; is in the link expression.""" start="00:05:57.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So all in all, implicit type instance will result in""" start="00:06:02.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""the link expression of &quot;~/data/FileA&quot;,""" start="00:06:07.560" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""which we recognize as a file path.""" start="00:06:11.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""With a single-line expression,""" start="00:06:14.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""we have created our own hyperbutton syntax""" start="00:06:18.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that we can use in any Emacs buffer""" start="00:06:21.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to link to this custom set of data.""" start="00:06:23.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So let's evaluate the defil and use it.""" start="00:06:25.560" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""I have prepared the files so that they already""" start="00:06:30.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""contain some text and implicit links.""" start="00:06:33.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So from the presentation, we can go to FileA,""" start="00:06:36.400" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and from there to fileB.""" start="00:06:43.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Since the Hyperbole path expression""" start="00:06:48.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""supports outline structures, we can,""" start="00:06:51.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""as an extra bonus, reference directly""" start="00:06:53.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""the headers in the files,""" start="00:06:55.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""so we can, for example, link directly""" start="00:06:57.560" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to &quot;More Notes&quot; in FileB.""" start="00:07:00.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""We have now created a simple info system.""" start="00:07:02.600" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""Looking deeper at the link expression,""" start="00:07:10.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""it can be of four different types:""" start="00:07:16.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""A file path expression,""" start="00:07:19.840" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""as we have already looked at;""" start="00:07:22.040" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""a brace-delimited key series,""" start="00:07:23.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that is, a series of command keys""" start="00:07:25.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""for performing some action,""" start="00:07:27.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""much like a keyboard macro;""" start="00:07:29.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""An URL; or a function that takes one argument,""" start="00:07:30.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""which will be given the button text as input.""" start="00:07:36.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The URL link expression allows you""" start="00:07:38.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to link to web pages.""" start="00:07:42.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So if the data you want to link to""" start="00:07:44.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""is accessible through the Web""" start="00:07:46.560" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and the URL can be constructed""" start="00:07:48.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""from the button text in a meaningful way,""" start="00:07:50.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""it is possible to do that.""" start="00:07:53.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""Let's create the button type""" start="00:07:54.520" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that links to GNU software.""" start="00:07:56.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The URL to the GNU software catalog""" start="00:07:57.720" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""is www.gnu.org/software,""" start="00:08:01.089" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and with what we know about the field,""" start="00:08:04.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""it is easy to create the button type for that.""" start="00:08:07.440" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It can look like this.""" start="00:08:09.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""And here are two possible buttons""" start="00:08:11.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""linking to Emacs and Hyperbole.""" start="00:08:16.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So let's again evaluate the defil and use it.""" start="00:08:19.320" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Please note that not all GNU software""" start="00:08:24.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""is under that URL,""" start="00:08:28.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""so this simple definition will not work""" start="00:08:29.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to link to everything.""" start="00:08:31.000" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""To highlight the fact that the button action""" start="00:08:32.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""does not have to be a link,""" start="00:08:37.280" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""but can be any action,""" start="00:08:39.080" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""let's look at a math example.""" start="00:08:40.600" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Here is the button type that does some math""" start="00:08:42.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""and writes the result in the message area.""" start="00:08:44.800" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Let's evaluate and use it.""" start="00:08:47.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""Before ending, I would like to mention""" start="00:08:57.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""the defal macro.""" start="00:08:59.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It is similar to the defil macro,""" start="00:09:00.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""but simpler, since it uses a form""" start="00:09:02.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""of the implicit button type with no delimiters.""" start="00:09:04.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""It is simply <TYPE LINK-EXPR>.""" start="00:09:07.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""So the implicit button type contains the link type""" start="00:09:14.800" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""in clear text.""" start="00:09:17.920" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Our recent FSF software button""" start="00:09:18.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""would be created like this.""" start="00:09:23.120" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""And it would be instantiated in text like this.""" start="00:09:24.855" video="mainVideo-buttons" id="subtitle"]]
+[[!template new="1" text="""I have shown how you,""" start="00:09:29.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""with the help of the defil macro in Hyperbole,""" start="00:09:34.960" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""quickly can create implicit buttons.""" start="00:09:37.840" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""With those buttons, you can link""" start="00:09:40.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to your personal information""" start="00:09:41.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""in the form it may have.""" start="00:09:43.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""By the nature of the implicit buttons,""" start="00:09:44.160" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""those can be used from any file in Emacs.""" start="00:09:47.200" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""The button types can be""" start="00:09:49.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""created to be used long term,""" start="00:09:52.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""but even short term use within the session is possible,""" start="00:09:54.640" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""since the creation is simple and quick.""" start="00:09:57.680" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Inspired by this, I hope you will find ways""" start="00:09:59.880" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""to create implicit buttons""" start="00:10:03.400" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""that will support you getting to your information.""" start="00:10:04.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""For the simplest cases,""" start="00:10:07.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""the field and the file macros might be enough.""" start="00:10:09.240" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""For more complicated cases,""" start="00:10:11.400" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""using a tailor-made function can be an option.""" start="00:10:13.360" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""If you know Elisp, use the defib macro""" start="00:10:15.760" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""which gives you full control over the button type.""" start="00:10:19.480" video="mainVideo-buttons" id="subtitle"]]
+[[!template text="""Thank you.""" start="00:10:22.240" video="mainVideo-buttons" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20buttons%3A%20Linking%20personal%20info%20with%20Hyperbole%20implicit%20buttons)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/buttons-before.md b/2022/info/buttons-before.md
new file mode 100644
index 00000000..e6f2387c
--- /dev/null
+++ b/2022/info/buttons-before.md
@@ -0,0 +1,50 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Mats Lidell shares how you can create your own hyperbutton syntax that can be used in any file to trigger any kind of action. After the talk, he will answer your questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="buttons">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect stroke-width="3" x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 11-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-buttons>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T18:40:00Z" end="2022-12-03T18:55:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~1:40 PM - 1:55 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~12:40 PM - 12:55 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~11:40 AM - 11:55 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~10:40 AM - 10:55 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~6:40 PM - 6:55 PM UTC <br />Saturday, Dec 3 2022, ~7:40 PM - 7:55 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~8:40 PM - 8:55 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~12:10 AM - 12:25 AM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~2:40 AM - 2:55 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~3:40 AM - 3:55 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="buttons-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="buttons-mainVideo" data="""
+00:00.000 Introduction
+01:01.760 Implicit buttons
+01:29.920 Filenames
+02:37.080 Other built-in implicit buttons
+03:10.120 Creating new implicit button types with defib, defil, and defal
+04:13.400 Personal data
+04:44.480 Defining an implicit button with defil
+07:10.720 Types of link expressions
+07:54.520 Another button example
+08:32.200 Action buttons
+08:57.160 The defal macro
+09:29.760 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.webm">Download --main.webm (15MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/uLx9KkUP8SbH2KZfynEtLR">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="buttons-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="buttons-qanda" data="""
+00:00.000 Introduction
+00:40.600 So with one line of code you can create custom hyperbutton types that are live in any Emacs buffer. Is that right?
+02:53.320 Is there a good way to share common patterns for links other than the ones that you shared? shall those be PRs to your repository?
+06:27.480 Could you differentiate Hyperbole and Org?
+08:27.720 How did you present the right buffer with shortcuts at the right of your buffer?
+10:58.200 Working with different support systems
+14:14.600 Bob Weiner
+19:04.800 Do the links/buttons created in hyperbole (like that one with the url) get exported on org-mode files too? (like when exported to html)
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.webm">Download --answers.webm (31MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--answers--chapters.vtt">Download --answers--chapters.vtt</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/buttons-nav.md b/2022/info/buttons-nav.md
new file mode 100644
index 00000000..6f340d09
--- /dev/null
+++ b/2022/info/buttons-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/sqlite">Using SQLite as a data source: a framework and an example</a>
+Next by track: <a href="/2022/talks/mail">Revisiting the anatomy of Emacs mail user agents</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/community-after.md b/2022/info/community-after.md
new file mode 100644
index 00000000..7dea9532
--- /dev/null
+++ b/2022/info/community-after.md
@@ -0,0 +1,7 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20community%3A%20The%20ship%20that%20builds%20itself%3A%20How%20we%20used%20Emacs%20to%20develop%20a%20workshop%20for%20communities)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/community-before.md b/2022/info/community-before.md
new file mode 100644
index 00000000..bf1aca59
--- /dev/null
+++ b/2022/info/community-before.md
@@ -0,0 +1,16 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+<div class="schedule-in-context schedule-svg-container" data-slug="community">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities" data-slug="community"> <title> 1:40- 1:50 The ship that builds itself: How we used Emacs to develop a workshop for communities</title> <rect stroke-width="3" x="439" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(452,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 3:55 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(648,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: complete asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:20 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(499,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 3:50- 3:55 Short hyperlinks to Python docs</title> <rect x="643" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(648,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(94,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(188,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(282,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(376,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(470,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(564,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(658,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(752,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 5</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 10-min talk followed by live Q&A (<https://emacsconf.org/current/community/room>)
+Status: Sorry, this talk has been cancelled
+
+
+
+# Description
+
+
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/community-nav.md b/2022/info/community-nav.md
new file mode 100644
index 00000000..c1566b5d
--- /dev/null
+++ b/2022/info/community-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by time: <a href="/2022/talks/sqlite">Using SQLite as a data source: a framework and an example</a>
+Next by time: <a href="/2022/talks/mail">Revisiting the anatomy of Emacs mail user agents</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/dbus-after.md b/2022/info/dbus-after.md
new file mode 100644
index 00000000..4b1f44f2
--- /dev/null
+++ b/2022/info/dbus-after.md
@@ -0,0 +1,378 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="dbus-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Welcome to my EmacsConf 2022 talk, The Wheels on D-Bus.""" start="00:00:00.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""In this talk, we'll cover what D-Bus is,""" start="00:00:04.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""why you might want to use it, and how to use it with Emacs.""" start="00:00:07.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""D-Bus is fundamentally based on passing messages""" start="00:00:10.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""in between processes, using the bus as a mediator.""" start="00:00:13.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""On top of this is built an RPC system with method invocation""" start="00:00:17.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that has argument lists and return values,""" start="00:00:20.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""like you might find in any programming language.""" start="00:00:22.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""These are commonly used for verb-type actions""" start="00:00:25.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""like &quot;restart my computer.&quot;""" start="00:00:27.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""You can also associate a collection of attributes""" start="00:00:30.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with objects on the bus, and these are called properties.""" start="00:00:32.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The properties can be read-only, write-only, or read-write.""" start="00:00:35.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Signals are a way of notifying participants on the bus""" start="00:00:39.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of updated state, and are the basis""" start="00:00:43.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""for building dynamic user interfaces""" start="00:00:46.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that react to changes in the system.""" start="00:00:47.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It has a static and strong type system,""" start="00:00:50.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so if you send a message with the wrong type signature,""" start="00:00:52.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""it simply gets rejected instead of going through""" start="00:00:55.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to the remote service.""" start="00:00:57.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It also manages service life cycles,""" start="00:00:59.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so you're not running services at all times.""" start="00:01:02.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""They can be started and stopped by D-Bus on demand.""" start="00:01:04.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""D-Bus has two major use cases.""" start="00:01:07.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The first is acting as a lower-level substrate""" start="00:01:10.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""for higher-level programs,""" start="00:01:13.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""like a graphical desktop environment.""" start="00:01:14.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""For example, if you want to manage your network connectivity""" start="00:01:16.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""from your graphical environment,""" start="00:01:19.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""instead of having to build all of that from the ground up,""" start="00:01:21.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can rely on the D-Bus service to do that""" start="00:01:23.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and only build the graphical component of it.""" start="00:01:26.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This gives you consistency between desktop environments""" start="00:01:28.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and reduces code duplication.""" start="00:01:31.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Another application is automating desktop programs.""" start="00:01:33.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""If your program offers a D-Bus service,""" start="00:01:37.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""then it can be remote-controlled,""" start="00:01:39.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and if all of your programs offer D-Bus,""" start="00:01:40.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can control your entire desktop.""" start="00:01:42.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Let's look at the abstractions that D-Bus provides.""" start="00:01:45.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The top level object is called a bus,""" start="00:01:48.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it's like a partition""" start="00:01:51.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that messages get exchanged inside of.""" start="00:01:52.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Messages don't cross buses.""" start="00:01:54.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Inside of a bus are services.""" start="00:01:57.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Services are normally identified in reverse FQDN order,""" start="00:01:59.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so org.foobar.FooService.""" start="00:02:03.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Each service provides some set of features""" start="00:02:06.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""related to a particular area of functionality.""" start="00:02:08.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Inside of each service are objects.""" start="00:02:11.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Objects use a path notation,""" start="00:02:14.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and usually follow the same reverse FQDN format""" start="00:02:16.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""as the service identifier.""" start="00:02:19.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Each object has one or more interfaces.""" start="00:02:21.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""An interface is like a facet that you can use""" start="00:02:24.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to interact with an object,""" start="00:02:27.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and inside of the interface are properties, methods,""" start="00:02:29.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and signals, which we covered before.""" start="00:02:32.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Properties are attributes that can be read or written.""" start="00:02:34.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Methods are verbs that you can call to invoke an action,""" start="00:02:37.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and a signal is something that's used to move state""" start="00:02:40.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""in between a service and another participant on the bus.""" start="00:02:43.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""There can be any number of interfaces on an object,""" start="00:02:47.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""any number of objects in a service,""" start="00:02:49.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and any number of services on a bus,""" start="00:02:51.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and any number of buses on a system.""" start="00:02:53.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""There are two well-known busses,""" start="00:02:55.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and these roughly map to those two use cases""" start="00:03:00.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I mentioned before.""" start="00:03:02.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The system bus is for interfacing with hardware""" start="00:03:03.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and operating-system-level concerns""" start="00:03:06.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""like disks, networks, and so forth.""" start="00:03:08.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The session bus is tied to a user login,""" start="00:03:11.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and is more in the desktop automation use case.""" start="00:03:14.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""There are some common interfaces you'll find""" start="00:03:20.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""if you go exploring D-Bus.""" start="00:03:21.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The Introspectable interface is the basis""" start="00:03:23.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of a lot of the reflection features.""" start="00:03:26.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It has a single method called introspect""" start="00:03:27.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that returns the XML interface description""" start="00:03:30.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of whatever you call it on.""" start="00:03:32.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Peer is used for lower level connectivity,""" start="00:03:33.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""for example, pinging a service to see if it's running.""" start="00:03:36.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And the Properties interface is the basis""" start="00:03:39.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of the read-write properties,""" start="00:03:41.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which are secretly method calls under the cover.""" start="00:03:43.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Just about every object you interact with on D-Bus""" start="00:03:45.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""will support all three of these interfaces.""" start="00:03:48.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Additionally, ObjectManager is used for services""" start="00:03:51.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that manage collections of objects.""" start="00:03:54.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""For example, the disk service has an object""" start="00:03:56.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""for each disk that's attached,""" start="00:03:59.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and the object manager allows you""" start="00:04:01.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to enumerate all of those.""" start="00:04:02.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Emacs supports D-Bus natively since version 23.1.""" start="00:04:06.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It's a combination of native bindings""" start="00:04:10.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with a C library and dbus.el.""" start="00:04:12.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""While there are some ports of D-Bus""" start="00:04:14.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to non-Linux operating systems,""" start="00:04:17.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""it's probably only available on Linux""" start="00:04:19.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and almost certainly only usable on Linux.""" start="00:04:22.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""If you want to interact with D-Bus from Emacs,""" start="00:04:24.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""it's fairly straightforward.""" start="00:04:28.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""There's a collection of functions like dbus-get-property""" start="00:04:30.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""or dbus-call-method, et cetera,""" start="00:04:33.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and they almost all take this same set""" start="00:04:35.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of four arguments at the beginning:""" start="00:04:37.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""bus, service, path, and interface.""" start="00:04:39.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""In this case, it takes a single additional property,""" start="00:04:42.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is the one to read.""" start="00:04:45.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And what we're calling is the hostname1 service,""" start="00:04:46.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which gives you just a little bit of information""" start="00:04:49.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""about the system, like its hostname or its chassis.""" start="00:04:51.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And in this case, you can see I'm running""" start="00:04:54.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""this presentation off my laptop.""" start="00:04:56.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The problem with this and what I don't like about it""" start="00:04:57.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""is that all of these identifiers are very verbose""" start="00:05:00.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and very repetitive.""" start="00:05:04.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And if you end up calling these a lot,""" start="00:05:05.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""it gets old really quickly.""" start="00:05:07.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""So I wrote a wrapper called Debase,""" start="00:05:09.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is convenience on top of the built-in functions.""" start="00:05:13.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Most of the stock functions have Debase versions""" start="00:05:15.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""just by replacing &quot;dbus&quot; with &quot;debase&quot;.""" start="00:05:18.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And let's look how that works.""" start="00:05:21.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""The fundamental idea of Debase is that you can bind together""" start="00:05:23.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""all of those arguments into a single object""" start="00:05:28.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that represents the endpoint.""" start="00:05:30.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is an EIEIO class, and it takes keyword arguments,""" start="00:05:31.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so there's never any chance""" start="00:05:35.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of mixing up which thing is what.""" start="00:05:36.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So this sets the endpoint to that object,""" start="00:05:38.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""calls debase-get-property on it,""" start="00:05:41.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and you can see it works exactly the same.""" start="00:05:43.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The thing that's really nice about this, though,""" start="00:05:45.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""is it knows that so many of these arguments""" start="00:05:47.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""are very similar that it can compute most of them""" start="00:05:50.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""if you don't provide them all.""" start="00:05:52.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So if you just say service, it will assume""" start="00:05:54.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that you want the same object that matches""" start="00:05:57.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and the same interface that matches,""" start="00:05:59.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it works just the same.""" start="00:06:00.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I find this very, very convenient.""" start="00:06:02.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""You can also reuse the object""" start="00:06:04.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""instead of having to repeat every argument""" start="00:06:07.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with every function call,""" start="00:06:09.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is a really great improvement in ergonomics.""" start="00:06:10.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Because so many objects have multiple interfaces,""" start="00:06:13.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you often find yourself needing to look""" start="00:06:18.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""at a different aspect of that object.""" start="00:06:20.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is supported with the built-in EIEIO clone method,""" start="00:06:22.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which takes an object""" start="00:06:26.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and a set of keyword arguments to replace.""" start="00:06:28.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So in this case, we can see we're calling""" start="00:06:30.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""the Properties method,""" start="00:06:32.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""but everything else on that endpoint is the same.""" start="00:06:33.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And then we're gonna call the method GetAll""" start="00:06:35.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""on that Properties interface,""" start="00:06:38.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it's going to return all the properties""" start="00:06:39.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of the org.freedesktop.hostname1 interface""" start="00:06:41.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""inside of that object.""" start="00:06:43.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And if we run that, we can see there's the hostname""" start="00:06:45.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and some other information about the laptop""" start="00:06:48.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that I'm running this on.""" start="00:06:50.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Debase also supports object binding.""" start="00:06:51.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This creates a lexical context in which the Debase object""" start="00:06:54.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""is the implicit target of any D-Bus function.""" start="00:06:58.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is really convenient if you need""" start="00:07:01.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to fetch multiple properties or otherwise interact""" start="00:07:03.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with the same endpoint in multiple different ways.""" start="00:07:06.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And you can see I'm still on a laptop""" start="00:07:09.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it's still named meson.""" start="00:07:11.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""You can also, if you don't want to use the object,""" start="00:07:12.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can provide the raw argument list.""" start="00:07:16.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Under the covers, this is basically an flet""" start="00:07:18.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""where you're currying all of these functions""" start="00:07:20.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so they start with those argument lists.""" start="00:07:23.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And you can see I'm running on a Linux machine,""" start="00:07:25.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which should not be surprising.""" start="00:07:27.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Debase also has an experimental code generation feature.""" start="00:07:29.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It outputs EIEIO code with one class per D-Bus interface.""" start="00:07:34.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This includes accessors for all of its properties""" start="00:07:38.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with an in-process cache, so if you read one property,""" start="00:07:41.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you don't have to go back to the bus to read it again.""" start="00:07:44.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It also outputs generic functions and method implementations""" start="00:07:46.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""for the D-Bus interface methods.""" start="00:07:50.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It includes name-mangling options,""" start="00:07:52.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so you can control how everything is named.""" start="00:07:54.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And you can generate the code either""" start="00:07:56.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""via introspecting a live system""" start="00:07:58.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""or providing an XML interface description,""" start="00:08:00.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is handy if you want to use it""" start="00:08:02.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""as part of a non-interactive build.""" start="00:08:04.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I think this has a lot of promise,""" start="00:08:05.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""but it doesn't feel quite right yet,""" start="00:08:08.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so any feedback or contributions are very welcome.""" start="00:08:09.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Let's generate some Elisp code""" start="00:08:14.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""for that hostname1 service we were interacting with before.""" start="00:08:16.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""debase-gen-class is the generation class,""" start="00:08:19.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it says to create a class that matches this interface,""" start="00:08:23.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""named &quot;hostname1&quot;, and then the rest of these arguments""" start="00:08:26.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""are the same ones to target the endpoint,""" start="00:08:29.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""just like with debase-object,""" start="00:08:31.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""because it extends debase-object.""" start="00:08:32.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""debase-gen-code is a generic function""" start="00:08:34.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that takes any debase-gen class.""" start="00:08:37.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""There are different classes for functions,""" start="00:08:40.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""properties, et cetera,""" start="00:08:42.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it creates all of the code for it.""" start="00:08:43.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""If we evaluate it, we can see the results""" start="00:08:45.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""look about like we would expect:""" start="00:08:48.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""creates a defclass named &quot;hostname1&quot;,""" start="00:08:49.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which extends debase-object,""" start="00:08:52.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""has all of the slots and accessors defined,""" start="00:08:53.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and then methods that define everything""" start="00:08:56.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that you might want to do with it, including documentation.""" start="00:08:59.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is based on introspecting a running system,""" start="00:09:01.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""but as I mentioned,""" start="00:09:04.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can provide an XML interface description instead,""" start="00:09:05.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""if you like.""" start="00:09:08.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Debase also comes with &quot;debase-objectmanager&quot;,""" start="00:09:08.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is convenience for the D-Bus ObjectManager interface.""" start="00:09:12.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is used in a lot of places in D-Bus,""" start="00:09:15.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""where an object manages other objects.""" start="00:09:18.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""For example, the NetworkManager object""" start="00:09:20.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""manages network hardware objects,""" start="00:09:22.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and using the ObjectManager interface,""" start="00:09:25.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can enumerate all of the network hardware,""" start="00:09:26.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and by subscribing to the signals,""" start="00:09:28.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can be notified when they change.""" start="00:09:31.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""&quot;debase-objectmanager&quot; keeps a local cache,""" start="00:09:33.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and will fire a callback on any change.""" start="00:09:36.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So it's the building block for that dynamic user interface,""" start="00:09:38.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""like you would see in a desktop system,""" start="00:09:41.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""but inside of Emacs.""" start="00:09:43.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Let's do some demos.""" start="00:09:44.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Discomfort is an interface I wrote for UDisks2,""" start="00:09:47.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is what manages all of the block device hardware.""" start="00:09:51.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And again, it has that dynamic desktop-like interactivity,""" start="00:09:53.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and mostly will just do what you mean.""" start="00:09:57.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is definitely alpha state.""" start="00:10:00.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It doesn't have all the features,""" start="00:10:03.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""but it's good enough that I use it daily.""" start="00:10:04.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So here's Discomfort,""" start="00:10:06.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and you can see it has a list of all your hardware,""" start="00:10:08.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""what type it is, and where it's mounted.""" start="00:10:11.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I have a little USB extension cable here,""" start="00:10:13.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and I'm gonna plug in a disc,""" start="00:10:16.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""just to show you how this works.""" start="00:10:17.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""You can see when I plug it in,""" start="00:10:19.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""just a moment later,""" start="00:10:21.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""it shows up in that list, automatically.""" start="00:10:22.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I don't have to press any key,""" start="00:10:24.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I don't have to refresh it, it's just there.""" start="00:10:25.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""If I unplug it, it's gone.""" start="00:10:27.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Plug it back in,""" start="00:10:29.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and there it is.""" start="00:10:30.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And you can see it's an encrypted volume.""" start="00:10:33.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So in order to do anything with this,""" start="00:10:35.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I'm going to have to supply a password.""" start="00:10:37.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Just pressing Enter goes into the &quot;do what I mean&quot; mode,""" start="00:10:38.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it asks for the password.""" start="00:10:41.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""In this case, I've chosen the very secure password""" start="00:10:43.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of &quot;password&quot;.""" start="00:10:46.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I hit Enter, and it unlocks it, and it mounts it,""" start="00:10:47.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and it opens &quot;dired&quot; looking at it.""" start="00:10:51.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And here's a little README.""" start="00:10:53.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Let's see what it says.""" start="00:10:54.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""&quot;Hello, EmacsConf.&quot;""" start="00:10:55.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So that's my demo of discomfort.""" start="00:10:58.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""In addition to acting as a client for D-Bus,""" start="00:11:01.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Emacs can also offer services to other D-Bus clients.""" start="00:11:05.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is a really interesting opportunity""" start="00:11:09.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""because it allows many different programs""" start="00:11:11.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to integrate with Emacs""" start="00:11:14.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""in ways that were previously very difficult.""" start="00:11:15.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""You can use this as an alternative to Emacs.""" start="00:11:17.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The difference is D-Bus provides a full API,""" start="00:11:20.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""so instead of emacsclient being""" start="00:11:23.200" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""a sort of fire-and-forget system,""" start="00:11:25.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""you can actually get results back from the remote operation.""" start="00:11:26.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So here's some code.""" start="00:11:30.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Here's a dbus-eval function, which takes a string,""" start="00:11:32.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""reads it, and evaluates it,""" start="00:11:35.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and returns whatever that value is.""" start="00:11:37.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Then we have a debase-bind block""" start="00:11:39.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that sets up an object on the session bus.""" start="00:11:41.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Again, that's my user login bus.""" start="00:11:44.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It offers this D-Bus service Emacs.""" start="00:11:46.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is a constant inside of the dbus.el package.""" start="00:11:49.560" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And again, the path is a constant in there.""" start="00:11:53.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And we're gonna create this interface,""" start="00:11:55.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""org.gnu.Emacs.Eval, and then register a method called Eval""" start="00:11:57.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that calls that dbus-eval function.""" start="00:12:02.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Pretty straightforward, only a handful of lines of code.""" start="00:12:04.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""To test this out, we're going to use the dbus-send utility.""" start="00:12:08.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""This is a command line program that interacts with D-Bus.""" start="00:12:12.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""We're going to tell it to wait for and print the reply,""" start="00:12:15.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that the message should be sent to the session bus,""" start="00:12:18.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that we're going to talk""" start="00:12:21.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to the org.gnu.Emacs service on that bus,""" start="00:12:22.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and the /org/gnu/Emacs object inside that service.""" start="00:12:25.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""On that object, we're gonna interact""" start="00:12:30.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with the org.gnu.Emacs.Eval interface""" start="00:12:33.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and call its Eval method.""" start="00:12:36.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""We're gonna call that method with a single string argument,""" start="00:12:37.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which is indicated by the string prefix,""" start="00:12:40.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and then a form to evaluate.""" start="00:12:42.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I actually have to run this from a shell,""" start="00:12:45.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""because if I try using it in Org, it wedges.""" start="00:12:47.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""org-babel blocks waiting on completion,""" start="00:12:49.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""which blocks the D-Bus service from responding.""" start="00:12:51.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I really wish Emacs was multi-threaded.""" start="00:12:54.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""But let's try it out.""" start="00:12:57.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So if we run this, we can see that we get a return,""" start="00:12:59.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and that's an unsigned integer of 32 bits""" start="00:13:02.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with a value of 3.""" start="00:13:05.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So like I was saying, this is really a two-way API""" start="00:13:06.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""where you can communicate back and forth""" start="00:13:09.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""between Emacs and another program.""" start="00:13:11.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""It's not just fire-and-forget.""" start="00:13:13.400" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I think that's really cool.""" start="00:13:14.960" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""Let's try another demo.""" start="00:13:16.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""What about a remote org-capture?""" start="00:13:18.520" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""What if you could trigger an org-capture""" start="00:13:20.600" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""from any program on your desktop?""" start="00:13:23.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I think that would be pretty cool.""" start="00:13:24.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And we can see, there it is.""" start="00:13:26.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""All right, I think I've got that one covered.""" start="00:13:30.240" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""So I do want to say that remote eval is probably a bad idea""" start="00:13:38.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""from a security perspective,""" start="00:13:42.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""but the point of this is some quick and dirty demonstrations""" start="00:13:43.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""of what can happen and to get people's imaginations flowing,""" start="00:13:46.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""because I think this is something""" start="00:13:49.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that offers a lot of promise for Emacs.""" start="00:13:51.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I think having a full-blown Emacs desktop environment""" start="00:13:54.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""where it can do all the things that a GNOME""" start="00:13:57.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""or a KDE environment can do is very exciting.""" start="00:13:59.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""And if you want to have a traditional GUI with Emacs""" start="00:14:02.760" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""as a more integrated participant of it,""" start="00:14:06.440" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""its service mechanism offers a lot of ability to do that.""" start="00:14:08.680" video="mainVideo-dbus" id="subtitle"]]
+[[!template new="1" text="""In the micro sense, I think there's a lot of improvements""" start="00:14:11.880" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""that can be made to either dbus.el or to dbase.""" start="00:14:16.000" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""The main one is handling of the type system.""" start="00:14:19.280" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Lisp's dynamic type system doesn't mesh particularly well""" start="00:14:21.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""with the static strong type system that D-bus offers,""" start="00:14:25.840" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and having some convenience to assist that""" start="00:14:28.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""would be very helpful.""" start="00:14:31.360" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""There's also some weird interfaces.""" start="00:14:32.640" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""For example, some things return identifiers""" start="00:14:35.320" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""as an array of integer code points instead of a string,""" start="00:14:38.120" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and there should be a common way of handling that.""" start="00:14:40.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""I also think that the service support could be improved.""" start="00:14:43.720" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Even though I gave the demo service,""" start="00:14:46.160" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""it's not really a great D-bus citizen""" start="00:14:48.040" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""because it doesn't offer that introspection mechanism,""" start="00:14:50.480" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""and so the actual methods are pretty much invisible""" start="00:14:53.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""to other participants,""" start="00:14:55.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""unless they already know that you're using Emacs.""" start="00:14:56.920" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""That's my talk.""" start="00:15:00.080" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""Thank you.""" start="00:15:01.800" video="mainVideo-dbus" id="subtitle"]]
+[[!template text="""You can find me on mastodon.social or on libera.chat.""" start="00:15:02.560" video="mainVideo-dbus" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20dbus%3A%20The%20Wheels%20on%20D-Bus)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/dbus-before.md b/2022/info/dbus-before.md
new file mode 100644
index 00000000..fac93a6c
--- /dev/null
+++ b/2022/info/dbus-before.md
@@ -0,0 +1,62 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="dbus">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect stroke-width="3" x="588" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 16-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-dbus>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T20:15:00Z" end="2022-12-04T20:35:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~3:15 PM - 3:35 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~2:15 PM - 2:35 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~1:15 PM - 1:35 PM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~12:15 PM - 12:35 PM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~8:15 PM - 8:35 PM UTC <br />Sunday, Dec 4 2022, ~9:15 PM - 9:35 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~10:15 PM - 10:35 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~1:45 AM - 2:05 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~4:15 AM - 4:35 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~5:15 AM - 5:35 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="dbus-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="dbus-mainVideo" data="""
+00:00.000 What is D-Bus?
+01:07.880 Why D-Bus?
+01:45.360 The D-Bus Model
+02:55.360 Well-known Busses
+03:20.000 Common interfaces
+04:06.240 Emacs Native D-Bus
+05:09.320 Debase
+05:23.880 Debase: Objects
+06:13.440 Debase: Retarget objects
+06:51.080 Debase: Object binding
+07:12.480 Debase: Raw binding
+07:29.400 Debase: Codegen
+08:14.200 Debase: Codegen example
+09:08.680 Debase: ObjectManager
+09:44.480 Demo: Discomfort
+11:01.480 Demo: Remote eval
+13:16.280 Demo: Remote Org capture
+14:11.880 Future directions
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.webm">Download --main.webm (54MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.opus">Download --main.opus (11MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.org">Download --main.org</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/uwgjHJvZF9cv5KcYFZmdNz">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="dbus-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="dbus-qanda" data="""
+00:46.840 D-Feet graphical debugger
+01:37.000 Emacs desktop environment
+04:58.160 How long has D-Bus been around, and what was in place before that?
+07:48.360 Why is everything D-Bus prefixed with "org."?
+08:28.480 Do most OS/desktop environment/window managers interoperate well over D-Bus?
+10:08.720 There is a lot of criticism against D-Bus out there. Why do you think that might be?
+11:37.560 Which system services come to mind when thinking about applications, be it at the OS/DE/WM level?
+12:19.720 When it comes to managing devices, how are D-Bus and udev related?
+13:33.280 What is something D-Bus does that you couldn't do before? What is a really cool use of D-Bus in a modern desktop environment?
+15:08.880 Can you explain briefly what clients and services can do with properties?
+17:49.920 Is there such a thing as a D-Bus reflection browser, maybe Emacs-based, that lets you discover all the behavior different D-Bus app participants provide?
+18:17.760 Next question, D-Bus seems great for extensibility, but then Emacs has no such mechanism and is fantastically more extensible. Why do you think this is so?
+19:25.200 Do you have any other cool D-Bus ideas?
+19:54.640 Are there buses besides system and session? Is there anything more to a bus besides a way to group objects?
+22:52.280 What do you use it for?
+25:12.480 It looks like dBus is mostly useful for Emacs to do IPC -- IIUC, this is how synctex works when working with LaTeX docs. How does it compare with other ways of doing IPC, for example, communicating over a socket with MPD?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="dbus-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.webm">Download --answers.webm (18MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--answers.opus">Download --answers.opus (9.8MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/dbus-nav.md b/2022/info/dbus-nav.md
new file mode 100644
index 00000000..de8d811a
--- /dev/null
+++ b/2022/info/dbus-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/grail">GRAIL---A Generalized Representation and Aggregation of Information Layers</a>
+Next by track: <a href="/2022/talks/indieweb">Putting Org Mode on the Indieweb</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/detached-after.md b/2022/info/detached-after.md
new file mode 100644
index 00000000..21abac9b
--- /dev/null
+++ b/2022/info/detached-after.md
@@ -0,0 +1,182 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="detached-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, everyone! Welcome to my talk,""" start="00:00:00.000" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""&quot;Getting detached from Emacs&quot;.""" start="00:00:04.454" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""When I started to use Emacs,""" start="00:00:07.321" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I quickly gravitated towards using it""" start="00:00:09.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""as much as I could.""" start="00:00:12.920" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Magit, Org, Dired,""" start="00:00:15.000" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""a lot of new possibilities opened up.""" start="00:00:17.880" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""However, there was a workflow""" start="00:00:21.360" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""that was difficult for me to replace.""" start="00:00:23.280" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""The problem for me was running shell commands""" start="00:00:27.120" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""in sub-processes of Emacs,""" start="00:00:30.120" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""which in some situations led me to stick to""" start="00:00:32.560" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""using an external terminal.""" start="00:00:34.880" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""These situations,""" start="00:00:38.000" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""often revolved around long-running shell commands,""" start="00:00:39.688" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""either on my local machine""" start="00:00:43.354" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""or on a remote host.""" start="00:00:46.154" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""When I was on a remote host,""" start="00:00:48.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I would also rely on using the program tmux""" start="00:00:50.240" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to be able to detach from the remote process.""" start="00:00:52.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""My main concern at the time""" start="00:00:57.280" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""was that I didn't want to having to avoid""" start="00:00:59.621" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""restarting Emacs,""" start="00:01:01.954" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""because I needed to wait for a process to complete.""" start="00:01:03.440" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""However, there was of course a lot of things""" start="00:01:07.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I was missing out on by not using Emacs.""" start="00:01:11.200" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""Therefore, my solution to resolving""" start="00:01:15.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""the issue of occasionally having to leave Emacs""" start="00:01:19.760" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""led me down the path of developing the package""" start="00:01:22.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Detached.""" start="00:01:26.188" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""The package allows Emacs to delegate""" start="00:01:28.321" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""the responsibility of creating processes""" start="00:01:31.160" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to the program dtach.""" start="00:01:33.640" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""It also makes sure to write""" start="00:01:36.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""the output of the process to a file,""" start="00:01:39.121" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""which we will see later on how that is being used.""" start="00:01:44.421" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""The package makes Emacs capable of""" start="00:01:48.254" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""attaching to these processes""" start="00:01:50.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""as well as managing them.""" start="00:01:53.120" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""In the package, each process is called a session,""" start="00:01:55.280" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and inside of Emacs that is just""" start="00:01:58.880" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""an object with properties""" start="00:02:01.040" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""such as what command is being run,""" start="00:02:02.560" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""what working directory is used,""" start="00:02:04.688" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""where the output is stored, etc.""" start="00:02:06.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""The important aspect is also that""" start="00:02:10.240" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""these objects are being persistent,""" start="00:02:12.480" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""so they are stored over time.""" start="00:02:16.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Today, I'm going to walk you through""" start="00:02:20.221" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""how I use the package and what advantages""" start="00:02:22.920" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""there are of treating processes like text.""" start="00:02:26.154" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""I'm going to start by opening up M-x shell,""" start="00:02:30.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and I will run a command""" start="00:02:35.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to update my package manager.""" start="00:02:40.388" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Instead of pressing return,""" start="00:02:46.920" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I'll simply press shift return""" start="00:02:48.354" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to let Emacs delegate the execution""" start="00:02:50.240" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to the dtach program.""" start="00:02:52.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Emacs will immediately attach itself to the process,""" start="00:02:54.920" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and we therefore don't perceive any difference""" start="00:02:57.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""from when running the command as a subprocess.""" start="00:03:00.960" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""We now have the option though""" start="00:03:04.480" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to detach from the session,""" start="00:03:06.588" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and later on we can of course""" start="00:03:09.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""reattach Emacs to the session.""" start="00:03:12.080" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""For me, this addresses the core""" start="00:03:17.154" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""of the problem that I had.""" start="00:03:20.521" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""But let’s see what’s more""" start="00:03:23.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""the new workflow inside of Emacs can bring.""" start="00:03:25.040" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""The package supports multiple user interfaces""" start="00:03:30.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""such as Eshell and Compile.""" start="00:03:35.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I will therefore switch to the Detached project,""" start="00:03:39.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and I will run the build command that I use.""" start="00:03:43.360" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I will run it with detached-compile""" start="00:03:49.440" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""with the difference that""" start="00:03:54.040" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I can detach from the compilation.""" start="00:03:55.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""One benefit of this new workflow is that""" start="00:03:59.800" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I can get a system notification shown up here""" start="00:04:05.000" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""once a session has finished.""" start="00:04:08.680" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Previously, I was either forced to have""" start="00:04:10.760" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""the terminal open so I could see it or hiding it,""" start="00:04:15.520" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""but then risking having forgotten it.""" start="00:04:19.040" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""How do we then see the output of a session?""" start="00:04:27.854" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Get the detached-list-sessions command,""" start="00:04:32.560" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and here we see""" start="00:04:36.888" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""the command that we just built,""" start="00:04:42.954" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and we see the guix pull with an asterisk""" start="00:04:45.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""indicating that it is continuously running.""" start="00:04:48.440" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""If I press enter,""" start="00:04:54.480" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""we will get the output of the session here.""" start="00:05:01.521" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""And since it was run using compile,""" start="00:05:04.440" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""we also have compilation mode enabled here,""" start="00:05:07.200" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""so we could navigate between""" start="00:05:11.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""potential warnings or errors.""" start="00:05:14.288" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""And we see that there is a warning here.""" start="00:05:17.160" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""One thing that""" start="00:05:21.440" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I have prepared here is that""" start="00:05:26.721" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""if I open up the user interface,""" start="00:05:28.920" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""we only see two sessions,""" start="00:05:32.240" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""but that is because we applied a filter here.""" start="00:05:35.760" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, we have actually the only sessions""" start="00:05:39.088" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""that are created within the last 12 hours""" start="00:05:43.160" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and that are considered unique.""" start="00:05:46.000" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, if I remove the uniqueness,""" start="00:05:47.360" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""we also see that we have a previous build""" start="00:05:50.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""running on the main branch.""" start="00:05:57.040" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, I think that's typically normal""" start="00:05:59.280" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""that you might have that.""" start="00:06:02.760" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""And since the sessions can be considered text,""" start="00:06:07.080" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""we can just mark these two and check,""" start="00:06:10.920" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""does this warning exist on the main branch or not?""" start="00:06:14.760" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, we can just diff these ones""" start="00:06:18.880" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and we see that the warning is only present""" start="00:06:22.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""on the emacsconf branch.""" start="00:06:27.554" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""Now, another benefit, in my opinion,""" start="00:06:34.040" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""of the new way of working is that""" start="00:06:37.520" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I have these properties being displayed""" start="00:06:41.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""in the user interface.""" start="00:06:43.240" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I can quickly see which commands are still running,""" start="00:06:45.421" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""what hosts they are running on,""" start="00:06:48.960" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""where they are running,""" start="00:06:51.360" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and for how long they have been running.""" start="00:06:53.488" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""And if they have run,""" start="00:06:58.221" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""how long did it take?""" start="00:07:00.421" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""Occasionally, though, there might be""" start="00:07:04.521" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""even more input needed to distinguish sessions.""" start="00:07:06.880" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, what I typically do then is""" start="00:07:16.880" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""press A to annotate the session,""" start="00:07:19.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I would add a &quot;Warning found at emacsconf&quot;""" start="00:07:22.200" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""And then it will show up this annotation""" start="00:07:29.088" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""in the echo area when I select the session.""" start="00:07:32.954" video="mainVideo-detached" id="subtitle"]]
+[[!template new="1" text="""Another great improvement of using these sessions""" start="00:07:45.088" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and consider them being text is,""" start="00:07:48.080" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""now we also see the guix pull completed here.""" start="00:07:52.640" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Then we can also select and see that, okay,""" start="00:07:57.421" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""there is a lot of updates in this command,""" start="00:08:01.021" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""but let's not look at it now.""" start="00:08:08.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Let's instead remember that""" start="00:08:10.160" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""previously last week""" start="00:08:17.654" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""when I ran a guix pull,""" start="00:08:19.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I saw an Emacs package that looks interesting.""" start="00:08:21.640" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I rather don't remember its full name,""" start="00:08:27.680" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""but it has something to do with collection.""" start="00:08:30.040" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, what I then can do is""" start="00:08:32.720" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""remove the 12 hour narrowing criteria,""" start="00:08:38.840" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and we can see here I got sessions ranging back""" start="00:08:42.280" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""even to 28th of October.""" start="00:08:47.680" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Since these are just to be considered text,""" start="00:08:51.040" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""I can--""" start="00:08:55.600" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""now let's first narrow the sessions""" start="00:08:58.754" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to only show the ones that run guix pull.""" start="00:09:00.320" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Then I would narrow based on the output""" start="00:09:05.288" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""containing a regular expression.""" start="00:09:08.440" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, I remember it was something with collection.""" start="00:09:11.280" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""And we got one hit.""" start="00:09:14.400" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Here it should be something with collection.""" start="00:09:20.088" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""It was emacs-flymake-collection.""" start="00:09:24.188" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""This is something that is a""" start="00:09:29.621" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""very nice feature to have.""" start="00:09:34.821" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""It doesn't create any overhead""" start="00:09:38.400" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""of having these old sessions lying around""" start="00:09:42.160" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""and occasionally, it can be interesting""" start="00:09:45.280" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""to search through them as well.""" start="00:09:47.400" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""So, for me, this is another example of""" start="00:09:49.680" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""when bringing workflows into Emacs,""" start="00:09:55.000" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""it often opens up new exciting possibilities.""" start="00:10:00.054" video="mainVideo-detached" id="subtitle"]]
+[[!template text="""Thanks a lot for listening.""" start="00:10:05.121" video="mainVideo-detached" id="subtitle"]]
+
+
+
+Captioner: anush
+
+Questions or comments? Please e-mail [niklas.eklund@posteo.net](mailto:niklas.eklund@posteo.net?subject=Comment%20for%20EmacsConf%202022%20detached%3A%20Getting%20detached%20from%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/detached-before.md b/2022/info/detached-before.md
new file mode 100644
index 00000000..b3139527
--- /dev/null
+++ b/2022/info/detached-before.md
@@ -0,0 +1,50 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Niklas Eklund shows how to use detached to manage long-running asynchronous processes, including how to search through and compare session results. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="detached">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect stroke-width="3" x="378" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 11-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-detached>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T18:01:00Z" end="2022-12-04T18:16:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~1:01 PM - 1:16 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~12:01 PM - 12:16 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~11:01 AM - 11:16 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~10:01 AM - 10:16 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~6:01 PM - 6:16 PM UTC <br />Sunday, Dec 4 2022, ~7:01 PM - 7:16 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~8:01 PM - 8:16 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~11:31 PM - 11:46 PM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~2:01 AM - 2:16 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~3:01 AM - 3:16 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="detached-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="detached-mainVideo" data="""
+00:00.000 Intro
+00:27.120 The problem
+01:15.800 My solution: detached
+02:30.840 Shell
+03:30.800 Compile
+04:27.854 Detached list sessions
+05:21.440 Narrow criteria
+06:07.080 Diff sessions
+06:34.040 Rich interface with properties
+07:04.521 Annotation
+07:45.088 Searching through sessions
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.webm">Download --main.webm (42MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.opus">Download --main.opus (4.7MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/5g6W1vPuWeHognYnvnnbNk">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="detached-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="detached-qanda" data="""
+00:32.880 Can it replace ssh+tmux for persistent sessions on remote hosts?
+01:16.880 I see integration with projectile in the readme. Does it also integrate with project.el?
+03:51.240 Can you detach a session from shell-mode and reattach from eshell/vterm/term-mode? Or start a compile in shell-mode and attach it from compilation-mode?
+05:45.120 How do you talk to detached? Could it be feasible to run a child Emacs instead of detached?
+07:45.880 How does it handle processes that require user input?
+09:20.000 Can you rerun a command (session?) but in another directory?
+12:22.880 What are some other places where this might be useful?
+16:59.720 What are you currently excited about in Emacs?
+19:27.400 Bug in detached re: eshell and quotes
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="detached-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.webm">Download --answers.webm (53MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-detached--getting-detached-from-emacs--niklas-eklund--answers.opus">Download --answers.opus (8.9MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/detached-nav.md b/2022/info/detached-nav.md
new file mode 100644
index 00000000..0a9a505f
--- /dev/null
+++ b/2022/info/detached-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/hyperorg">Powerful productivity with Hyperbole and Org Mode</a>
+Next by track: <a href="/2022/talks/eshell">Top 10 reasons why you should be using Eshell</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/devel-after.md b/2022/info/devel-after.md
new file mode 100644
index 00000000..d2f37446
--- /dev/null
+++ b/2022/info/devel-after.md
@@ -0,0 +1,133 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="devel-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, it's time for another Emacs development update.""" start="00:00:00.000" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""I want to thank the organizers of EmacsConf""" start="00:00:05.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""for putting this together""" start="00:00:07.800" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and also the maintainers of Emacs""" start="00:00:10.160" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""with a special thanks to Eli Zaretskii.""" start="00:00:12.280" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""It's really he who gave me this information""" start="00:00:14.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""so that I could pass it along to you.""" start="00:00:16.520" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""The main thing to discuss this time""" start="00:00:19.360" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""with regard to what's been going on with Emacs is Emacs 29.""" start="00:00:21.720" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""The release cycle for Emacs 29 should begin in December""" start="00:00:25.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""when a branch will be cut and the release work will start.""" start="00:00:29.840" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""We should be seeing Emacs 29 coming out fairly soon.""" start="00:00:32.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Here's just a brief overview""" start="00:00:36.600" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""of some of the things to look forward to""" start="00:00:38.120" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""coming up in Emacs 29.""" start="00:00:39.680" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""Overlays have been re-implemented.""" start="00:00:42.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""If you haven't used them before,""" start="00:00:45.680" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""overlays are a way to apply a set of properties""" start="00:00:47.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""over a range of text so that""" start="00:00:50.960" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""you can have things like mouse clicks""" start="00:00:53.560" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""take on different behavior""" start="00:00:55.840" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""depending on where it happens in the text.""" start="00:00:57.920" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""This is different than text properties""" start="00:00:59.520" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""which associate the properties with the text itself.""" start="00:01:01.720" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Overlays do not alter the text in any way""" start="00:01:04.080" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and they simply, as the name suggests,""" start="00:01:07.200" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""overlay on the buffer.""" start="00:01:09.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Now previously, overlays were implemented as linear lists""" start="00:01:10.920" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""which got very slow when there were""" start="00:01:14.040" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""a lot of overlays in a buffer.""" start="00:01:15.800" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Now they're being re-implemented as trees,""" start="00:01:17.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""so that searching should be very fast, and""" start="00:01:19.920" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""in fact, comparable to text properties.""" start="00:01:21.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""This is already on the master branch""" start="00:01:24.440" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and (more or less) is ready for release.""" start="00:01:26.520" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""Eglot has been ported into Emacs.""" start="00:01:29.280" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Eglot is an LSP [Language Server Protocol] client for Emacs,""" start="00:01:32.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""one of the two that are often used.""" start="00:01:36.960" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""But now it's going to be included in core,""" start="00:01:38.440" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""so it's considered official""" start="00:01:40.840" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and will be well integrated with other Emacs features.""" start="00:01:42.760" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""There's going to be a Tree-sitter library.""" start="00:01:46.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Tree-sitter is a way of building fast incremental parsers.""" start="00:01:48.640" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""There's a website on Tree-sitter if you Google for that.""" start="00:01:53.200" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""This can be used for various features,""" start="00:01:56.040" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""but first and foremost, it'll be used""" start="00:01:57.800" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""for fontification and indentation in Emacs.""" start="00:01:59.720" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Instead of heuristics and regular expressions,""" start="00:02:02.840" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""you can now build your fontifications""" start="00:02:05.600" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""based on a parse tree.""" start="00:02:07.400" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""There's a branch now that supports this""" start="00:02:09.080" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""for several modes already, like Python, TypeScript,""" start="00:02:10.640" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and JavaScript.""" start="00:02:13.680" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""We don't have anyone yet working on it for C mode""" start="00:02:15.000" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""but Eli has challenged whether anyone""" start="00:02:18.120" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""in the community is interested.""" start="00:02:20.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""He would love to see Tree-sitter support added for C mode,""" start="00:02:21.960" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""because this has been quite slow""" start="00:02:25.960" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""when dealing with very, very large files""" start="00:02:27.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and Tree-sitter should help that.""" start="00:02:29.640" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""There have been significant improvements""" start="00:02:32.000" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""in dealing with very long lines.""" start="00:02:34.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""This is something that has been""" start="00:02:36.680" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""a long time frequent complaint.""" start="00:02:38.160" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Emacs becomes rather unusable""" start="00:02:40.800" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""if you open a giant file that's a single long line.""" start="00:02:42.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Anyone who's ever tried to open a 30 megabyte JSON file""" start="00:02:45.840" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""that's all on one line will know this pain.""" start="00:02:49.560" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Some modes, however, will have to adapt to this change,""" start="00:02:52.200" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""because sometimes access to the whole buffer""" start="00:02:55.960" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""is now forcefully restricted.""" start="00:02:58.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""If the mode requires access to the entire buffer""" start="00:03:00.440" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""at all times to work, then the developer of that mode""" start="00:03:04.400" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""will need to devise some simplifications""" start="00:03:08.000" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""so that they don't require that complete access.""" start="00:03:10.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""For example, if a mode used to go way back""" start="00:03:13.160" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""to the beginning of the buffer""" start="00:03:15.760" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""in order to determine if there's an unbalanced parenthesis,""" start="00:03:16.920" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""this won't work in the new long lines support mode,""" start="00:03:19.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""because the entire buffer is not always available.""" start="00:03:23.040" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Emacs is sort of doing some""" start="00:03:25.840" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""restricting of the buffer heuristically""" start="00:03:27.720" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""in order to keep the visible range working""" start="00:03:29.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""very, very quickly now.""" start="00:03:32.480" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""Emacs can now build directly with SQLite.""" start="00:03:35.280" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""This means that SQLite databases""" start="00:03:39.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""can be directly accessible from Emacs.""" start="00:03:42.360" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Should be nice for anyone whose mode wants to""" start="00:03:44.880" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""cache or store some queryable data.""" start="00:03:47.360" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""The XInput extension is now up to version 2.""" start="00:03:50.080" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""There are many extensions in this specification.""" start="00:03:54.960" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""From the user's point of view,""" start="00:03:58.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""it enables things like smooth scrolling and touch devices.""" start="00:03:59.800" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Emacs will now use this by default on all systems""" start="00:04:03.360" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""where the library is installed.""" start="00:04:06.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""It should be on every modern system that uses X.""" start="00:04:08.560" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""There's also a pure GTK build in Emacs 29.""" start="00:04:11.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""The purpose of this is to allow Emacs""" start="00:04:15.520" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""on systems without X, such as Wayland or Broadway,""" start="00:04:17.560" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""to be able to have a graphical build of Emacs.""" start="00:04:21.160" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""There's also lots of improvements to drag and drop""" start="00:04:24.160" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""on X systems, for people who like drag and drop.""" start="00:04:27.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""And there's support for double buffering on Microsoft Windows.""" start="00:04:31.360" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""The last of the headline features""" start="00:04:34.280" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""coming for Emacs 29 is emoji input.""" start="00:04:38.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""So there will now be a prefix key,""" start="00:04:41.160" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""C-x 8 e for emoji input,""" start="00:04:43.520" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""along with several new commands to insert emoji""" start="00:04:47.320" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""by various forms of shorthand.""" start="00:04:50.240" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""There will even be an input method""" start="00:04:52.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""where you can write the plain English names of emojis""" start="00:04:54.360" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and have the symbol inserted.""" start="00:04:57.560" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""So that rounds out some of the features""" start="00:04:59.120" video="mainVideo-devel" id="subtitle"]]
+[[!template new="1" text="""coming up for Emacs 29.""" start="00:05:02.160" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""Sounds like an exciting release""" start="00:05:03.680" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and it should be headed your way soon.""" start="00:05:05.680" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""I hope everybody has fun at the conference""" start="00:05:07.480" video="mainVideo-devel" id="subtitle"]]
+[[!template text="""and enjoy yourselves.""" start="00:05:09.920" video="mainVideo-devel" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20devel%3A%20Emacs%20development%20updates)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/devel-before.md b/2022/info/devel-before.md
new file mode 100644
index 00000000..d2576923
--- /dev/null
+++ b/2022/info/devel-before.md
@@ -0,0 +1,21 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, John Wiegley will briefly summarize important developments on the road to Emacs 29. He will not be able to answer questions right now, but you can post questions in the pad and he can follow up after the event.
+
+<div class="vid"><video controls preload="none" id="devel-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="devel-mainVideo" data="""
+00:00.000 Introduction
+00:19.320 Emacs 29 release cycle
+00:42.400 Overlays
+01:29.080 Eglot
+01:46.480 Tree-sitter
+02:30.840 Very long lines
+03:35.240 SQLite
+03:50.080 XInput
+04:11.320 Pure GTK build
+04:24.640 Drag and drop
+04:31.400 Double-buffering on Microsoft Windows
+04:35.240 Emoji input
+05:00.080 End
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.webm">Download --main.webm (33MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.opus">Download --main.opus (2.8MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-devel--emacs-development-updates--john-wiegley--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/o8S5uKpPTCD717zwHPd5cD">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/devel-nav.md b/2022/info/devel-nav.md
new file mode 100644
index 00000000..9335964b
--- /dev/null
+++ b/2022/info/devel-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/localizing">Pre-localizing Emacs</a>
+Next by track: <a href="/2022/talks/fanfare">Fanfare for the Common Emacs User</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/eev-after.md b/2022/info/eev-after.md
new file mode 100644
index 00000000..7368a306
--- /dev/null
+++ b/2022/info/eev-after.md
@@ -0,0 +1,173 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="eev-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Hi! My name is Eduardo Ochs. I'm the author""" start="00:00:00.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""of an Emacs package called eev, and the name""" start="00:00:04.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""of this presentation is: &quot;Bidirectional links""" start="00:00:06.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""in eev&quot;.""" start="00:00:09.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Let me present things in a weird order,""" start="00:00:10.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""starting by the new feature, and then I'm""" start="00:00:13.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""going to explain the whole context.""" start="00:00:16.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""One of the main features that we are""" start="00:00:20.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""going to see here is this function here,""" start="00:00:22.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""M-x kla, and kla is a mnemonic for &quot;kill""" start="00:00:24.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Link to Anchor&quot;. Let me explain... let me""" start="00:00:27.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""demonstrate how it works. This thing here""" start="00:00:31.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""with the green angle brackets is an""" start="00:00:33.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""anchor, this thing between the green""" start="00:00:36.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""angle brackets is a tag of an""" start="00:00:40.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""anchor, and if I type M-x kla here""" start="00:00:42.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it highlights this tag for a second and""" start="00:00:46.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it says &quot;Copied to the kill ring: blah""" start="00:00:49.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""blah blah...&quot; and this thing here is a link.""" start="00:00:52.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""I can insert the link here, I""" start="00:00:54.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""can insert the link in my notes...""" start="00:00:57.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and if I execute this thing this link""" start="00:01:00.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""here it goes to this anchor in this file.""" start="00:01:03.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""If you have a recent version of eev""" start="00:01:10.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""installed then trying this feature""" start="00:01:12.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""should be very easy...""" start="00:01:13.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""you just need to open the this file here,""" start="00:01:15.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""in which everything is defined, and then""" start="00:01:18.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""go to this section at the beginning of""" start="00:01:21.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""the file, and then run the three blocks""" start="00:01:23.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""of tests that are there.""" start="00:01:26.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""This block corresponds roughly to what""" start="00:01:28.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""we have just done...""" start="00:01:31.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""this other block""" start="00:01:33.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""is slightly different because it shows""" start="00:01:36.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""some variants of kla... one is with `f`""" start="00:01:40.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""instead of an `a` here, let me""" start="00:01:44.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""show how it works... if we type""" start="00:01:48.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""`M-x eeklf` or just `M-x klf`""" start="00:01:51.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""we get a link to this file that does not""" start="00:01:57.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""point to an anchor, and if we type""" start="00:02:00.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""`M-x klt` we get another kind of link that""" start="00:02:03.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""is a link to an anchor in the same""" start="00:02:07.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""file...""" start="00:02:09.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and the third block""" start="00:02:11.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""is more interesting because it lets""" start="00:02:16.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""people create links to files that""" start="00:02:18.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""are elsewhere, and that do not have""" start="00:02:20.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""anchors in them...""" start="00:02:23.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""let me execute this... this will""" start="00:02:25.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""run this sexp here and display the""" start="00:02:29.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""target at the window at the right...""" start="00:02:32.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""this is one of the source files of Emacs.""" start="00:02:35.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Let's imagine that I want to create a""" start="00:02:41.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""link to this string here... then I can""" start="00:02:43.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""type `M-x klfs`, and this will create a""" start="00:02:46.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""link to a file and to a string in that""" start="00:02:51.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""file. So if I type ENTER here""" start="00:02:53.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it says: &quot;Copied to the kill ring: ...\""" start="00:02:56.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and this is a link to this file here,""" start="00:02:59.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and to the first occurrence of this""" start="00:03:02.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""string in this file.""" start="00:03:04.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""So: how does this work (inside)?...""" start="00:03:10.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""when I was trying to write the documentation""" start="00:03:14.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""of this I tried to write a summary of""" start="00:03:16.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""how the algorithm works, and I failed and""" start="00:03:19.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""I tried again, and I failed again,""" start="00:03:21.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""several times... and then I gave up and I""" start="00:03:23.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""decided to write an intro - a tutorial,""" start="00:03:26.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""this one -""" start="00:03:29.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""that explains everything with lots of""" start="00:03:31.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""details, and with lots of sections""" start="00:03:34.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""with &quot;Try it!&quot;s, that""" start="00:03:35.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""have examples that you you can run to""" start="00:03:39.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""understand things, to examine how some""" start="00:03:41.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""functions work, how the data""" start="00:03:44.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""structures work, and so on...""" start="00:03:48.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""the problem is that sometimes we have""" start="00:03:51.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""several hyperlinks that point to the to""" start="00:03:54.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""the same file. Let me give an example.""" start="00:03:56.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""In the configuration in which I am now,""" start="00:04:00.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""in this file here... the old way of""" start="00:04:04.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""generating hyperlinks to this file""" start="00:04:07.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""with `find-here-links`""" start="00:04:08.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""will generate a temporary buffer""" start="00:04:10.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""like this, and then I would have to""" start="00:04:13.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""choose which one of these hyperlinks I""" start="00:04:15.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""find best, which one I prefer, and then""" start="00:04:18.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""copy it to my notes... so instead""" start="00:04:21.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""of choosing a hyperlink this thing here""" start="00:04:25.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""shows all the options.""" start="00:04:27.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""And in the new way, in `M-x kla`""" start="00:04:30.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and friends, there's an algorithm that""" start="00:04:34.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""chooses the best short hyperlink by""" start="00:04:37.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""itself, and this algorithm is a bit hard""" start="00:04:39.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""to explain... let me demonstrate it here.""" start="00:04:43.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Again, we have all these options here, of""" start="00:04:46.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""hyperlinks to this file...""" start="00:04:50.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and if I type `M-x klf`""" start="00:04:51.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it chooses one of them.""" start="00:04:56.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""And of course I can copy it to my notes,""" start="00:04:58.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it's going to work, it's going to point""" start="00:05:01.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""to here... and so on.""" start="00:05:02.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Well, the title of this presentation was""" start="00:05:05.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""&quot;Bidirectional links with eev&quot;... let me""" start="00:05:08.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""show what I mean by bi-directional""" start="00:05:11.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""hyperlinks, and how we can use this thing""" start="00:05:13.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""to create bidirectional hyperlinks""" start="00:05:15.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""very quickly.""" start="00:05:17.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""I will have to use a smaller font... let""" start="00:05:19.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""me open these two files here. This one at""" start="00:05:22.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""the left is a program in Haskell, and""" start="00:05:25.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""this one is a file with my notes on""" start="00:05:27.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Haskell.""" start="00:05:30.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""How do I create a link from...""" start="00:05:31.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""to this file in Haskell""" start="00:05:35.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""to put it in this file here? I can put""" start="00:05:39.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""the cursor here, in any position""" start="00:05:42.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""after this anchor here, and type""" start="00:05:45.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""`M-x kla`...""" start="00:05:48.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it copies this link here to the kill""" start="00:05:49.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""ring and then I can can go here and""" start="00:05:51.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""either insert it with C-y (yank), or""" start="00:05:54.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""insert it with `M-k kli`, that adds a""" start="00:05:59.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""comment prefix here.""" start="00:06:06.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""So this is a way to create a link from""" start="00:06:07.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""here to there in which every""" start="00:06:11.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""comment has to be given explicitly...""" start="00:06:15.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""but I also implemented a way to""" start="00:06:18.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""create the two links at the same time.""" start="00:06:21.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""I don't use it much, it's mostly for""" start="00:06:23.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""demos, because it's impressive, I wanted""" start="00:06:25.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""to show that in this presentation...""" start="00:06:27.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""Anyway, let me show it here. Note that""" start="00:06:29.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""that in this file here the point is""" start="00:06:33.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""here, in this file the point is here...""" start="00:06:36.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""My trick is going to create a link to""" start="00:06:40.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""this anchor and put it in this file, and""" start="00:06:43.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it's going to create a link to this""" start="00:06:47.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""anchor and put it in this file...""" start="00:06:49.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""So, here it goes: `M-x kla2`... ta-da!""" start="00:06:52.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""it highlighted the true anchors for a""" start="00:06:57.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""second, and it created these things here""" start="00:07:01.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""and inserted them with the""" start="00:07:03.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""right prefixes, I mean, the right""" start="00:07:06.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""comment prefixes.""" start="00:07:09.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""And that's it!""" start="00:07:10.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""So... that's it. If you found this thing""" start="00:07:15.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""interesting just""" start="00:07:18.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""install a recent version of eev and run""" start="00:07:22.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""the tutorial, either with this thing here,""" start="00:07:25.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""`M-x find-kla-intro`, or by running""" start="00:07:28.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""this sexp, or open this file here in the""" start="00:07:30.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""eev directory, and follow the""" start="00:07:35.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""tutorials...""" start="00:07:37.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""most things that there are well""" start="00:07:39.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""documented, but the thing that I don't""" start="00:07:42.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""use much and that is mostly for demos,""" start="00:07:46.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""which is the the thing that creates""" start="00:07:47.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""bi-directional hyperlinks, is not yet""" start="00:07:50.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""well documented, but the rest is.""" start="00:07:52.000" video="mainVideo-eev" id="subtitle"]]
+[[!template text="""So: that's it! Bye! Have fun! =)""" start="00:07:55.000" video="mainVideo-eev" id="subtitle"]]
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20eev%3A%20Bidirectional%20links%20with%20eev)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/eev-before.md b/2022/info/eev-before.md
new file mode 100644
index 00000000..556359de
--- /dev/null
+++ b/2022/info/eev-before.md
@@ -0,0 +1,18 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="eev">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect stroke-width="3" x="619" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 8-min talk followed by IRC Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">#emacsconf-dev</a>)
+Etherpad: <https://pad.emacsconf.org/2022-eev>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: Q&A finished, IRC and pad will be archived on this page
+
+
+
+
+<div class="vid"><video controls preload="none" id="eev-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.webm">Download --main.webm (17MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.opus">Download --main.opus (3.9MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eev--bidirectional-links-with-eev--eduardo-ochs--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/hQUQSeECqpb3AMSqiViksa">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/eev-nav.md b/2022/info/eev-nav.md
new file mode 100644
index 00000000..cdf20e11
--- /dev/null
+++ b/2022/info/eev-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/health">Health data journaling and visualization with Org Mode and gnuplot</a>
+Next by track: <a href="/2022/talks/jupyter">Edit live Jupyter notebook cells with Emacs</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/eshell-after.md b/2022/info/eshell-after.md
new file mode 100644
index 00000000..3c6c1674
--- /dev/null
+++ b/2022/info/eshell-after.md
@@ -0,0 +1,253 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="eshell-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""I have 10 minutes to talk you into""" start="00:00:00.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""giving Eshell a second chance.""" start="00:00:05.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Have the right perspective and expectation,""" start="00:00:07.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and I think you’ll really enjoy it.""" start="00:00:10.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Just remember eshell is a shell,""" start="00:00:12.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""not a terminal emulator.""" start="00:00:15.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I use both Eshell and vterm.""" start="00:00:17.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I’m going to talk and type fast,""" start="00:00:20.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""as I have 10 reasons for you to try Eshell again.""" start="00:00:23.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""1. It’s an Emacs REPL.""" start="00:00:29.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I mean, check this out.""" start="00:00:32.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Let’s start up Eshell here.""" start="00:00:34.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Let’s just type a Lisp expression.""" start="00:00:37.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""It works.""" start="00:00:41.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""As a shell, the parens are kinda optional.""" start="00:00:43.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""2. It’s also a shell.""" start="00:00:48.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""While eshell may look like a shell, like Bash""" start="00:00:52.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""you should view it as a REPL""" start="00:00:56.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""with parenthesis-less s-expressions.""" start="00:00:58.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This makes sense, because a shell command with options,""" start="00:01:02.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""like this ls command,""" start="00:01:05.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""looks like an s-expression.""" start="00:01:08.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""3. You can mix these two modes.""" start="00:01:10.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Shells can call subshells""" start="00:01:12.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""which return their output like a function call,""" start="00:01:14.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""like this Bash command.""" start="00:01:17.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In this Eshell example,""" start="00:01:20.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I use the output of a text file""" start="00:01:22.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""as command line arguments to ripgrep.""" start="00:01:24.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Notice how I use braces""" start="00:01:27.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to state that it is a call to an eshell expression.""" start="00:01:29.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""We can mix Lisp-expressions and Shell-expressions.""" start="00:01:34.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Allow me a contrived example.""" start="00:01:40.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Notice I use good ol' setq to create a variable.""" start="00:01:45.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Yes, those are global Emacs variables available everywhere.""" start="00:01:50.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In Eshell, the wildcard actually creates a list.""" start="00:01:54.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This variable assignment doesn’t work as you might expect,""" start="00:01:59.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""as setq in Eshell is still setq,""" start="00:02:04.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and it assigns variables in pairs.""" start="00:02:07.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""To make a list in Eshell, we use listify:""" start="00:02:10.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Without parens, Eshell is in “shell mode”,""" start="00:02:17.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""which means that words are strings,""" start="00:02:21.240" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and variables need to be prefixed with dollar signs.""" start="00:02:23.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""A command can have both Eshell and Lisp expressions.""" start="00:02:26.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""As you can see here,""" start="00:02:32.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I have a call to ripgrep,""" start="00:02:34.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""but part of it is an s-expression.""" start="00:02:37.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Remember the differences:""" start="00:02:40.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""With parens, eshell treats it as Lisp,""" start="00:02:42.240" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""like the last line in my example.""" start="00:02:46.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""With braces, eshell follows these shell-like rules:""" start="00:02:49.200" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""First, if it looks like a number, it's a number.""" start="00:02:53.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Otherwise, eshell converts it to a string""" start="00:02:57.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""(quotes, like a shell, groups words).""" start="00:02:59.440" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""What about this mix between functions and executables""" start="00:03:03.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""for the first word?""" start="00:03:07.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Functions that begin with eshell are called first.""" start="00:03:10.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Next in priority are executables on your $PATH,""" start="00:03:15.440" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""then matching Lisp functions.""" start="00:03:19.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""You can actually switch this order""" start="00:03:22.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""with the `eshell-prefer-lisp-functions` variable.""" start="00:03:23.941" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""4. Emacs is actually better than shell.""" start="00:03:27.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""If the following works, why would you call""" start="00:03:31.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""expr or bc or dc, or any of those other calculators?""" start="00:03:35.200" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""You can just call a Lisp expression.""" start="00:03:40.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Why call less or more when you could call view-file?""" start="00:03:43.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Here, I’ve aliased less to view-file.""" start="00:03:48.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Load it up, and it shows up in an Emacs mode.""" start="00:03:52.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Just like with less, if you hit q,""" start="00:03:57.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""you go back to your Eshell terminal.""" start="00:04:01.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I do have an improvement, though.""" start="00:04:05.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""The problem with view-file is""" start="00:04:08.440" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""it takes a single file as an argument.""" start="00:04:10.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In a shell, we might want to view more than one.""" start="00:04:13.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""So let’s make a solution to that.""" start="00:04:15.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This function will call the first function""" start="00:04:18.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""with the first argument,""" start="00:04:21.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and the second function with each of the rest.""" start="00:04:22.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This allows me to make a version of less""" start="00:04:26.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that calls view-file on the first [argument] given,""" start="00:04:29.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""but open in another window for each additional file.""" start="00:04:33.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""5. Better regular expressions.""" start="00:04:36.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Can’t remember regular expressions when calling""" start="00:04:41.240" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""grep or some other search function? Use the rx macro.""" start="00:04:44.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Here I call ripgrep again, but this time,""" start="00:04:48.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I’m using a Lisp expression calling the rx macro""" start="00:04:55.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to look for UUIDs in the files in my current directory.""" start="00:05:00.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""But I have another improvement for this.""" start="00:05:04.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""While the rx macro is freaking cool for Emacs Lisp,""" start="00:05:08.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""it doesn’t always translate to regular expressions""" start="00:05:13.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""accepted by most commands.""" start="00:05:15.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""The (I have no idea how to pronounce this) pcre2el project""" start="00:05:20.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""can convert from a Lisp regular expression""" start="00:05:25.200" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to Perl-compatible regular expressions (PCRE)""" start="00:05:28.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""acceptable by most search commands.""" start="00:05:31.360" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I’ve created a new macro here, prx,""" start="00:05:33.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that translates the output of the rx macro.""" start="00:05:37.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This allows me to type something much more readable,""" start="00:05:41.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and probably easier to remember.""" start="00:05:46.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Certainly easier than this freaking regular expression.""" start="00:05:48.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I’ve got an even better improvement.""" start="00:05:54.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""The rx macro with regular expression snippets""" start="00:05:59.440" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""can be assigned to key words""" start="00:06:03.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that I can then take advantage of.""" start="00:06:05.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Now our command would be much simpler to type.""" start="00:06:08.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""6. Loops are better with predicates.""" start="00:06:13.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Let’s say you want to remove the execute bit""" start="00:06:16.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""from files that have it.""" start="00:06:18.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In a shell like bash, you need both a for loop and an if,""" start="00:06:20.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""as you can see in this example.""" start="00:06:24.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""With eshell, use a predicate to combine into a simple loop.""" start="00:06:26.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""The paren x after a file glob""" start="00:06:31.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""filters for only files marked as executable.""" start="00:06:34.360" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Now here is another improvement.""" start="00:06:36.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Since we often type loops to execute on one command,""" start="00:06:43.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""what about creating a function""" start="00:06:47.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that can do this all in one go?""" start="00:06:49.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This do function splits the arguments on that double colon,""" start="00:06:51.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""where the left side is a single statement to run,""" start="00:06:57.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and the right side is a list of files.""" start="00:07:00.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I have to append and flatten it""" start="00:07:02.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""in order for it to work.""" start="00:07:05.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""It loops through each file,""" start="00:07:07.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""creating an eshell command with the file appended.""" start="00:07:09.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""With this, I can remove the execute bit""" start="00:07:12.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""on all CSV files that have it.""" start="00:07:15.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I see that my example wasn’t too good, as most commands""" start="00:07:20.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""like chmod accept multiple files, but you get the idea.""" start="00:07:24.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In my final, larger form on my website,""" start="00:07:29.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I don’t assume the command expression accepts""" start="00:07:33.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""a file as a final argument,""" start="00:07:35.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""as I can also replace underscores with the filename.""" start="00:07:36.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""7. Output of last command.""" start="00:07:39.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Most shells have a special variable""" start="00:07:45.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""like $? for the exit code of the last command.""" start="00:07:48.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""While reading through the source code,""" start="00:07:52.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I noticed that the $$ refers to""" start="00:07:55.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""the output of the last command.""" start="00:07:58.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This seems pretty cool.""" start="00:08:00.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""However, Eshell returns true or nil""" start="00:08:05.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""when running external commands,""" start="00:08:10.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""so accessing the output from a call to ls""" start="00:08:12.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""doesn’t work as expected.""" start="00:08:15.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""But this is Emacs.""" start="00:08:19.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""We can fix that.""" start="00:08:21.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""After running any command, eshell sets these four variables.""" start="00:08:23.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I can hook a function call after every Eshell command.""" start="00:08:28.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Using buffer-substring,""" start="00:08:33.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I store the output into a global variable,""" start="00:08:36.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and extend Eshell’s special variables list.""" start="00:08:39.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In my Emacs configuration,""" start="00:08:43.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I turned this variable into a ring,""" start="00:08:46.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""so while $$ works,""" start="00:08:48.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""so does array sub-scripting on that variable.""" start="00:08:51.440" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This allows me to run a command""" start="00:08:54.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and use the output from that command more than once.""" start="00:08:58.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""The code for this is a bit longer,""" start="00:09:02.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""so you’ll need to see my Emacs configuration for details.""" start="00:09:05.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""8. Redirection back to Emacs.""" start="00:09:08.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Output of any command""" start="00:09:13.440" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""can go to kill-ring (or the clipboard).""" start="00:09:14.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Think of the implications.""" start="00:09:18.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""You don’t have to go into text selection mode.""" start="00:09:21.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Just grab the output.""" start="00:09:23.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""In fact, with our $$ improvement,""" start="00:09:26.240" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""we can always copy the output from the last command""" start="00:09:30.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to the clipboard.""" start="00:09:33.240" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Better yet, let’s write the output""" start="00:09:34.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to our engineering notebook.""" start="00:09:38.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Here’s my idea.""" start="00:09:39.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""First, create a capture template that takes a string,""" start="00:09:41.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""or if called interactively, the region,""" start="00:09:46.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and that does an immediate-finish after inserting""" start="00:09:48.200" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that string to the default notes file.""" start="00:09:51.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Next, create a wrapper function""" start="00:09:53.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to call org-capture-string to run that template.""" start="00:09:57.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Finally, we add our new function to eshell-virtual-targets.""" start="00:10:01.560" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Let’s see this in action.""" start="00:10:07.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I have a CSV file of user information.""" start="00:10:08.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I can use grep and cut to extract some of that""" start="00:10:15.708" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and write it out to this month’s engineering notebook.""" start="00:10:19.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""9. Using Emacs buffers.""" start="00:10:26.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Why leave the results of eshell commands""" start="00:10:35.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""in the *eshell* buffer?""" start="00:10:39.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Send the output into a buffer where you can use it.""" start="00:10:40.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Here’s a call to ripgrep""" start="00:10:44.120" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that searches for lines with email addresses""" start="00:10:48.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""using a complicated regular expression""" start="00:10:50.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that I added to my prx macro.""" start="00:10:53.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""When I switch to this almost-grep buffer,""" start="00:10:56.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I can turn on grep-mode.""" start="00:11:01.080" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Now I can jump around as if I just called grep directly.""" start="00:11:03.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Perhaps I’m proficient with my prx macro""" start="00:11:09.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to filter out entries,""" start="00:11:14.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""but not good with shell commands""" start="00:11:16.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that I can use in pipes to extract just one…""" start="00:11:19.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""the address column, for instance?""" start="00:11:24.000" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Let’s just extract it,""" start="00:11:26.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""send it to a buffer called email-list,""" start="00:11:28.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and now I can use Emacs commands that I know and love""" start="00:11:33.280" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to edit the data directly.""" start="00:11:38.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""We currently have an over-sight""" start="00:11:39.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""that the Eshell’s built-in cat command""" start="00:11:55.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""doesn’t pipe buffer contents as standard in.""" start="00:11:58.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""So I created a bcat, a buffer cat, function to do this.""" start="00:12:02.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""So this command works""" start="00:12:07.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to grab my email addresses I just extracted""" start="00:12:09.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and send them to another program.""" start="00:12:14.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""If you’re interested, I have a more elaborate""" start="00:12:16.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and yet simpler workflow surrounding sending data""" start="00:12:20.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""back and forth from Eshell to Emacs buffers.""" start="00:12:25.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""10. Did I mention that you can cd to remote systems?""" start="00:12:28.400" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""This command uses SSH to jump to my host, goblin,""" start="00:12:35.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""start a root session, and jump to the etc directory.""" start="00:12:39.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Remember that Tramp can be finicky""" start="00:12:44.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""if you start blinging your remote hosts with oh-my-zshell,""" start="00:12:47.720" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and funky prompts and things like that,""" start="00:12:52.840" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""so your mileage may vary.""" start="00:12:57.791" video="mainVideo-eshell" id="subtitle"]]
+[[!template new="1" text="""In summary: Use eshell if you want""" start="00:12:59.360" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""a quick way to run commands and Emacs functions as a REPL,""" start="00:13:03.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""or to run an OS program but process the output with Emacs.""" start="00:13:07.320" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Keep in mind that Eshell has two types of subshells,""" start="00:13:11.480" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""and you can mix and match during a command call.""" start="00:13:15.920" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""The rx macro is really cool.""" start="00:13:19.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Eshell loops are better with filters and predicates …""" start="00:13:22.640" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""if you can remember them.""" start="00:13:26.600" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Take advantage of Emacs buffers""" start="00:13:28.240" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""to really enhance your shell experience.""" start="00:13:30.960" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""You’ve now seen that just like Emacs,""" start="00:13:32.880" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I’ve crafted Eshell to be my own shell creation,""" start="00:13:36.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""tailored to my workflow.""" start="00:13:39.520" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""So, steal my spells, cast your own magic,""" start="00:13:41.040" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""but feel free to share your incantations back to me.""" start="00:13:44.800" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""I’ve gone over my time allotment, so we’ll have to""" start="00:13:48.760" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""continue this discussion on the intertubes.""" start="00:13:51.360" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Why yes, I have joined the birdless diaspora,""" start="00:13:53.680" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""so toot me over there.""" start="00:13:57.160" video="mainVideo-eshell" id="subtitle"]]
+[[!template text="""Thanks.""" start="00:13:59.200" video="mainVideo-eshell" id="subtitle"]]
+
+
+
+Captioner: howard
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20eshell%3A%20Top%2010%20reasons%20why%20you%20should%20be%20using%20Eshell)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/eshell-before.md b/2022/info/eshell-before.md
new file mode 100644
index 00000000..1c57c21e
--- /dev/null
+++ b/2022/info/eshell-before.md
@@ -0,0 +1,52 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Howard Abrams shows how eshell combines the best of Emacs Lisp and shells. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="eshell">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect stroke-width="3" x="439" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 15-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-eshell>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T18:40:00Z" end="2022-12-04T18:55:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~1:40 PM - 1:55 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~12:40 PM - 12:55 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~11:40 AM - 11:55 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~10:40 AM - 10:55 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~6:40 PM - 6:55 PM UTC <br />Sunday, Dec 4 2022, ~7:40 PM - 7:55 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~8:40 PM - 8:55 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~12:10 AM - 12:25 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~2:40 AM - 2:55 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~3:40 AM - 3:55 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="eshell-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="eshell-mainVideo" data="""
+00:00.000 Introduction
+00:29.000 1. It’s an Emacs REPL
+00:48.600 2. It’s also a shell
+01:10.120 3. You can mix these two modes
+03:27.560 4. Emacs is better than shell
+04:36.080 5. Better regular expressions
+06:13.480 6. Loops are better with predicates
+07:39.640 7. Output of last command
+09:08.520 8. Redirection back to Emacs
+10:26.880 9. Using Emacs buffers
+12:28.400 10. cd to remote systems
+12:59.360 Summary
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.webm">Download --main.webm (45MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.opus">Download --main.opus (7.2MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/ndrA731VbY2U6SP8onw3yw">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="eshell-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="eshell-qanda" data="""
+00:31.280 Do you fall back to vterm only when needing terminal emulation?
+01:56.320 Have you thought about adding the Eshell manual?
+02:43.200 Can Eshell be used from Elisp?
+03:33.880 How does that interplay with literate devops?
+04:42.880 Do you have a strategy for getting around Eshell's lack of support for input redirection?
+07:35.040 Do you have a preferred method for getting argument completion for shell commands?
+09:14.320 Similarly, is it possible to get Eldoc-based completion for Elisp calls in Eshell?
+10:33.720 Integrating functions into Emacs core
+12:51.760 Are you the maintainer of Eshell now? No, just an interested bystander.
+18:13.880 Do you ever fall back to terminals/shells outside Emacs, and if so, in what circumstances?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="eshell-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.webm">Download --answers.webm (47MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--answers.opus">Download --answers.opus (8.4MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/eshell-nav.md b/2022/info/eshell-nav.md
new file mode 100644
index 00000000..0852d97c
--- /dev/null
+++ b/2022/info/eshell-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/detached">Getting detached from Emacs</a>
+Next by track: <a href="/2022/talks/workflows">Org workflows for developers</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/fanfare-after.md b/2022/info/fanfare-after.md
new file mode 100644
index 00000000..f393b689
--- /dev/null
+++ b/2022/info/fanfare-after.md
@@ -0,0 +1,273 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="fanfare-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Hello, my name is John Cummings, and I'm here today""" start="00:00:00.000" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to play a Fanfare for the Common Emacs User.""" start="00:00:02.206" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""By &quot;common&quot;, I mean the types of Emacs usage""" start="00:00:04.852" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and comfort that are simpler, more mundane,""" start="00:00:07.266" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and yes, even imperfect,""" start="00:00:09.689" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that some may identify with more than others,""" start="00:00:11.075" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or more at certain times.""" start="00:00:13.037" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It's hard to use Emacs and not be aware of""" start="00:00:14.651" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""the impressive and interesting accomplishments""" start="00:00:16.914" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""of its community. And here at emacsconf""" start="00:00:18.703" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we also get pumped up about those things,""" start="00:00:20.756" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""amplified by the energy of the other attendees.""" start="00:00:22.426" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But this energy fades as we return focus""" start="00:00:25.567" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to our day-to-day work. And in these circumstances,""" start="00:00:27.730" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we may unfairly judge our own Emacs usage""" start="00:00:30.571" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""against the community highlights.""" start="00:00:32.993" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""So I want to identify and celebrate the ways""" start="00:00:34.997" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that we common Emacs users use it,""" start="00:00:37.712" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""the reasons why it's a good fit for those ways,""" start="00:00:39.932" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and some ways we could take advantage of that.""" start="00:00:42.290" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""What is Emacs to us common users? Well, we're consumers.""" start="00:00:45.430" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We use whatever was available - whatever our OS gave us,""" start="00:00:48.528" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or whatever we found when we searched the web.""" start="00:00:51.493" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We're not even necessarily aware""" start="00:00:53.990" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""of what the latest version is, or what changes it has.""" start="00:00:55.711" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We may not ever think about upgrading.""" start="00:00:58.091" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We have what we have, and we use what we have.""" start="00:01:00.138" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But I think, with this simple act, many of us""" start="00:01:02.742" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""achieve a very significant Emacs milestone:""" start="00:01:05.149" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we've committed to having it in our toolkit""" start="00:01:07.997" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and our skillset. We'll probably install it""" start="00:01:10.278" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""on every system that we can, eventually.""" start="00:01:12.625" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We know it has a use for us today,""" start="00:01:14.804" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and that it will solve some problems""" start="00:01:16.827" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that we don't even know about yet.""" start="00:01:18.120" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It will not just be one tool; it will be many.""" start="00:01:19.588" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And we know that it will be more than just useful;""" start="00:01:22.215" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""it will also be challenging, puzzling, and frustrating.""" start="00:01:24.368" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But we still keep it""" start="00:01:27.345" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""as a permanent part of our toolkit,""" start="00:01:28.630" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and we should be proud of that.""" start="00:01:29.873" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And regardless of what exactly we've installed,""" start="00:01:31.800" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""it was a good choice.""" start="00:01:34.136" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It will almost certainly do what we need it to do.""" start="00:01:35.337" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Old versions are not inert dead-ends;""" start="00:01:37.556" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""they're still functional tools.""" start="00:01:39.766" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And that's a key aspect of Emacs - it's a tool""" start="00:01:41.134" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to get our work done. That sounds obvious,""" start="00:01:43.979" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""but it's easy to get distracted by the great things""" start="00:01:46.398" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that it can accomplish, and think""" start="00:01:48.483" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that it requires the same accomplishments from us.""" start="00:01:49.985" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But it requires no advanced state of mind,""" start="00:01:52.571" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""no level of expertise to start using it,""" start="00:01:54.656" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or use it correctly.""" start="00:01:56.867" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It just requires that we have it, and use it.""" start="00:01:58.043" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And with a little effort, we can get results early on,""" start="00:02:00.754" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and those results are not just preparations""" start="00:02:03.665" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""for better things to come later;""" start="00:02:06.084" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""they have value for us today,""" start="00:02:07.586" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and we're already using it right.""" start="00:02:08.712" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And when we do need to tweak whatever we installed,""" start="00:02:12.049" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we might again be consumers, finding some snippets""" start="00:02:14.551" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""out on the web, pasting them in, and moving on.""" start="00:02:16.803" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We don't necessarily understand what we did,""" start="00:02:19.581" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""but we got some value out of it. Over time,""" start="00:02:21.933" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we may participate more, take it day by day,""" start="00:02:24.102" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and one day we may find that our config""" start="00:02:26.114" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""has become a disorganized pile.""" start="00:02:28.357" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Maybe it's mixed haphazardly""" start="00:02:30.902" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""with some output from the &quot;customize&quot; feature,""" start="00:02:32.027" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and eventually we start to feel""" start="00:02:34.029" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""like it's a shameful mess. It's hard to manage;""" start="00:02:35.697" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we may think of it as append-only or read-only.""" start="00:02:37.991" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We can't deny there are problems here,""" start="00:02:40.960" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""but it happened for a good reason. It was quick,""" start="00:02:42.829" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""easy, and effective for us""" start="00:02:45.582" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to enhance our experience this way, and then move on.""" start="00:02:47.250" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We were using Emacs as it was designed here.""" start="00:02:50.062" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It just wasn't sustainable indefinitely.""" start="00:02:52.172" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We may continue doing things this way""" start="00:02:54.775" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""even though we realize it's not a good idea.""" start="00:02:56.627" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But I think there are some ways""" start="00:02:59.596" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to mitigate the downsides,""" start="00:03:00.472" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that let us embrace our tendencies,""" start="00:03:01.682" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and continue to benefit from them.""" start="00:03:03.150" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""If we allow and encourage ourselves""" start="00:03:05.444" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to capture our thoughts and circumstances""" start="00:03:06.971" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""along with the work that we do on our config,""" start="00:03:10.065" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and do so without judgment, or the responsibility""" start="00:03:11.700" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to &quot;do it right&quot;, we give ourselves the context""" start="00:03:14.386" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to understand and manage it later.""" start="00:03:17.047" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""This should be done however works for us,""" start="00:03:19.549" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""whether it's rambling inline comments,""" start="00:03:21.618" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""keeping a separate journal or notes,""" start="00:03:23.286" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or even a more advanced literate programming technique,""" start="00:03:25.247" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""if we want to make an investment like that.""" start="00:03:27.975" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Or putting our config into source control,""" start="00:03:30.485" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""even if it's nothing more than a simple,""" start="00:03:32.629" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""daily record of changes along with our contextual notes,""" start="00:03:34.214" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""will make things a lot easier for our future selves.""" start="00:03:37.050" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But regardless of how well, or sloppy, we manage it,""" start="00:03:41.221" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we should also realize that our messy config""" start="00:03:43.974" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""is a personal artifact with inherent value,""" start="00:03:46.184" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""even if it's amusement value, or sentimental value.""" start="00:03:48.129" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Emacs is not only a tool to get our work done,""" start="00:03:51.565" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""it can also be a very personalized experience.""" start="00:03:54.401" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And if so, then our Emacs config""" start="00:03:56.978" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""is our experience in written form.""" start="00:03:59.366" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""You can see it as a log of your journey through Emacs,""" start="00:04:02.110" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and the mark that you made on it along the way,""" start="00:04:04.303" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""mistakes and all.""" start="00:04:06.663" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We may see our config as a record of failure,""" start="00:04:08.506" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""of things that we did wrong, the things that we repeated,""" start="00:04:10.676" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or never finished. But it's important to realize""" start="00:04:12.886" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that a record of failure is a record of persistence.""" start="00:04:15.672" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""In that sense, it's kind of like our genome:""" start="00:04:18.592" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""a set of unique, disorganized,""" start="00:04:20.761" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""somewhat accidental properties, that, on the whole,""" start="00:04:23.197" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""makes us fit to survive in our Emacs usage.""" start="00:04:26.308" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It's also interesting to think of it""" start="00:04:29.394" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""as an archaeological record. Where we can sometimes""" start="00:04:31.021" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""get some insight into our &quot;ancient times&quot;.""" start="00:04:33.482" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Just being able to see what we were doing years ago""" start="00:04:35.942" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""is interesting -- to see how things changed,""" start="00:04:38.570" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and hopefully grew over time. And sometimes""" start="00:04:40.906" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we find some buried treasures that we forgot were there.""" start="00:04:43.158" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And of course it's interesting to realize""" start="00:04:45.845" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that when we start Emacs, this pile of config""" start="00:04:48.172" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""also executes in roughly the same order""" start="00:04:50.874" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that we created it in. Our journey through Emacs""" start="00:04:52.959" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""happens again and again every time we start it up.""" start="00:04:56.438" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And it's ready for us to keep working on it.""" start="00:04:59.482" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And when it comes to packages,""" start="00:05:04.095" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we may not make extensive use of them, if any at all.""" start="00:05:05.305" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We probably have different reasons for this.""" start="00:05:09.050" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We may feel like we need to reach""" start="00:05:10.602" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""some level of mastery before we start using them.""" start="00:05:12.437" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We may not have the mental room to think about packages,""" start="00:05:14.815" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or may not want to take on the administrative burden""" start="00:05:17.943" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""required to keep track of which packages we have,""" start="00:05:20.362" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""the dependencies and versions, and their compatibility.""" start="00:05:22.989" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Some of us may just be uncomfortable""" start="00:05:25.834" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""letting new third-party code run in our environments.""" start="00:05:27.694" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""It could also just be the case""" start="00:05:30.664" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that our needs haven't driven us to need a package yet.""" start="00:05:31.832" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We're already doing what we need,""" start="00:05:35.377" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and doing it efficiently enough.""" start="00:05:36.871" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And here we find more alignment""" start="00:05:39.089" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""between Emacs the tool, and our common mindset:""" start="00:05:40.215" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""They work well when they stay needs-driven.""" start="00:05:42.592" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We're not obligated to use""" start="00:05:44.977" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""as much of Emacs' functionality as we can,""" start="00:05:46.646" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or every package that we're aware of""" start="00:05:48.949" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""if we don't have a need to.""" start="00:05:51.159" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And in fact, that's a great way to stay overwhelmed.""" start="00:05:52.510" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But if we stay aware of our needs, and then find""" start="00:05:54.971" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that there is a package that might address them,""" start="00:05:57.700" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""then we can deal with it. And a need to explore,""" start="00:05:59.902" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and a need to be curious, is a valid need.""" start="00:06:02.655" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And if we do need extra confidence for that exploration,""" start="00:06:05.823" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""then the things we talked about before,""" start="00:06:09.327" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""like keeping good notes of our experiences and needs,""" start="00:06:10.912" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or version controlling our config,""" start="00:06:13.633" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""will help us keep that connection to our needs,""" start="00:06:15.541" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that gives us the freedom to experiment""" start="00:06:18.586" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""in the wide world of packages.""" start="00:06:20.922" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And if we really do just need what's built in to Emacs,""" start="00:06:23.008" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""the vanilla out-of-the-box experience,""" start="00:06:27.262" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""then we can also be proud that we're making use""" start="00:06:29.514" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""of all the work that went into that experience,""" start="00:06:32.183" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""because a lot did.""" start="00:06:33.560" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And when we report any problems that we find,""" start="00:06:35.021" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we're also working to keep that experience""" start="00:06:37.256" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""smooth for future users.""" start="00:06:39.190" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Of course, some of us may find this intimidating,""" start="00:06:41.192" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and if so, feel free to reach out to me,""" start="00:06:43.987" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and probably anyone in the community,""" start="00:06:46.531" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that can help you navigate that process.""" start="00:06:48.767" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""So how do we use our Emacs installation?""" start="00:06:56.249" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We often use it very simply: we get simple results""" start="00:06:59.461" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""in simple ways. Often we do things the same simple way""" start="00:07:01.838" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""for a very long time, and this is of course great,""" start="00:07:06.068" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""since we're getting done what we need to get done.""" start="00:07:08.720" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""There's no result or method too simple for Emacs.""" start="00:07:10.513" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And we're not oblivious to the alternative.""" start="00:07:14.392" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Many of us are at least aware that there are ways""" start="00:07:16.853" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we could iterate on what we do,""" start="00:07:19.356" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or some polish that we could apply,""" start="00:07:20.649" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and we may even quite enjoy""" start="00:07:22.734" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""reading about more advanced Emacs possibilities,""" start="00:07:24.569" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and thinking about how they could apply""" start="00:07:27.113" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to our own workflow, but at the end of the day,""" start="00:07:28.215" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we still keep our own usage the same, and basic.""" start="00:07:30.951" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And this is another fundamental aspect of using Emacs.""" start="00:07:33.703" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""You can work simply and successfully,""" start="00:07:36.998" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""but you'll always be conscious of the possibility""" start="00:07:38.959" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""for far more complexity. And many of us""" start="00:07:40.502" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""do try to iterate on our ways, and sometimes succeed,""" start="00:07:43.213" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""but often we run into trouble and we stop or defer.""" start="00:07:46.424" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""A lot of times we're intimidated by the scope of things -""" start="00:07:49.177" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we're not sure how to make measurable progress.""" start="00:07:51.304" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We may find that the first ways we learned""" start="00:07:53.848" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""are so ingrained in us, that learning even a second way""" start="00:07:56.101" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""is many times harder.""" start="00:07:59.312" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And sometimes we do make sudden progress""" start="00:08:01.147" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""after years of sameness,""" start="00:08:03.191" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and wonder why we waited so long.""" start="00:08:04.275" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And these are universal pains""" start="00:08:06.260" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that everyone has to feel who wants to improve.""" start="00:08:07.737" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But this is again where we can benefit""" start="00:08:11.324" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""from letting our needs drive us.""" start="00:08:13.451" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Sometimes they'll tell us that it's OK""" start="00:08:14.661" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""keeping things the way they are, and sometimes""" start="00:08:16.538" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""they'll tell us that it's good to keep pushing,""" start="00:08:18.806" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""because there's a reason for it,""" start="00:08:20.491" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and we'll be glad that we did.""" start="00:08:21.767" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And what are the ways that we do learn,""" start="00:08:25.077" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and grow, and create within Emacs? One constant""" start="00:08:27.507" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""is that we forget a lot. We learn something""" start="00:08:30.635" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and then remember that we already learned""" start="00:08:33.596" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and forgot it once before. Sometimes we just hope""" start="00:08:35.682" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to learn more than we forget.""" start="00:08:38.309" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And staying driven by our needs can also help here,""" start="00:08:39.769" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""because it's easier to learn something""" start="00:08:41.772" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""when we have a reason to, and an application for it.""" start="00:08:43.499" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""In Emacs, it can be tempting to do this backwards,""" start="00:08:46.317" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and want to learn all there is about Emacs first,""" start="00:08:49.071" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and then apply it. But again that's a surefire way""" start="00:08:51.782" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to stay overwhelmed.""" start="00:08:53.992" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And when we code and build things, we tend to create many small, quick things,""" start="00:08:55.935" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""but never really integrate them deeply""" start="00:08:59.640" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""into our environment or workflow.""" start="00:09:01.600" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""We leave things half-finished once we get bored,""" start="00:09:03.661" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or find ourselves in over our head.""" start="00:09:05.462" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And this is natural, because we're curious and creative,""" start="00:09:07.088" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and Emacs makes it relatively easy, and actually fun,""" start="00:09:09.883" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to experiment and get these quick results.""" start="00:09:12.677" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But it's less clear how to see them through,""" start="00:09:14.845" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and inherently less fun to do the follow-up gruntwork.""" start="00:09:17.065" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""But if we embrace our ways here,""" start="00:09:20.310" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and structure our workflow to support them,""" start="00:09:21.970" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we might find ourselves more satisfied.""" start="00:09:23.897" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""So let's give ourselves permission, and a logical place""" start="00:09:26.215" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""to put all our fun little quick experiments,""" start="00:09:28.926" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""without having to worry about integrating""" start="00:09:31.571" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""or polishing them, unless we find a need to later.""" start="00:09:33.423" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Let's use source control wisely to give ourselves""" start="00:09:35.700" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""a place to experiment, and a place for stability.""" start="00:09:38.505" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""Let's stay needs-driven so that we know""" start="00:09:41.447" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""what we really do need to follow up on,""" start="00:09:42.968" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and what's OK to drop. And let's remember""" start="00:09:46.186" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""that there is someone who will always appreciate""" start="00:09:48.963" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""any notes about our thought process we can take,""" start="00:09:50.965" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""no matter how rough or rambling they are:""" start="00:09:53.635" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""our future selves.""" start="00:09:55.845" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And so I hope that some people can identify with""" start="00:09:58.788" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""at least some of what I've shared today.""" start="00:10:01.376" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""And I hope that we realize that,""" start="00:10:02.927" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""no matter how we see ourselves as Emacs users,""" start="00:10:05.021" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""and no matter what we see other people building,""" start="00:10:06.964" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""we're proud of the fact that we have built""" start="00:10:09.233" video="mainVideo-fanfare" id="subtitle"]]
+[[!template text="""an experience that fits us. Thank you to everyone.""" start="00:10:11.569" video="mainVideo-fanfare" id="subtitle"]]
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20fanfare%3A%20Fanfare%20for%20the%20Common%20Emacs%20User)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/fanfare-before.md b/2022/info/fanfare-before.md
new file mode 100644
index 00000000..de244b57
--- /dev/null
+++ b/2022/info/fanfare-before.md
@@ -0,0 +1,57 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="fanfare">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect stroke-width="3" x="698" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 11-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-fanfare>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T21:25:00Z" end="2022-12-04T21:35:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~4:25 PM - 4:35 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~3:25 PM - 3:35 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~2:25 PM - 2:35 PM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~1:25 PM - 1:35 PM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~9:25 PM - 9:35 PM UTC <br />Sunday, Dec 4 2022, ~10:25 PM - 10:35 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~11:25 PM - 11:35 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~2:55 AM - 3:05 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~5:25 AM - 5:35 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~6:25 AM - 6:35 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="fanfare-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.webm">Download --main.webm (25MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.opus">Download --main.opus (4.4MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/3ikPgKEnX1jVUqnxZrMuHs">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="fanfare-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="fanfare-qanda" data="""
+03:26.480 How would you suggest Emacs developers, including package developers, interface with non-developer users and get their insights to help in shaping future Emacs functionality?
+04:38.480 Is the Emacs community getting smaller?
+08:22.720 Do you think using one of the starter packages affects the learning process you mentioned?
+10:41.040 Barrier to getting regular users on board
+15:26.280 Changing your habits
+19:28.240 Tip of the day, Emacs help discovery
+21:47.020 Menus
+32:18.040 In terms of your Emacs, how far down do you go? (Lisp functions, primitives, C)
+43:52.400 Have we thought about how to use touchscreens?
+47:39.560 Have you ever seen VisiData?
+53:48.880 Low-code environments
+59:32.200 Microsoft
+01:04:53.840 Hyperbole and Org
+01:12:07.720 EmacsConf behind the scenes
+01:21:00.680 Theming
+01:22:42.080 HyControl
+01:26:25.880 Emacspeak
+01:31:21.040 Recording
+01:38:22.520 Losing and rediscovering knowledge
+01:44:11.480 Emacs as a shared community knowledge base
+01:53:46.560 Philosophy
+02:03:49.800 Narrowing
+02:05:40.800 First time on a new system
+02:07:43.800 Bootstrapping
+02:10:50.760 Richard Stallman
+02:14:24.880 Other developers
+02:15:54.880 Emacs and Org development
+02:21:41.000 Closures, Lisp
+02:42:12.480 Clog
+02:54:23.960 Domain-specific languages, collaboration
+03:02:39.280 Condensing things into a 10-minute talk
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="fanfare-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.webm">Download --answers.webm (306MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-fanfare--fanfare-for-the-common-emacs-user--john-cummings--answers.opus">Download --answers.opus (62MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/fanfare-nav.md b/2022/info/fanfare-nav.md
new file mode 100644
index 00000000..6617b751
--- /dev/null
+++ b/2022/info/fanfare-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/devel">Emacs development updates</a>
+Next by track: <a href="/2022/talks/python">Short hyperlinks to Python docs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/grail-after.md b/2022/info/grail-after.md
new file mode 100644
index 00000000..98d5a049
--- /dev/null
+++ b/2022/info/grail-after.md
@@ -0,0 +1,645 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="grail-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Thank you for joining me today. I'm Sameer Pradhan""" start="00:00:00.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""from the Linguistic Data Consortium""" start="00:00:05.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""at the University of Pennsylvania""" start="00:00:07.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and founder of cemantix.org .""" start="00:00:10.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Today we'll be addressing research""" start="00:00:14.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in computational linguistics,""" start="00:00:16.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""also known as natural language processing""" start="00:00:18.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a sub area of artificial intelligence""" start="00:00:22.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with a focus on modeling and predicting""" start="00:00:24.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""complex linguistic structures from various signals.""" start="00:00:27.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The work we present is limited to text and speech signals.""" start="00:00:31.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but it can be extended to other signals.""" start="00:00:35.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We propose an architecture,""" start="00:00:38.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and we call it GRAIL, which allows""" start="00:00:40.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the representation and aggregation""" start="00:00:42.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of such rich structures in a systematic fashion.""" start="00:00:44.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""I'll demonstrate a proof of concept""" start="00:00:50.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""for representing and manipulating data and annotations""" start="00:00:52.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""for the specific purpose of building""" start="00:00:56.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""machine learning models that simulate understanding.""" start="00:00:58.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""These technologies have the potential for impact""" start="00:01:02.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in almost every conceivable field""" start="00:01:05.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that generates and uses data.""" start="00:01:09.120" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""We process human language""" start="00:01:13.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""when our brains receive and assimilate""" start="00:01:15.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""various signals which are then manipulated""" start="00:01:16.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and interpreted within a syntactic structure.""" start="00:01:20.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""it's a complex process that I have simplified here""" start="00:01:23.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""for the purpose of comparison to machine learning.""" start="00:01:27.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Recent machine learning models tend to require""" start="00:01:30.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a large amount of raw, naturally occurring data""" start="00:01:33.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and a varying amount of manually enriched data,""" start="00:01:37.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""commonly known as &quot;annotations&quot;.""" start="00:01:40.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Owing to the complex and numerous nature""" start="00:01:43.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of linguistic phenomena, we have most often used""" start="00:01:45.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a divide and conquer approach.""" start="00:01:49.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The strength of this approach is that it allows us""" start="00:01:53.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to focus on a single, or perhaps a few related""" start="00:01:55.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""linguistic phenomena.""" start="00:01:58.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The weaknesses are the universe of these phenomena""" start="00:02:00.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""keep expanding, as language itself""" start="00:02:03.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""evolves and changes over time,""" start="00:02:07.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and second, this approach requires an additional task""" start="00:02:09.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of aggregating the interpretations,""" start="00:02:13.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""creating more opportunities for computer error.""" start="00:02:14.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Our challenge, then, is to find the sweet spot""" start="00:02:18.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that allows us to encode complex information""" start="00:02:21.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""without the use of manual annotation,""" start="00:02:25.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or without the additional task of aggregation by computers.""" start="00:02:27.720" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""So what do I mean by &quot;annotation&quot;?""" start="00:02:34.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""In this talk the word annotation refers to""" start="00:02:37.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the manual assignment of certain attributes""" start="00:02:39.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to portions of a signal which is necessary""" start="00:02:43.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to perform the end task.""" start="00:02:48.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""For example, in order for the algorithm""" start="00:02:51.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to accurately interpret a pronoun,""" start="00:02:54.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""it needs to know that pronoun,""" start="00:02:57.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""what that pronoun refers back to.""" start="00:03:00.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We may find this task trivial, however,""" start="00:03:03.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""current algorithms repeatedly fail in this task.""" start="00:03:06.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So the complexities of understanding""" start="00:03:10.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in computational linguistics require annotation.""" start="00:03:13.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The world annotation itself is a useful example,""" start="00:03:16.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because it also reminds us""" start="00:03:20.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that words have multiple meetings""" start="00:03:22.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as annotation itself does—""" start="00:03:25.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""just as I needed to define it in this context,""" start="00:03:27.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""so that my message won't be misinterpreted.""" start="00:03:30.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So, too, must annotators do this for algorithms""" start="00:03:33.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""through the manual intervention.""" start="00:03:39.040" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Learning from raw data""" start="00:03:43.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""(commonly known as unsupervised learning)""" start="00:03:44.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""poses limitations for machine learning.""" start="00:03:47.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""As I described, modeling complex phenomena""" start="00:03:50.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""need manual annotations.""" start="00:03:53.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The learning algorithm uses these annotations""" start="00:03:55.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as examples to build statistical models.""" start="00:03:58.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This is called supervised learning.""" start="00:04:01.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Without going into too much detail,""" start="00:04:04.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""I'll simply note that the recent popularity""" start="00:04:06.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of the concept of deep learning""" start="00:04:10.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is that evolutionary step""" start="00:04:12.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where we have learned to train models""" start="00:04:14.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""using trillions of parameters in ways that they can""" start="00:04:17.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""learn richer hierarchical structures""" start="00:04:20.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""from very large amounts of annotate, unannotated data.""" start="00:04:25.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""These models can then be fine-tuned,""" start="00:04:29.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""using varying amounts of annotated examples""" start="00:04:32.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""depending on the complexity of the task""" start="00:04:35.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to generate better predictions.""" start="00:04:37.640" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""As you might imagine, manually annotating""" start="00:04:39.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""complex, linguistic phenomena""" start="00:04:44.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""can be very specific, labor-intensive task.""" start="00:04:47.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""For example, imagine if we were""" start="00:04:51.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to go back through this presentation""" start="00:04:54.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and connect all the pronouns""" start="00:04:56.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with the nouns to which they refer.""" start="00:04:58.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Even for a short 18 min presentation,""" start="00:04:59.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this would require hundreds of annotations.""" start="00:05:03.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The models we build are only as good""" start="00:05:05.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as the quality of the annotations we make.""" start="00:05:08.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We need guidelines""" start="00:05:11.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that ensure that the annotations are done""" start="00:05:12.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""by at least two humans who have substantial agreement""" start="00:05:15.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with each other in their interpretations.""" start="00:05:19.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We know that if we try to trade a model using annotations""" start="00:05:22.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that are very subjective, or have more noise,""" start="00:05:25.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we will receive poor predictions.""" start="00:05:28.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Additionally, there is the concern of introducing""" start="00:05:30.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""various unexpected biases into one's models.""" start="00:05:33.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So annotation is really both an art and a science.""" start="00:05:37.080" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""In the remaining time,""" start="00:05:44.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we will turn to two fundamental questions.""" start="00:05:47.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""First, how can we develop a unified representation""" start="00:05:50.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of data and annotations""" start="00:05:54.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that encompasses arbitrary levels of linguistic information?""" start="00:05:55.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""There is a long history of attempting to answer""" start="00:05:59.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this first question.""" start="00:06:03.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This history is documented in our recent article,""" start="00:06:04.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you can refer to that article.""" start="00:06:08.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It will be on the website.""" start="00:06:11.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It is as if we, as a community,""" start="00:06:16.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""have been searching for our own Holy Grail.""" start="00:06:19.000" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""The second question we will pose is""" start="00:06:22.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""what role might Emacs, along with Org mode,""" start="00:06:26.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""play in this process?""" start="00:06:30.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Well, the solution itself may not be tied to Emacs.""" start="00:06:31.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Emacs has built in capabilities""" start="00:06:35.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that could be useful for evaluating potential solutions.""" start="00:06:38.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It's also one of the most extensively documented""" start="00:06:42.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""pieces of software and the most customizable""" start="00:06:45.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""piece of software that I have ever come across,""" start="00:06:48.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and many would agree with that.""" start="00:06:51.600" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""In order to approach this second question,""" start="00:06:55.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we turn to the complex structure of language itself.""" start="00:07:00.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""At first glance, language appears to us""" start="00:07:03.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as a series of words.""" start="00:07:07.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Words form sentences, sentences form paragraphs,""" start="00:07:09.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and paragraphs form completed text.""" start="00:07:13.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""If this was a sufficient description""" start="00:07:16.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of the complexity of language,""" start="00:07:19.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""all of us would be able to speak and read""" start="00:07:21.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""at least ten different languages.""" start="00:07:24.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We know it is much more complex than this.""" start="00:07:26.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""There is a rich, underlying recursive tree structure--""" start="00:07:29.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in fact, many possible tree structures""" start="00:07:33.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""which makes a particular sequence meaningful""" start="00:07:36.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and many others meaningless.""" start="00:07:39.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""One of the better understood tree structures""" start="00:07:42.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is the syntactic structure.""" start="00:07:45.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""While natural language""" start="00:07:47.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""has rich ambiguities and complexities,""" start="00:07:49.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""programming languages are designed to be parsed""" start="00:07:51.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and interpreted deterministically.""" start="00:07:55.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Emacs has been used for programming very effectively.""" start="00:07:57.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So there is a potential for using Emacs""" start="00:08:02.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as a tool for annotation.""" start="00:08:05.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This would significantly improve our current set of tools.""" start="00:08:06.560" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""It is important to note that most of the annotation tools""" start="00:08:10.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that have been developed over the past few decades""" start="00:08:16.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""have relied on graphical interfaces,""" start="00:08:19.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""even those used for enriching textual information.""" start="00:08:22.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Most of the tools in current use""" start="00:08:26.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""are designed for a end user to add very specific,""" start="00:08:30.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""very restricted information.""" start="00:08:36.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We have not really made use of the potential""" start="00:08:38.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that an editor or a rich editing environment like Emacs""" start="00:08:42.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""can add to the mix.""" start="00:08:45.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Emacs has long enabled the editing of, the manipulation of""" start="00:08:47.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""complex embedded tree structures abundant in source code.""" start="00:08:52.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So it's not difficult to imagine that it would have""" start="00:08:56.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""many capabilities that we we need""" start="00:08:58.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to represent actual language.""" start="00:09:00.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""In fact, it already does that with features""" start="00:09:02.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that allow us to quickly navigate""" start="00:09:04.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""through sentences and paragraphs,""" start="00:09:06.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and we don't need a few key strokes.""" start="00:09:07.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Or to add various text properties to text spans""" start="00:09:09.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to create overlays, to name but a few.""" start="00:09:13.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Emacs figured out this way to handle Unicode,""" start="00:09:17.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""so you don't even have to worry about the complexity""" start="00:09:22.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of managing multiple languages.""" start="00:09:26.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It's built into Emacs. In fact, this is not the first time""" start="00:09:29.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Emacs has been used for linguistic analysis.""" start="00:09:34.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""One of the breakthrough moments in language,""" start="00:09:37.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""natural language processing was the creation""" start="00:09:41.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of manually created syntactic trees""" start="00:09:44.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""for a 1 million word collection""" start="00:09:48.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of Wall Street Journal articles.""" start="00:09:50.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This was else around 1992""" start="00:09:52.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""before Java or graphical interfaces were common.""" start="00:09:54.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The tool that was used to create that corpus was Emacs.""" start="00:09:59.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It was created at UPenn, and is famously known as""" start="00:10:03.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the Penn Treebank. '92 was about when""" start="00:10:08.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the Linguistic Data Consortium was also established,""" start="00:10:12.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and it's been about 30 years""" start="00:10:16.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that it has been creating various""" start="00:10:18.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""language-related resources.""" start="00:10:20.720" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Org mode--in particular, the outlining mode,""" start="00:10:22.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or rather the enhanced form of outlining mode--""" start="00:10:28.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""allows us to create rich outlines,""" start="00:10:32.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""attaching properties to nodes,""" start="00:10:35.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and provides commands for easily customizing""" start="00:10:37.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""sorting of various pieces of information""" start="00:10:41.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as per one's requirement.""" start="00:10:43.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This can also be a very useful tool.""" start="00:10:45.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This enhanced form of outline-mode adds more power to Emacs.""" start="00:10:50.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It provides commands for easily customizing""" start="00:10:59.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and filtering information,""" start="00:11:03.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""while at the same time hiding unnecessary context.""" start="00:11:05.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It also allows structural editing.""" start="00:11:09.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This can be a very useful tool to enrich corpora""" start="00:11:11.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where we are focusing on limited amount of phenomena.""" start="00:11:16.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The two together allow us to create""" start="00:11:20.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a rich representation""" start="00:11:24.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that can simultaneously capture multiple possible sequences,""" start="00:11:27.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""capture details necessary to recreate the original source,""" start="00:11:33.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""allow the creation of hierarchical representation,""" start="00:11:38.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""provide structural editing capabilities""" start="00:11:42.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that can take advantage of the concept of inheritance""" start="00:11:44.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""within the tree structure.""" start="00:11:47.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Together they allow local manipulations of structures,""" start="00:11:49.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""thereby minimizing data coupling.""" start="00:11:54.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The concept of tags in Org mode""" start="00:11:56.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""complement the hierarchy part.""" start="00:11:59.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Hierarchies can be very rigid,""" start="00:12:01.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but to tags on hierarchies,""" start="00:12:03.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we can have a multifaceted representations.""" start="00:12:06.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""As a matter of fact, Org mode has the ability for the tags""" start="00:12:08.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to have their own hierarchical structure""" start="00:12:12.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""which further enhances the representational power.""" start="00:12:15.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""All of this can be done as a sequence""" start="00:12:18.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of mostly functional data transformations,""" start="00:12:22.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because most of the capabilities""" start="00:12:25.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""can be configured and customized.""" start="00:12:27.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It is not necessary to do everything at once.""" start="00:12:29.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Instead, it allows us to incrementally increase""" start="00:12:32.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the complexity of the representation.""" start="00:12:36.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Finally, all of this can be done""" start="00:12:37.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in plain-text representation""" start="00:12:39.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""which comes with its own advantages.""" start="00:12:42.360" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Now let's take a simple example.""" start="00:12:45.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This is a a short video that I'll play.""" start="00:12:50.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The sentence is &quot;I saw the moon with a telescope,&quot;""" start="00:12:56.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and let's just make a copy of the sentence.""" start="00:12:59.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""What we can do now is to see:""" start="00:13:04.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""what does this sentence comprise?""" start="00:13:09.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It has a noun phrase &quot;I,&quot;""" start="00:13:11.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""followed by a word &quot;saw.&quot;""" start="00:13:13.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Then &quot;the moon&quot; is another noun phrase,""" start="00:13:17.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and &quot;with the telescope&quot; is a prepositional phrase.""" start="00:13:21.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Now one thing that you might remember,""" start="00:13:24.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""from grammar school or syntax is that""" start="00:13:30.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""there is a syntactic structure.""" start="00:13:36.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And if you in this particular case--""" start="00:13:41.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because we know that the moon is not typically""" start="00:13:44.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""something that can hold the telescope,""" start="00:13:47.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that the seeing must be done by me or &quot;I,&quot;""" start="00:13:51.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and the telescope must be in my hand,""" start="00:13:56.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or &quot;I&quot; am viewing the moon with a telescope.""" start="00:14:01.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""However, it is possible that in a different context""" start="00:14:04.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the moon could be referring to an animated character""" start="00:14:13.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in a animated series, and could actually hold the telescope.""" start="00:14:17.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And this is one of the most--""" start="00:14:22.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the oldest and one of the most--""" start="00:14:23.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and in that case the situation might be""" start="00:14:24.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that I'm actually seeing the moon holding a telescope...""" start="00:14:26.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""I mean. The moon is holding the telescope,""" start="00:14:30.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and I'm just seeing the moon holding the telescope.""" start="00:14:36.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Complex linguistic ambiguity or linguistic""" start="00:14:40.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""phenomena that requires world knowledge,""" start="00:14:48.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and it's called the PP attachment problem""" start="00:14:53.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where the propositional phrase attachment""" start="00:14:55.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""can be ambiguous, and various different contextual cues""" start="00:14:59.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""have to be used to resolve the ambiguity.""" start="00:15:04.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So in this case, as you saw,""" start="00:15:06.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""both the readings are technically true,""" start="00:15:09.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""depending on different contexts.""" start="00:15:11.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So one thing we could do is just""" start="00:15:13.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to cut the tree and duplicate it,""" start="00:15:16.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and then let's create another node""" start="00:15:19.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and call it an &quot;OR&quot; node.""" start="00:15:21.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And because we are saying,""" start="00:15:24.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this is one of the two interpretations.""" start="00:15:26.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Now let's call one interpretation &quot;a&quot;,""" start="00:15:28.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and that interpretation essentially""" start="00:15:32.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is this child of that node &quot;a&quot;""" start="00:15:36.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and that says that the moon""" start="00:15:39.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is holding the telescope.""" start="00:15:41.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Now we can create another representation &quot;b&quot;""" start="00:15:44.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where we capture the other interpretation,""" start="00:15:46.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where this, the act, the moon or--I am actually""" start="00:15:53.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""holding the telescope,""" start="00:15:59.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and watching the moon using it.""" start="00:16:00.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So now we have two separate interpretations""" start="00:16:06.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in the same structure,""" start="00:16:09.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and all we do--we're able to do is with this,""" start="00:16:11.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with very quick key strokes now...""" start="00:16:15.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""While we are at it, let's add another interesting thing,""" start="00:16:18.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this node that represents &quot;I&quot;:""" start="00:16:22.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""&quot;He.&quot; It can be &quot;She&quot;.""" start="00:16:25.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""It can be &quot;the children,&quot; or it can be &quot;The people&quot;.""" start="00:16:28.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Basically, any entity that has the capability to &quot;see&quot;""" start="00:16:35.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""can be substituted in this particular node.""" start="00:16:45.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Let's see what we have here now.""" start="00:16:53.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We just are getting sort of a zoom view""" start="00:16:57.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of the entire structure, what we created,""" start="00:17:01.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and essentially you can see that""" start="00:17:04.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""by just, you know, using a few keystrokes,""" start="00:17:08.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we were able to capture two different interpretations""" start="00:17:11.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of a a simple sentence,""" start="00:17:17.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and they are also able to add""" start="00:17:20.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""these alternate pieces of information""" start="00:17:23.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that could help machine learning algorithms""" start="00:17:27.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""generalize better.""" start="00:17:30.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""All right.""" start="00:17:32.440" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Now, let's look at the next thing. So in a sense,""" start="00:17:36.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we can use this power of functional data structures""" start="00:17:40.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to represent various potentially conflicting""" start="00:17:46.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and structural readings of that piece of text.""" start="00:17:50.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""In addition to that, we can also create more texts,""" start="00:17:55.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""each with different structure,""" start="00:17:58.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and have them all in the same place.""" start="00:17:59.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This allows us to address the interpretation""" start="00:18:01.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of a static sentence that might be occurring in the world,""" start="00:18:04.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""while simultaneously inserting information""" start="00:18:06.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that would add more value to it.""" start="00:18:09.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This makes the enrichment process also very efficient.""" start="00:18:11.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Additionally, we can envision""" start="00:18:15.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a power user of the future, or present,""" start="00:18:19.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""who can not only annotate a span,""" start="00:18:24.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but also edit the information in situ""" start="00:18:27.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in a way that would help machine algorithms""" start="00:18:31.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""generalize better by making more efficient use""" start="00:18:34.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of the annotations.""" start="00:18:36.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So together, Emacs and Org mode can speed up""" start="00:18:37.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the enrichment of the signals""" start="00:18:41.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in a way that allows us""" start="00:18:42.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to focus on certain aspects and ignore others.""" start="00:18:44.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Extremely complex landscape of rich structures""" start="00:18:47.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""can be captured consistently,""" start="00:18:50.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in a fashion that allows computers""" start="00:18:53.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to understand language.""" start="00:18:55.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We can then build tools to enhance the tasks""" start="00:18:56.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that we do in our everyday life.""" start="00:19:00.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""YAMR is acronym, or the file's type or specification""" start="00:19:03.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that we are creating to capture this new""" start="00:19:10.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""rich representation.""" start="00:19:15.240" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""We'll now look at an example of spontaneous speech""" start="00:19:17.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that occurs in spoken conversations.""" start="00:19:21.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Conversations frequently contain errors in speech:""" start="00:19:24.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""interruptions, disfluencies,""" start="00:19:28.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""verbal sounds such as cough or laugh,""" start="00:19:30.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and other noises.""" start="00:19:33.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""In this sense, spontaneous speech is similar""" start="00:19:35.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to a functional data stream.""" start="00:19:38.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We cannot take back words that come out of our mouth,""" start="00:19:39.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but we tend to make mistakes, and we correct ourselves""" start="00:19:42.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""as soon as we realize that we have made--""" start="00:19:47.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we have misspoken.""" start="00:19:49.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This process manifests through a combination""" start="00:19:50.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of a handful of mechanisms, including immediate correction""" start="00:19:53.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""after an error, and we do this unconsciously.""" start="00:19:56.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Computers, on the other hand,""" start="00:20:00.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""must be taught to understand these cases.""" start="00:20:02.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""What we see here is a example document or outline,""" start="00:20:06.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or part of a document that illustrates""" start="00:20:12.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""various different aspects of the representation.""" start="00:20:18.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We don't have a lot of time to go through""" start="00:20:22.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""many of the details.""" start="00:20:25.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""I would highly encourage you to play a...""" start="00:20:28.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""I'm planning on making some videos, or ascii cinemas,""" start="00:20:31.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that I'll be posting, and you can,""" start="00:20:39.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""if you're interested, you can go through those.""" start="00:20:42.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The idea here is to try to do""" start="00:20:46.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a slightly more complex use case.""" start="00:20:50.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""But again, given the time constraint""" start="00:20:54.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and the amount of information""" start="00:20:57.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that needs to fit in the screen,""" start="00:21:00.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this may not be very informative,""" start="00:21:01.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but at least it will give you some idea""" start="00:21:05.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of what can be possible.""" start="00:21:08.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And in this particular case, what you're seeing is that""" start="00:21:10.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""there is a sentence which is &quot;What I'm I'm tr- telling now.&quot;""" start="00:21:13.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Essentially, there is a repetition of the word &quot;I'm&quot;,""" start="00:21:18.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and then there is a partial word""" start="00:21:21.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that somebody tried to say &quot;telling&quot;,""" start="00:21:23.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but started saying &quot;tr-&quot;, and then corrected themselves""" start="00:21:25.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and said, &quot;telling now.&quot;""" start="00:21:29.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So in this case, you see, we can capture words""" start="00:21:30.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or a sequence of words, or a sequence of tokens.""" start="00:21:39.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""One thing to... An interesting thing to note is that in NLP,""" start="00:21:44.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""sometimes we have to break typically""" start="00:21:52.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""words that don't have spaces into two separate words,""" start="00:21:55.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""especially contractions like &quot;I'm&quot;,""" start="00:22:01.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""so the syntactic parser needs needs two separate nodes.""" start="00:22:04.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""But anyway, so I'll... You can see that here.""" start="00:22:08.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The other... This view. What this view shows is that""" start="00:22:11.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with each of the nodes in the sentence""" start="00:22:15.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or in the representation,""" start="00:22:19.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you can have a lot of different properties""" start="00:22:23.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that you can attach to them,""" start="00:22:26.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and these properties are typically hidden,""" start="00:22:27.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""like you saw in the earlier slide.""" start="00:22:30.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""But you can make use of all these properties""" start="00:22:32.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to do various kind of searches and filtering.""" start="00:22:35.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And on the right hand side here--""" start="00:22:39.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this is actually not a legitimate syntax--""" start="00:22:43.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but on the right are descriptions""" start="00:22:48.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of what each of these represent.""" start="00:22:51.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""All the information is also available in the article.""" start="00:22:53.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""You can see there... It shows how much rich context""" start="00:22:57.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you can capture.""" start="00:23:04.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This is just a closer snapshot""" start="00:23:05.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of the properties on the node,""" start="00:23:08.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you can see we can have things like,""" start="00:23:10.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""whether the word is a token or not,""" start="00:23:13.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or that it's incomplete, whether some words""" start="00:23:14.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""might want to be filtered out for parsing,""" start="00:23:17.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and we can say this: PARSE_IGNORE,""" start="00:23:19.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or some words or restart markers...""" start="00:23:23.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We can mark, add a RESTART_MARKER, or sometimes,""" start="00:23:25.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""some of these might have durations. Things like that.""" start="00:23:29.240" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""The other fascinating thing of this representation""" start="00:23:32.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is that you can edit properties in the column view.""" start="00:23:38.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And suddenly, you have this tabular data structure""" start="00:23:42.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""combined with the hierarchical data structure.""" start="00:23:45.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And as you can--you may not be able to see it here,""" start="00:23:48.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but what has also happened here is that""" start="00:23:53.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""some of the tags have been inherited""" start="00:23:56.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""from the earlier nodes.""" start="00:24:01.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And so you get a much fuller picture of things.""" start="00:24:02.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Essentially you, can filter out things""" start="00:24:07.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that you want to process,""" start="00:24:13.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""process them, and then reintegrate it into the whole.""" start="00:24:15.320" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""So, in conclusion, today we have proposed and demonstrated""" start="00:24:20.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the use of an architecture (GRAIL),""" start="00:24:25.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""which allows the representation, manipulation,""" start="00:24:27.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and aggregation of rich linguistic structures""" start="00:24:31.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in a systematic fashion.""" start="00:24:34.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We have shown how GRAIL advances the tools""" start="00:24:36.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""available for building machine learning models""" start="00:24:41.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that simulate understanding.""" start="00:24:44.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Thank you very much for your time and attention today.""" start="00:24:46.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""My contact information is on this slide.""" start="00:24:51.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""If you are interested in an additional example""" start="00:24:54.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that demonstrates the representation""" start="00:25:02.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of speech and written text together,""" start="00:25:05.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""please continue watching.""" start="00:25:08.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Otherwise, you can stop here""" start="00:25:10.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and enjoy the rest of the conference.""" start="00:25:12.200" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Welcome to the bonus material.""" start="00:25:15.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""I'm glad for those of you who are stuck around.""" start="00:25:39.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""We are now going to examine an instance""" start="00:25:43.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of speech and text signals together""" start="00:25:46.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that produce multiple layers.""" start="00:25:49.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""When we have--when we take a spoken conversation""" start="00:25:51.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and use the best language processing models available,""" start="00:25:54.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we suddenly hit a hard spot""" start="00:25:58.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because the tools are typically not trained""" start="00:26:00.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to filter out the unnecessary cruft""" start="00:26:03.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in order to automatically interpret""" start="00:26:05.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the part of what is being said""" start="00:26:07.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that is actually relevant.""" start="00:26:09.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Over time, language researchers""" start="00:26:11.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""have created many interdependent layers of annotations,""" start="00:26:14.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""yet the assumptions underlying them are seldom the same.""" start="00:26:17.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Piecing together such related but disjointed annotations""" start="00:26:21.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""on their predictions poses a huge challenge.""" start="00:26:25.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This is another place where we can leverage""" start="00:26:28.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the data model underlying the Emacs editor,""" start="00:26:30.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""along with the structural editing capabilities""" start="00:26:33.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of Org mode to improve current tools.""" start="00:26:35.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Let's take this very simple looking utterance.""" start="00:26:38.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""&quot;Um \{lipsmack\} and that's it. (\{laugh\})&quot;""" start="00:26:42.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Looks like the person-- so this is--""" start="00:26:48.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""what you are seeing here is a transcript of an audio signal""" start="00:26:50.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that has a lip smack and a laugh as part of it,""" start="00:26:54.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and there is also a &quot;Um&quot; like interjection.""" start="00:27:00.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So this has a few interesting noises""" start="00:27:04.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and specific things that would be illustrative""" start="00:27:08.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of what we are going to, how we are going to represent it.""" start="00:27:14.000" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Okay. So let's say you want to have""" start="00:27:20.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a syntactic analysis of this sentence or utterance.""" start="00:27:25.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""One common technique people use""" start="00:27:28.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is just to remove the cruft, and, you know,""" start="00:27:30.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""write some rules, clean up the utterance,""" start="00:27:32.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""make it look like it's proper English,""" start="00:27:35.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and then, you know, tokenize it,""" start="00:27:36.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and basically just use standard tools to process it.""" start="00:27:40.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""But in that process, they end up eliminating""" start="00:27:43.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""valid pieces of signal that have meaning to others""" start="00:27:47.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""studying different phenomena of language.""" start="00:27:51.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Here you have the rich transcript,""" start="00:27:52.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the input to the syntactic parser.""" start="00:27:56.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""As you can see, there is a little tokenization happening""" start="00:28:00.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where you'll be inserting space""" start="00:28:05.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""between &quot;that&quot; and the contracted is ('s),""" start="00:28:07.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and between the period and the &quot;it,&quot;""" start="00:28:12.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and the output of the syntactic parser is shown below.""" start="00:28:15.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""which (surprise) is a S-expression.""" start="00:28:18.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Like I said, the parse trees, when they were created,""" start="00:28:21.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and still largely when they are used, are S-expressions,""" start="00:28:24.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and most of the viewers here""" start="00:28:29.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""should not have much problem reading it.""" start="00:28:33.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""You can see this tree structure""" start="00:28:35.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of this syntactic parser here.""" start="00:28:37.280" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Now let's say you want to integrate""" start="00:28:39.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""phonetic information or phonetic layer""" start="00:28:40.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that's in the audio signal, and do some analysis.""" start="00:28:44.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Now, it would need you to do a few-- take a few steps.""" start="00:28:49.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""First, you would need to align the transcript""" start="00:28:57.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with the audio. This process is called forced alignment,""" start="00:29:01.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where you already know what the transcript is,""" start="00:29:06.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you have the audio, and you can get a good alignment""" start="00:29:10.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""using both pieces of information.""" start="00:29:14.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And this is typically a technique that is used to""" start="00:29:17.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""create training data for training""" start="00:29:20.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""automatic speech recognizers.""" start="00:29:23.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""One interesting thing is that in order to do""" start="00:29:25.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""this forced alignment, you have to keep""" start="00:29:29.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the non-speech events in transcript,""" start="00:29:32.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because they consume some audio signal,""" start="00:29:35.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and if you don't have that signal,""" start="00:29:39.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the alignment process doesn't know exactly...""" start="00:29:41.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you know, it doesn't do a good job,""" start="00:29:44.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because it needs to align all parts of the signal""" start="00:29:45.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with something, either pause or silence or noise or words.""" start="00:29:50.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Interestingly, punctuations really don't factor in,""" start="00:29:55.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because we don't speak in punctuations.""" start="00:29:59.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So one of the things that you need to do""" start="00:30:01.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""is remove most of the punctuations,""" start="00:30:04.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""although you'll see there are some punctuations""" start="00:30:05.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that can be kept, or that are to be kept.""" start="00:30:08.040" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""And the other thing is that the alignment has to be done""" start="00:30:12.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""before tokenization, as it impacts pronunciation.""" start="00:30:15.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""To show an example: Here you see &quot;that's&quot;.""" start="00:30:20.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""When it's one word,""" start="00:30:24.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""it has a slightly different pronunciation""" start="00:30:26.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""than when it is two words, which is &quot;that is&quot;,""" start="00:30:31.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""like you can see &quot;is.&quot; And so,""" start="00:30:35.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""if you split the tokens or split the words""" start="00:30:38.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in order for syntactic parser to process it,""" start="00:30:44.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you would end up getting the wrong phonetic analysis.""" start="00:30:48.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And if you have--if you process it""" start="00:30:51.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""through the phonetic analysis,""" start="00:30:54.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you don't know how to integrate it""" start="00:30:55.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with the tokenized syntax, you can, you know,""" start="00:30:59.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that can be pretty tricky. And a lot of time,""" start="00:31:02.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""people write one-off pieces of code that handle these,""" start="00:31:07.520" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but the idea here is to try to have a general architecture""" start="00:31:10.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that seamlessly integrates all these pieces.""" start="00:31:14.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Then you do the syntactic parsing of the remaining tokens.""" start="00:31:17.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Then you align the data and the two annotations,""" start="00:31:21.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and then integrate the two layers.""" start="00:31:24.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Once that is done, then you can do all kinds of""" start="00:31:27.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""interesting analysis, and test various hypotheses""" start="00:31:31.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and generate the statistics,""" start="00:31:33.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""but without that you only are dealing""" start="00:31:35.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""with one or the other part.""" start="00:31:39.360" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""Let's just take a quick look at how each of the layers""" start="00:31:42.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that are involved look like.""" start="00:31:48.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So this is &quot;Um \{lipsmack\}, and that's it. \{laugh\}&quot;""" start="00:31:51.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This is the transcript, and on the right hand side,""" start="00:31:56.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you see the same thing as a transcript""" start="00:32:00.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""listed in a vertical in a column.""" start="00:32:04.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""You'll see why, in just a second.""" start="00:32:06.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And there are some place--""" start="00:32:08.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""there are some rows that are empty,""" start="00:32:09.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""some rows that are wider than the others, and we'll see why.""" start="00:32:11.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""The next is the tokenized sentence""" start="00:32:15.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""where you have space added,""" start="00:32:19.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you know space between these two tokens:""" start="00:32:20.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""&quot;that&quot; and the apostrophe &quot;s&quot; ('s),""" start="00:32:23.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and the &quot;it&quot; and the &quot;period&quot;.""" start="00:32:26.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And you see on the right hand side""" start="00:32:28.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that the tokens have attributes.""" start="00:32:30.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So there is a token index, and there are 1, 2,""" start="00:32:33.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""you know 0, 1, 2, 3, 4, 5 tokens,""" start="00:32:36.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and each token has a start and end character,""" start="00:32:38.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and space (sp) also has a start and end character,""" start="00:32:41.480" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and space is represented by a &quot;sp&quot;. And there are""" start="00:32:45.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""these other things that we removed,""" start="00:32:50.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""like the &quot;\{LS\}&quot; which is for &quot;\{lipsmack\}&quot;""" start="00:32:54.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and &quot;\{LG\}&quot; which is &quot;\{laugh\}&quot; are showing grayed out,""" start="00:32:56.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you'll see why some of these things are grayed out""" start="00:32:59.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""in a little bit.""" start="00:33:02.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""This is what the forced alignment tool produces.""" start="00:33:03.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Basically, it takes the transcript,""" start="00:33:11.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and this is the transcript""" start="00:33:17.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that has slightly different symbols,""" start="00:33:19.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because different tools use different symbols""" start="00:33:24.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and their various configurational things.""" start="00:33:26.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""But this is what is used to get an alignment""" start="00:33:28.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or time alignment with phones.""" start="00:33:33.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So this column shows the phones, and so each word...""" start="00:33:36.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So, for example, &quot;and&quot; has been aligned with these phones,""" start="00:33:40.080" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and these on the start and end""" start="00:33:43.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""are essentially temporal or time stamps that it aligned--""" start="00:33:46.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that has been aligned to it.""" start="00:33:52.960" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Interestingly, sometimes we don't really have any pause""" start="00:33:54.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or any time duration between some words""" start="00:34:00.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and those are highlighted as gray here.""" start="00:34:05.160" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""See, there's this space... Actually""" start="00:34:08.200" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""it does not have any temporal content,""" start="00:34:12.760" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""whereas this other space has some duration.""" start="00:34:17.800" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So the ones that have some duration are captured,""" start="00:34:21.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""while the others are the ones that in the earlier diagram""" start="00:34:24.840" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""we saw were left out.""" start="00:34:29.520" video="mainVideo-grail" id="subtitle"]]
+[[!template new="1" text="""And the aligner actually produces multiple files.""" start="00:34:31.320" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""One of the files has a different, slightly different""" start="00:34:37.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""variation on the same information,""" start="00:34:44.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and in this case, you can see""" start="00:34:46.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""that the punctuation is missing,""" start="00:34:50.000" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and the punctuation is, you know, deliberately missing,""" start="00:34:52.400" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""because there is no time associated with it,""" start="00:34:57.600" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you see that it's not the tokenized sentence--""" start="00:35:02.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""a tokenized word. This... Now it gives you a full table,""" start="00:35:06.440" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and you can't really look into it very carefully.""" start="00:35:17.120" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""But we can focus on the part that seems legible,""" start="00:35:21.240" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""or, you know, properly written sentence,""" start="00:35:25.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""process it and reincorporate it back into the whole.""" start="00:35:28.560" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""So if somebody wants to look at, for example,""" start="00:35:32.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""how many pauses the person made while they were talking,""" start="00:35:35.880" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And they can actually measure the pause, the number,""" start="00:35:39.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the duration, and make connections between that""" start="00:35:42.920" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and the rich syntactic structure that is being produced.""" start="00:35:46.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""And in order to do that, you have to get these layers""" start="00:35:49.640" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""to align with each other,""" start="00:35:57.280" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""and this table is just a tabular representation""" start="00:35:59.040" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""of the information that we'll be storing in the YAMR file.""" start="00:36:04.360" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Congratulations! You have reached""" start="00:36:08.680" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""the end of this demonstration.""" start="00:36:11.720" video="mainVideo-grail" id="subtitle"]]
+[[!template text="""Thank you for your time and attention.""" start="00:36:13.480" video="mainVideo-grail" id="subtitle"]]
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20grail%3A%20GRAIL---A%20Generalized%20Representation%20and%20Aggregation%20of%20Information%20Layers)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/grail-before.md b/2022/info/grail-before.md
new file mode 100644
index 00000000..26e0d6c1
--- /dev/null
+++ b/2022/info/grail-before.md
@@ -0,0 +1,33 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+# Talk
+
+<div class="vid"><video controls preload="none" id="grail-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="grail-mainVideo" data="""
+00:00.000 Introduction
+01:13.400 Processing language
+02:34.560 Annotation
+03:43.240 Learning from data
+04:39.680 Manual annotation
+05:44.400 How can we develop a unified representation?
+06:22.520 What role might Emacs and Org mode play?
+06:55.280 The complex structure of language
+08:10.800 Annotation tools
+10:22.360 Org mode
+12:45.480 Example
+17:36.240 Different readings
+19:17.680 Spontaneous speech
+23:32.000 Editing properties in column view
+24:20.280 Conclusion
+25:15.280 Bonus material
+27:20.480 Syntactic analysis
+28:39.280 Forced alignment
+30:12.600 Alignment before tokenization
+31:42.880 Layers
+34:31.320 Variations
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.webm">Download --main.webm (81MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.opus">Download --main.opus (18MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/iepyHuSZMww6K4yfkntTpA">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="grail-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.webm" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div>Listen to just the audio:<br /><audio controls preload="none" id="grail-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.webm">Download --answers.webm (41MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--answers.opus">Download --answers.opus (16MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/grail-nav.md b/2022/info/grail-nav.md
new file mode 100644
index 00000000..a81dc915
--- /dev/null
+++ b/2022/info/grail-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/async">Emacs was async before async was cool</a>
+Next by track: <a href="/2022/talks/dbus">The Wheels on D-Bus</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/handwritten-after.md b/2022/info/handwritten-after.md
new file mode 100644
index 00000000..7b9f8fb5
--- /dev/null
+++ b/2022/info/handwritten-after.md
@@ -0,0 +1,123 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="handwritten-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Can you recognize this building?""" start="00:00:00.000" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""Some of you may have recognized this.""" start="00:00:08.080" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""This building is called""" start="00:00:09.800" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""the John Hancock building.""" start="00:00:11.440" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""This is in Chicago.""" start="00:00:14.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""I recently bought this building.""" start="00:00:17.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Isn't it nice?""" start="00:00:19.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Heavens no!""" start="00:00:21.320" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""I am in my home in Pune in India.""" start="00:00:23.240" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""I am Bala Ramadurai,""" start="00:00:27.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""an author, professor, and an innovation coach.""" start="00:00:29.160" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Hello and welcome to my talk on""" start="00:00:33.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""“How to incorporate handwritten notes""" start="00:00:36.000" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""into Emacs Org Mode”""" start="00:00:39.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Now, why did I show you this building?""" start="00:00:42.280" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""The name is of interest for this talk.""" start="00:00:45.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""In the US, someone's signature is""" start="00:00:49.400" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""also referred to as their Hancock.""" start="00:00:52.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Your handwriting is pretty much part of your identity.""" start="00:00:55.200" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""It is as fundamental as that.""" start="00:00:59.680" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Of course, there is a movie by that name too, Hancock.""" start="00:01:03.120" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""I could have started with a clip from that movie,""" start="00:01:07.600" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""but in spite of Will Smith and Charlize Theron,""" start="00:01:12.000" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""both my favorite movie stars in the movie, I hated it.""" start="00:01:15.880" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""[Clip from Hancock (2008)]""" start="00:01:24.160" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""But I digress.""" start="00:01:35.160" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Handwriting has been a fascinating topic for me.""" start="00:01:40.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""However, note-taking has always been on my computer,""" start="00:01:44.200" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""in particular, in the Emacs Org Mode system.""" start="00:01:49.720" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""It is so easy to note down anything,""" start="00:01:54.120" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""add a schedule, add a deadline,""" start="00:01:57.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""search anything you want, link anything you want,""" start="00:01:59.840" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""export it to any format, track what you've been doing,""" start="00:02:04.280" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""clock your tasks, and on and on and on.""" start="00:02:07.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""It's such a squeaky-clean system to""" start="00:02:12.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""track everything and link it to""" start="00:02:15.520" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""anything from the digital world.""" start="00:02:17.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Sharing the original notes is still a pain in the rear,""" start="00:02:20.800" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""but for personal stuff, it's awesome.""" start="00:02:24.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""But then what about handwriting?""" start="00:02:29.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""Research seems to suggest that handwritten notes""" start="00:02:32.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""can enhance clarity of thought, retention,""" start="00:02:35.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""sometimes even getting rid of your worries.""" start="00:02:40.200" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""[Fried, C. B. (2008). In-class laptop use and
+its effects on student learning]""" start="00:02:50.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""[Speaker displays articles on Note-taking]""" start="00:03:06.400" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""My experience seems to agree with that too.""" start="00:03:13.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""As a professor, my fear has always been""" start="00:03:17.840" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""this quote, “Lecturing is that mysterious process""" start="00:03:21.200" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""by means of which the contents of the notebook""" start="00:03:25.200" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""of the professor are transferred""" start="00:03:29.240" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""through the instrument of the fountain pen""" start="00:03:31.880" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""to the notebook of the student""" start="00:03:34.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""without passing through the mind of either.”""" start="00:03:37.280" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Hmmm... So, question — How do we combine""" start="00:03:40.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""the efficient Org Mode system""" start="00:03:45.680" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""with the effective handwritten note-taking system?""" start="00:03:48.160" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Merge the systems together. Absolutely.""" start="00:03:53.720" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""How do you do that?""" start="00:03:56.800" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Step 1: Write the notes by hand""" start="00:03:59.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""on a notebook. Pen, pencil.""" start="00:04:03.680" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Keep some convention for yourselves""" start="00:04:06.080" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""for tracking tasks like a star or an asterisk.""" start="00:04:09.000" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Step 2: Scan them using""" start="00:04:13.040" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""your favourite mobile app.""" start="00:04:16.400" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""I recommend Adobe Scan or Dropbox.""" start="00:04:18.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Step 3: store the document as a JPG file""" start="00:04:23.440" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""into a folder called Inbox.""" start="00:04:30.000" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Make sure this syncs into a cloud storage folder""" start="00:04:32.680" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""and your Org Mode system""" start="00:04:37.760" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""has access to this folder.""" start="00:04:39.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""(Optional) Step 4: convert the notes into text""" start="00:04:41.120" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""using Google Keep or just type""" start="00:04:45.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""the damn thing one more time.""" start="00:04:49.320" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Then you can process that""" start="00:04:51.520" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""in your Org Mode system""" start="00:04:54.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""as you always do in whatever""" start="00:04:56.240" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""is there in your inbox.""" start="00:04:59.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""But, three steps or four before I get access""" start="00:05:02.120" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""to my notes and into my Org Mode?""" start="00:05:06.120" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""What a precious waste of time.""" start="00:05:09.400" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""I'd rather be tinkering with my""" start="00:05:11.640" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""config file in that time, correct?""" start="00:05:14.120" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Boy...""" start="00:05:18.800" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Get or buy or gift or convince your partner,""" start="00:05:19.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""parent, or anybody else to gift yourself""" start="00:05:24.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""a touch-enabled large device.""" start="00:05:29.720" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Then use an app like OneNote to write notes""" start="00:05:31.960" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""on the device and link the handwritten note""" start="00:05:37.880" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""directly into Org Mode by copying the link.""" start="00:05:41.440" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""You can use a shortcut like Ctrl-1""" start="00:05:46.240" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""to mark the todos, but that means it remains""" start="00:05:54.080" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""only on OneNote ecosystem, the todos.""" start="00:05:59.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""You can use the same app to also convert""" start="00:06:05.160" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""the handwritten note into text""" start="00:06:14.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""just by the click of a button.""" start="00:06:18.320" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""As a bonus, you can even include screenshots""" start="00:06:23.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""from your online meetings.""" start="00:06:27.360" video="mainVideo-handwritten" id="subtitle"]]
+[[!template new="1" text="""I like both my options.""" start="00:06:30.920" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Option 1: use a regular notebook,""" start="00:06:33.440" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""scan and process them into my inbox.""" start="00:06:36.440" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Option 2: write the notes in a digital device""" start="00:06:40.840" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""and convert them into text.""" start="00:06:44.560" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Or, third option, I appeal to thee,""" start="00:06:46.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""oh great community, can you please build a package""" start="00:06:52.480" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""inside Org Mode that recognises handwriting""" start="00:06:57.000" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""to export it into our Org Mode, Emacs Org Mode.""" start="00:07:00.960" video="mainVideo-handwritten" id="subtitle"]]
+[[!template text="""Thank you so much for your attention. Bye.""" start="00:07:10.040" video="mainVideo-handwritten" id="subtitle"]]
+
+
+
+Captioner: jai
+
+Questions or comments? Please e-mail [bala@balaramadurai.net](mailto:bala@balaramadurai.net?subject=Comment%20for%20EmacsConf%202022%20handwritten%3A%20How%20to%20incorporate%20handwritten%20notes%20into%20Emacs%20Orgmode)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/handwritten-before.md b/2022/info/handwritten-before.md
new file mode 100644
index 00000000..43c65cf1
--- /dev/null
+++ b/2022/info/handwritten-before.md
@@ -0,0 +1,50 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Bala Ramadurai shares how he takes handwritten notes and includes them in his Org Mode files. Afterwards, he will handle questions over BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="handwritten">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect stroke-width="3" x="101" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 8-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-handwritten>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T15:05:00Z" end="2022-12-03T15:15:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~10:05 AM - 10:15 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~9:05 AM - 9:15 AM CST (US/Central)<br />Saturday, Dec 3 2022, ~8:05 AM - 8:15 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~7:05 AM - 7:15 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~3:05 PM - 3:15 PM UTC <br />Saturday, Dec 3 2022, ~4:05 PM - 4:15 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~5:05 PM - 5:15 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~8:35 PM - 8:45 PM IST (Asia/Kolkata)<br />Saturday, Dec 3 2022, ~11:05 PM - 11:15 PM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~12:05 AM - 12:15 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="handwritten-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="handwritten-mainVideo" data="""
+00:02.200 Introduction
+01:41.080 Org Mode
+02:29.520 Handwriting
+03:42.167 Combining Org Mode and handwriting
+03:59.720 Step 1: Write the notes by hand
+04:14.420 Step 2: Scan them
+04:23.640 Step 3: Store the document
+04:42.300 (Optional) Step 4: Convert the notes
+05:02.280 Using touch devices
+06:30.920 Options
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.webm">Download --main.webm (80MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--script.fountain">Download --script.fountain</a></li><li><a href="https://toobnix.org/w/kr86uvn8KHey8cGULY71Aw">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="handwritten-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="handwritten-qanda" data="""
+00:30.160 How do you link the notes together so that you could search through them in the future?
+01:51.649 Is it necessary to OCR your handwriting?
+03:59.351 What about searching notes? Notes to text while being offline?
+06:00.080 Have you looked at taking handwritten notes on a tablet like Xournal++?
+07:32.160 Have you tried out the reMarkable device and figured out how to link the files back into Org mode constructivley yet?
+09:26.299 Handwritten and org transcribed notes de-duplication for searching: do you want one or the other, both?
+12:01.280 How often do you instead type in and summarize your notes?
+15:14.164 How fancy has your handwritten notes import been?
+21:58.411 Do you actually have a device of your own that allows you to take notes like this? Or is it just written on paper?
+24:36.320 Mindmaps
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="handwritten-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.webm">Download --answers.webm (103MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-handwritten--how-to-incorporate-handwritten-notes-into-emacs-orgmode--bala-ramadurai--answers.opus">Download --answers.opus (11MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/handwritten-nav.md b/2022/info/handwritten-nav.md
new file mode 100644
index 00000000..1ef722c7
--- /dev/null
+++ b/2022/info/handwritten-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/treesitter">Tree-sitter beyond syntax highlighting</a>
+Next by track: <a href="/2022/talks/lspbridge">lsp-bridge: a smooth-as-butter asynchronous LSP client</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/haskell-after.md b/2022/info/haskell-after.md
new file mode 100644
index 00000000..e9e454fb
--- /dev/null
+++ b/2022/info/haskell-after.md
@@ -0,0 +1,466 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="haskell-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Today, I will talk about Haskell code exploration for Emacs.""" start="00:00:00.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""What is Haskell? It is a purely functional language.""" start="00:00:03.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""For example, every value in Haskell is immutable.""" start="00:00:06.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And it is the main compiler of Haskell, GHC.""" start="00:00:09.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It provides API for the whole compilation pipeline.""" start="00:00:13.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""For example, the tools mentioned in this talk,""" start="00:00:16.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including hcel and haddorg,""" start="00:00:18.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""they use, they heavily utilize the GHC front-end API""" start="00:00:20.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for parsing and understanding""" start="00:00:24.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the identifiers in Haskell source files.""" start="00:00:26.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Roughly speaking,""" start="00:00:29.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""a Haskell program consists of several parts.""" start="00:00:31.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""it begins with some front matters, including,""" start="00:00:34.664" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for example, language extensions,""" start="00:00:37.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which are optional language features one might want to use""" start="00:00:40.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for convenience.""" start="00:00:44.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The front matters also contain module exports.""" start="00:00:48.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So for example, here we define,""" start="00:00:52.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""we declare module F2Md.Config""" start="00:00:55.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for this Haskell source file,""" start="00:00:58.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which exports these four identifiers""" start="00:01:00.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that other source files can use when importing F2Md.Config.""" start="00:01:03.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And the next will be""" start="00:01:07.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""a block of imports so that we can use libraries""" start="00:01:10.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and identifiers in these libraries.""" start="00:01:14.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The bulk of a Haskell source file normally is""" start="00:01:17.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""a list of declarations,""" start="00:01:21.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including values, types, and instances, and so on.""" start="00:01:23.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The difference between a value and a type is that""" start="00:01:26.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the type of a value is a type,""" start="00:01:29.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and the type of a type is a kind.""" start="00:01:30.500" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""For example, here's a small block of Haskell source code.""" start="00:01:34.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We define Range type""" start="00:01:38.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""from a lower-end integer to a higher-end integer.""" start="00:01:41.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We also declare a value r of the type Range,""" start="00:01:45.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which is Range from 2 to 7,""" start="00:01:51.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""because in Haskell, we like to--""" start="00:01:54.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""by default, functions can be curried,""" start="00:02:01.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which basically means, by default, we want to utilize""" start="00:02:04.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the partial application of functions.""" start="00:02:09.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We don't require parens surrounding arguments""" start="00:02:12.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""when invoking a function.""" start="00:02:17.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""That makes it possible, if you want,""" start="00:02:19.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to write Haskell like Lisp""" start="00:02:22.725" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""by adding a bit of redundant parens.""" start="00:02:25.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So for example,""" start="00:02:28.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""here are two blocks of code, one Lisp, one Haskell,""" start="00:02:30.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and they look quite similar to each other.""" start="00:02:33.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""What is a code explorer?""" start="00:02:36.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""A code explorer is a tool""" start="00:02:38.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to browse its code base to its code comprehension.""" start="00:02:39.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Code explorer commonly comes with""" start="00:02:42.724" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""several functionalities or features,""" start="00:02:45.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including a cross-referencer,""" start="00:02:47.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which allows going to definitions of an identifier at points""" start="00:02:49.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or looking up references of an identifier,""" start="00:02:53.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like where it is used.""" start="00:02:56.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So the example in Emacs would be xref.""" start="00:02:58.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Code explorer also would be able to show you""" start="00:03:04.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""documentation and signatures of identifiers at points.""" start="00:03:07.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""In Emacs, that would be eldoc.""" start="00:03:10.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It also commonly allows you to search for identifiers.""" start="00:03:13.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Something like that in Emacs""" start="00:03:17.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""could be describe-function and find-function.""" start="00:03:19.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Code explorer is normally""" start="00:03:22.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""quite often implemented in two parts,""" start="00:03:24.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the indexer and the server,""" start="00:03:27.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""where the indexer parses the source code files,""" start="00:03:28.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""indexes the identifiers,""" start="00:03:32.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and stores the information of identifiers""" start="00:03:34.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like the definition, size, and the currencies,""" start="00:03:36.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""either in databases or in files.""" start="00:03:38.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The other part is the server,""" start="00:03:42.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which uses the database created by the indexer""" start="00:03:44.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to serve the information of the identifier.""" start="00:03:49.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Before I present my solution to code exploring,""" start="00:03:53.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""some description of prior art is in order.""" start="00:03:57.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""There are several tools that you can use""" start="00:04:01.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to aid code exploration,""" start="00:04:05.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including tech-based tools like hasktags and hs-tags.""" start="00:04:08.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The limitation with these tools""" start="00:04:13.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""is they are focused on the current projects only""" start="00:04:15.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and do not work""" start="00:04:18.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for cross-packaging reference and definition.""" start="00:04:19.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Another problem with the tag-based tools is""" start="00:04:26.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""they might not handle symbols with the same name properly.""" start="00:04:31.045" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Sometimes they get confused,""" start="00:04:34.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and they ask you to choose which definition,""" start="00:04:36.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""what is the correct definition site,""" start="00:04:43.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""even though the occurrence of the symbol""" start="00:04:46.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or the symbol at point has only one definition ambiguously.""" start="00:04:49.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Another tool is the haskell-mode.""" start="00:04:55.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""It has some limited support for eldoc""" start="00:04:58.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""by displaying the signature of an identifier at points,""" start="00:05:02.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""but the identifier has to be something""" start="00:05:06.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that is commonly known or sort of built-in""" start="00:05:11.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or come from the base library of Haskell.""" start="00:05:15.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So for example,""" start="00:05:18.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""it works for common functions like head and tail.""" start="00:05:20.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And you can see that the signature is displayed here.""" start="00:05:24.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""However, it does not work for,""" start="00:05:27.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""let's say, IO. IO is a type.""" start="00:05:29.664" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Maybe that's the reason.""" start="00:05:31.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's find another function""" start="00:05:33.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that's not from the base library.""" start="00:05:37.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""toJSON is from the Aeson library,""" start="00:05:40.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""so no signature is displayed here.""" start="00:05:42.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""It also provides""" start="00:05:47.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""some sort of goto-declaration functionality""" start="00:05:51.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to jump to any declaration in a file.""" start="00:05:53.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""To do that, one has to first run haskell-decl-scan-mode""" start="00:05:56.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to enter this minor mode.""" start="00:06:00.664" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Then we can run imenu to go to any definition,""" start="00:06:03.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to go to any declaration, like getHomeR.""" start="00:06:08.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Apparently, after running that,""" start="00:06:11.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""we are able to go to definition.""" start="00:06:13.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So for example, let's see,""" start="00:06:16.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""we want to find definition of getCityJR.""" start="00:06:19.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And indeed, it works""" start="00:06:22.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""if it's within the same source file, of course.""" start="00:06:25.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It still does not work for cross-packaging identifiers.""" start="00:06:28.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So HandlerFor is probably an identifier from servant.""" start="00:06:32.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Or no, not necessarily servant. Maybe WAI.""" start="00:06:37.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Anyway, it's another library.""" start="00:06:40.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And how about find-references?""" start="00:06:43.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""find-references also works somehow for this file.""" start="00:06:50.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""How about WidgetFor?""" start="00:07:01.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It works for WidgetFor too.""" start="00:07:06.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It has some support for goto-definition and find-references.""" start="00:07:13.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""But as usual, it does not support such things cross-package.""" start="00:07:18.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""And finally, we have""" start="00:07:26.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the Sledgehammer HLS Haskell language server.""" start="00:07:27.365" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It can be used with EGLOT.""" start="00:07:31.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""But the problem with HLS, HLS has many many features""" start="00:07:33.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""because it is a language server,""" start="00:07:40.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like renaming, like eldoc for standard libraries, and so on.""" start="00:07:42.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""But the problem with HLS is, one, that it is very, very slow.""" start="00:07:51.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And I wouldn't use it with my laptop.""" start="00:07:57.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And two, it also does not support cross-package referencing.""" start="00:08:00.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""In fact, there's an outstanding GitHub issue about this.""" start="00:08:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So cross-package referencing and goto-definition""" start="00:08:08.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""is sort of a common shortfall,""" start="00:08:13.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""a common problem for these existing Haskell code explorers.""" start="00:08:17.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Then finally, we also have hoogle and hackage.""" start="00:08:21.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Hoogle is a search engine for Haskell identifiers,""" start="00:08:23.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and the results link to Hackage,""" start="00:08:28.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which is the Haskell documentation website""" start="00:08:30.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for all Haskell libraries.""" start="00:08:33.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Haskell Hackage has functionality""" start="00:08:35.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""where you can jump to the source code file rendered in HTML,""" start="00:08:40.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and you can click on the identifiers there""" start="00:08:45.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to jump to definitions,""" start="00:08:49.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""but it does not support find references,""" start="00:08:51.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and it is rather basic.""" start="00:08:54.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Then I learned about haskell-code-explorer,""" start="00:08:59.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which is a fully-fledged Haskell code explorer.""" start="00:09:01.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It is written by someone else.""" start="00:09:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It is a web application""" start="00:09:07.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for exploring Haskell package codebases.""" start="00:09:09.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The official reference instance for haskell-code-explorer""" start="00:09:12.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""is available at this URL, which I will demo soon.""" start="00:09:16.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""What I did with these packages... I ported it to GHC 9.2.""" start="00:09:19.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I renamed it to hcel because I want to focus on Emacs clients""" start="00:09:25.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""rather than JavaScript clients, which I will explain later.""" start="00:09:29.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And I also wrote an Emacs client package, of course.""" start="00:09:31.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""This is what haskell-code-explorer looks like.""" start="00:09:37.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""On the homepage, it is a list of indexed packages""" start="00:09:41.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""indexed by the indexer.""" start="00:09:47.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""One can filter it by the package name""" start="00:09:50.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or look for identifiers directly across all packages.""" start="00:09:53.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's have a look at base. There are three versions.""" start="00:10:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's have a look at the latest version, 4.12.0.0.""" start="00:10:09.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Once entering the package view,""" start="00:10:15.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""you are shown a list of all modules by their path,""" start="00:10:19.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""as well as a tree of these module files.""" start="00:10:24.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""You can filter by module name or file name,""" start="00:10:29.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or you can search for identifier within the same package""" start="00:10:32.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or in all packages.""" start="00:10:34.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's say we want to learn about Control.Monad.""" start="00:10:36.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Now we are in the module view.""" start="00:10:43.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The source file is presented to you,""" start="00:10:46.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and it has links to identifiers.""" start="00:10:49.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""When you hover over them, the documentation shows up,""" start="00:10:55.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including the signature where it is defined.""" start="00:11:01.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""You can go to its definition or find references.""" start="00:11:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's say we want to go to the definition of Monad.""" start="00:11:10.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It jumps to the definition site of the monad type class.""" start="00:11:20.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""If we click at the definition site,""" start="00:11:25.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""it brings up a list of references.""" start="00:11:28.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""On the left, you can choose""" start="00:11:32.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which package you want to find references of monad in.""" start="00:11:33.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's look at the random one, avwx.""" start="00:11:39.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Here is a list of results where Monad is used in avwx.""" start="00:11:47.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This is a module path.""" start="00:11:54.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""One can go to any of these results.""" start="00:11:57.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We can search for things in all packages""" start="00:12:06.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""or in the current package.""" start="00:12:07.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let’s say I want to search for &quot;Read&quot;""" start="00:12:09.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I think this is the &quot;Read&quot; that is commonly used in Haskell,""" start="00:12:13.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the read type class for parsing strings into values.""" start="00:12:19.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I think that is more or less it.""" start="00:12:25.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""That is the Haskell Code Explorer web application""" start="00:12:31.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""in all its glory.""" start="00:12:34.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Let's go back to the slides.""" start="00:12:38.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""That was the web application,""" start="00:12:40.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which is basically a JavaScript client""" start="00:12:43.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that talks to the server""" start="00:12:46.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""by sending requests and receiving""" start="00:12:48.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and parsing the JSON results or JSON responses.""" start="00:12:51.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Initially, I was interested in hacking the web client.""" start="00:12:55.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It uses the ember.js web framework.""" start="00:13:02.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The first thing to do was to npm install ember-cli.""" start="00:13:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It gives me 12 vulnerabilities,""" start="00:13:09.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""4 low, 2 moderate, 3 high, 3 critical.""" start="00:13:16.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I don't know how often it is the case""" start="00:13:19.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""when we don't really care about these nasty vulnerabilities""" start="00:13:26.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""from Node.js or npm because they are so common.""" start="00:13:33.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I don't quite like that.""" start="00:13:36.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Another reason for favoring Emacs clients""" start="00:13:41.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""over JavaScript clients is user freedom.""" start="00:13:45.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Emacs is geared towards user freedom.""" start="00:13:49.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It allows users maximum freedom to customize or mod Emacs.""" start="00:13:53.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I think Emacs clients can be a way to fix JavaScript traps,""" start="00:14:01.664" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like using user scripts to replace non-free JavaScript.""" start="00:14:07.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""There are tools to do that, for example, like Haketilo.""" start="00:14:14.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Why write JavaScript replacement""" start="00:14:19.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""if we can write Elisp replacement?""" start="00:14:21.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""If we overwrite all kinds of front-ends in Emacs""" start="00:14:25.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for commonly-used web applications""" start="00:14:31.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like Reddit, Hacker News, what have you,""" start="00:14:34.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""then we have an Emacs app store""" start="00:14:37.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""where we can just install these applications""" start="00:14:40.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and browse the web more freely.""" start="00:14:43.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Back to hcel, which is the Emacs client I wrote.""" start="00:14:51.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I tried to reuse as much of Emacs built-ins as possible,""" start="00:14:56.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including eldoc, for showing documentation,""" start="00:14:59.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""xref for cross-referencer,""" start="00:15:03.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""compilation-mode for showing search results of identifiers,""" start="00:15:04.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""outline-mode for a hierarchical view""" start="00:15:07.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""of package module identifiers,""" start="00:15:11.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""sort of a cursor-mode for highlighting identifiers,""" start="00:15:14.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""help-mode for displaying quick help for Haskell identifiers,""" start="00:15:18.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""integration with haddorg,""" start="00:15:26.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which I will mention later, etc.""" start="00:15:27.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It is available as hcel without the dot on GNU ELPA.""" start="00:15:31.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Time for a demo.""" start="00:15:38.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""To start using hc.el, surprise surprise,""" start="00:15:40.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""we run the hcel command.""" start="00:15:42.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We are presented with a list of packages""" start="00:15:45.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""indexed by the hcel indexer.""" start="00:15:46.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This is an outline mode,""" start="00:15:52.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""so we can tab to list all the modules""" start="00:15:54.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""represented by the module path.""" start="00:15:58.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We can further tab into the list of identifiers""" start="00:16:01.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""declared in this module.""" start="00:16:03.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Now it asks whether you want to open module source.""" start="00:16:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This is because some module source code""" start="00:16:09.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""can be quite large and it can take a bit of time.""" start="00:16:11.984" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""In this case, the control monad is quite small,""" start="00:16:14.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""so let's say yes.""" start="00:16:17.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We see the list of identifiers.""" start="00:16:19.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""One can jump to an identifier forever.""" start="00:16:24.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""As you can see, the identifiers at points are highlighted.""" start="00:16:28.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This can be particularly useful""" start="00:16:33.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""in a large function declaration""" start="00:16:36.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""where you come to see, for example,""" start="00:16:38.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""all the occurrences of an identifier""" start="00:16:40.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""inside the body of the declaration.""" start="00:16:44.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""These are declarations""" start="00:16:48.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which in Haskell mode are listed in imenu.""" start="00:16:50.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We can do the same here in hcel source mode.""" start="00:16:53.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It lists all the declarations with their signature.""" start="00:17:00.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's say we want to jump to this funny operator.""" start="00:17:06.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It worked and you can also go back and forth""" start="00:17:13.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""within the declarations by pressing &quot;n&quot; and &quot;p&quot;.""" start="00:17:20.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Similarly, you can do something similar in the outline mode""" start="00:17:26.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""by toggling the follow mode, just like in org-agenda.""" start="00:17:30.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's turn it off.""" start="00:17:38.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Now, how about find definition references?""" start="00:17:40.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Using xref,""" start="00:17:46.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""we can jump to the definition of Int and jump back.""" start="00:17:49.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Jump to Maybe, jump back.""" start="00:17:53.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's have a look at references of replicateM.""" start="00:17:56.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""There are plenty of them.""" start="00:18:01.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Maybe we want to check out ghc-lib.""" start="00:18:03.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Here are all the references""" start="00:18:09.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and you can of course jump to any of them in the results.""" start="00:18:11.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Cool.""" start="00:18:16.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""You may have already noticed""" start="00:18:19.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""the eldoc displaying the documentation""" start="00:18:21.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and signature of identifiers.""" start="00:18:27.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""For example, here it shows the signature of replicateM,""" start="00:18:34.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""where it is defined, and its documentation.""" start="00:18:44.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We can bring up the eldoc buffer.""" start="00:18:47.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""In the eldoc buffer,""" start="00:18:56.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""there are also links to other identifiers,""" start="00:18:58.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which takes you to the definition of these identifiers,""" start="00:19:00.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like minBound.""" start="00:19:04.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Apparently, this is not working.""" start="00:19:07.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I'm pretty sure it maybe works.""" start="00:19:10.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's go to nothing or just...""" start="00:19:13.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I think those didn't work because""" start="00:19:17.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the module source for those identifiers is not open.""" start="00:19:19.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Of course, you can search""" start="00:19:24.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for any identifiers across all indexed packages""" start="00:19:30.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""by invoking hcel-global-ids.""" start="00:19:33.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's say we want to search for Read.""" start="00:19:38.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We are presented with a list of results,""" start="00:19:42.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which are identifiers starting with Read with capital R.""" start="00:19:47.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""They also show where they are defined""" start="00:19:54.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and the documentation, just like in eldoc.""" start="00:19:57.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""One can also directly jump to the identifier""" start="00:20:07.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""in the mini-buffer results.""" start="00:20:13.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""For example, we want to check out this Read2""" start="00:20:20.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""defined in base-4.12.0.0 Data.Functor.Classes""" start="00:20:22.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""There we go.""" start="00:20:28.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Another functionality of hcel""" start="00:20:34.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""is the help buffer integration.""" start="00:20:37.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We can do hcel-help and then let's say""" start="00:20:41.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""we want to learn about the read type class.""" start="00:20:46.565" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This is a help buffer""" start="00:20:52.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and you can jump to other definitions""" start="00:20:55.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""within the help buffer""" start="00:21:00.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to read the documentation like readsPrec.""" start="00:21:02.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It says Server version cannot be satistifed. Actual version.""" start="00:21:07.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This means we need to tell hecl""" start="00:21:11.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that the server has the correct version.""" start="00:21:14.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""hecl-fetch-server-version.""" start="00:21:17.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Wait a bit for it to update""" start="00:21:21.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the knowledge of the server version.""" start="00:21:25.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Now you can follow the links, Read, readsPrec.""" start="00:21:27.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""You can do the &quot;l&quot; and &quot;r&quot; to navigate within the history.""" start="00:21:33.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""ReadS, ReadP.""" start="00:21:38.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Just like in the help buffer for elisp code,""" start="00:21:43.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""you can jump to the definition.""" start="00:21:46.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I believe that is everything, more or less.""" start="00:21:53.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""That concludes the demo.""" start="00:22:00.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Now let's turn to haddorg,""" start="00:22:05.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""which is an Org backend for Haddock.""" start="00:22:07.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Haddock is the documentation generator for Haskell packages.""" start="00:22:09.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""For example,""" start="00:22:13.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the official Haskell package documentation website Hackage,""" start="00:22:15.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""all the documentation there is generated by Haddock""" start="00:22:22.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""into the HTML format.""" start="00:22:25.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Haddock has several backends""" start="00:22:28.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that convert the intermediate representation""" start="00:22:31.424" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""called interface to various output formats,""" start="00:22:34.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including HTML, LaTeX, and Hugo.""" start="00:22:37.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""HTML is the main format with a lot of features.""" start="00:22:41.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""LaTeX is less so, and I don't think it is widely used.""" start="00:22:44.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's have a look at an HTML example.""" start="00:22:49.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""This is a PDF because these HTML files can be rather large""" start="00:22:53.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and slow down EWW significantly.""" start="00:23:01.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It's faster to convert it to PDF""" start="00:23:07.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and read it from pdf-tools.""" start="00:23:10.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Looks like this is as big as it goes.""" start="00:23:17.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I hope you can still see it.""" start="00:23:20.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Can I still enlarge it a bit more? Maybe.""" start="00:23:26.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""This is Servant.Server.""" start="00:23:30.144" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It is a module in the servant-server package.""" start="00:23:33.064" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It is a widely used package for writing servers.""" start="00:23:36.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It starts with a heading, which is the name of the module,""" start="00:23:42.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and the table of contents.""" start="00:23:49.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Then a heading: Run an wai application from an API.""" start="00:23:52.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Under this heading, there are all the relevant identifiers""" start="00:23:56.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that is concerned with running a WAI application from API,""" start="00:24:00.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""including serve, which is one of the main entry points""" start="00:24:08.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""for a Servant.Server.""" start="00:24:13.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It has a signature linkable to the other identifiers,""" start="00:24:15.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the documentation,""" start="00:24:21.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""an example with a Haskell source code block.""" start="00:24:23.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""That's what HTML output looks like.""" start="00:24:26.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""As I mentioned,""" start="00:24:31.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""there are several downsides or drawbacks with that,""" start="00:24:34.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like the HTML files can be huge and slow down EWW.""" start="00:24:35.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Also, every module is an HTML of itself,""" start="00:24:41.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and there's also an HTML for the package""" start="00:24:46.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""with a list of all the modules.""" start="00:24:48.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Whereas the Org backend""" start="00:24:50.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""is better in that it is much more compact.""" start="00:24:54.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""All the modules under the same package""" start="00:25:04.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""are included in one Org file""" start="00:25:07.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""as sub-headings, level 2 headings.""" start="00:25:10.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So, servant-server, Servant.Server, that is the module.""" start="00:25:13.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So basically, this level 2 heading""" start="00:25:19.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""contains all the information in this PDF.""" start="00:25:21.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Run the WAI application from API, serve.""" start="00:25:25.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It has a signature that links to other identifiers""" start="00:25:29.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and the documentation that's also linkable.""" start="00:25:39.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""The Haskell source block is now an Org source block,""" start="00:25:42.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and you can do all sorts of interesting things""" start="00:25:47.224" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""with it using org-babel.""" start="00:25:49.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Let's check the links as server.""" start="00:25:52.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Right, so the link works.""" start="00:25:56.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Application, right, Request.""" start="00:26:00.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""It also supports cross-packaging package linking,""" start="00:26:05.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""so following the link to request""" start="00:26:08.384" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""takes us from servant-server package Org documentation""" start="00:26:12.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""to the WAI Org documentation.""" start="00:26:17.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""Another nice thing with Org documentation""" start="00:26:24.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""is that you can use Org functions""" start="00:26:27.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like org-goto to jump to any identifiers.""" start="00:26:32.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's say we want to jump to application.""" start="00:26:40.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We have toApplication. So it jumpts to toApplication.""" start="00:26:45.904" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I guess application is not an identifier,""" start="00:26:50.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""yes, it is more like a type alias,""" start="00:26:54.024" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that's why we couldn't find it.""" start="00:26:55.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So that is haddorg.""" start="00:26:58.664" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And of course, I implemented a bit of integration""" start="00:27:01.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""between haddorg and hcel""" start="00:27:06.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""so that we can jump from one to the other.""" start="00:27:08.544" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's go back to servant.""" start="00:27:11.304" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's see, ServerT.""" start="00:27:15.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Maybe we want to check out""" start="00:27:24.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the source code definition of ServerT.""" start="00:27:27.104" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""To find out exactly what sort of type alias it is,""" start="00:27:31.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""like what is the alias (or type synonym)""" start="00:27:36.264" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We run hcel-identifier-at-point--""" start="00:27:43.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""sorry, hcel-haddorg-to-hcel-definition...""" start="00:27:49.504" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Oh, we have an HTTP error.""" start="00:27:52.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Typ ServerT not found in module src/Servant/Server.hs""" start="00:27:55.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Why? Well, this is because""" start="00:27:59.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""the HCEL server only understands,""" start="00:28:01.125" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""it only has knowledge of identifiers""" start="00:28:04.944" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that is defined in the original source file.""" start="00:28:07.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So, it is not aware of, say,""" start="00:28:12.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""identifiers that are re-exported in the module.""" start="00:28:17.184" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Most likely, Servant.Server module re-exports ServerT""" start="00:28:21.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""from another module.""" start="00:28:25.824" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We will probably have better luck""" start="00:28:28.704" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""looking into some internal modules like this one.""" start="00:28:29.744" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's try this type class HasContextEntry.""" start="00:28:35.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""So this time it worked.""" start="00:28:39.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template new="1" text="""And, of course, we can go the other direction""" start="00:28:42.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""from hecl to haddorg.""" start="00:28:44.344" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Let's say if we want to display named context""" start="00:28:48.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""in the haddorg documentation""" start="00:28:51.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""so that we can read about, other identifiers documentation""" start="00:28:54.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""that is related to named context.""" start="00:29:01.624" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""We do hecl-identifier-at-point-to-haddorg""" start="00:29:04.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And it does take us to the server-server old file.""" start="00:29:08.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Okay.""" start="00:29:14.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""And that concludes my presentation.""" start="00:29:18.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""You can find hecl in GNU Elpa,""" start="00:29:21.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and you can also find the source code,""" start="00:29:23.584" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""as well as the source of haddorg""" start="00:29:25.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""and instructions on how to generate org documentation""" start="00:29:27.464" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""using haddorg in my cgit instance.""" start="00:29:29.864" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Thank you for your attention.""" start="00:29:33.000" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""I hope you enjoy the rest of the conference.""" start="00:29:36.784" video="mainVideo-haskell" id="subtitle"]]
+[[!template text="""Thank you.""" start="00:29:38.000" video="mainVideo-haskell" id="subtitle"]]
+
+
+
+Captioner: anush
+
+Questions or comments? Please e-mail [id@ypei.org](mailto:id@ypei.org?subject=Comment%20for%20EmacsConf%202022%20haskell%3A%20Haskell%20code%20exploration%20with%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/haskell-before.md b/2022/info/haskell-before.md
new file mode 100644
index 00000000..ab963d87
--- /dev/null
+++ b/2022/info/haskell-before.md
@@ -0,0 +1,63 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Yuchen Pei demonstrates an Emacs package for exploring Haskell code and org documentation generated by a Haddock org backend. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="haskell">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect stroke-width="3" x="666" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 30-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-haskell>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T21:05:00Z" end="2022-12-03T21:35:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~4:05 PM - 4:35 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~3:05 PM - 3:35 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~2:05 PM - 2:35 PM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~1:05 PM - 1:35 PM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~9:05 PM - 9:35 PM UTC <br />Saturday, Dec 3 2022, ~10:05 PM - 10:35 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~11:05 PM - 11:35 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~2:35 AM - 3:05 AM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~5:05 AM - 5:35 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~6:05 AM - 6:35 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="haskell-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="haskell-mainVideo" data="""
+00:00.000 What is Haskell?
+00:30.520 Parts of a Haskell program
+01:33.640 Example of Haskell source code
+02:13.400 Writing Haskell like Lisp
+02:37.160 What is a code explorer?
+03:53.760 Prior art
+04:56.240 Haskell mode
+05:46.080 Jumping to declarations
+06:43.560 Finding references
+07:24.840 The Haskell language server
+08:20.520 Hoogle and Hackage
+08:54.960 Haskell Code Explorer
+09:34.600 Demo of Haskell Code Explorer
+10:42.080 Learning about monads
+12:35.480 Web client
+13:39.920 User freedom
+14:47.800 hc.el
+15:38.560 Demo
+16:46.520 Declarations
+17:38.920 Finding definitions and references
+18:19.160 Eldoc
+19:22.360 Searching for identifiers
+20:32.560 Help buffer integration
+22:01.440 Haddock
+23:28.840 Servant
+24:30.480 Org
+25:50.320 Links
+26:19.280 Navigation
+28:41.160 Going the other direction
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.webm">Download --main.webm (47MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/6u6Pd9P8zcbwfFVXNHYzUz">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="haskell-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="haskell-qanda" data="""
+01:42.120 Does it work with offline documentation?
+03:50.720 What is the state of integration of Haskell with Emacs in 2022?
+09:01.680 Have you tried any projects in literate Haskell?
+12:51.360 Is the indexing faster when re-indexing? Would it be too slow to re-index on-demand?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="haskell-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.webm">Download --answers.webm (6.6MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--answers.opus">Download --answers.opus (5.5MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/haskell-nav.md b/2022/info/haskell-nav.md
new file mode 100644
index 00000000..5d1f7344
--- /dev/null
+++ b/2022/info/haskell-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/jupyter">Edit live Jupyter notebook cells with Emacs</a>
+Next by track: <a href="/2022/talks/sat-close">Saturday closing remarks</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/health-after.md b/2022/info/health-after.md
new file mode 100644
index 00000000..ec02951c
--- /dev/null
+++ b/2022/info/health-after.md
@@ -0,0 +1,423 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="health-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hi, this is Dave O'Toole, and today""" start="00:00:00.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'll be giving a presentation on tracking health data""" start="00:00:04.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with Emacs, Org Mode, and Gnuplot.""" start="00:00:07.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So Gnuplot is the well-known scientific""" start="00:00:12.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and mathematical plotting application.""" start="00:00:16.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You feed it text files full of names, dates, numbers,""" start="00:00:19.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""data points, and you get out a nice graph.""" start="00:00:24.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You can spit out SVG. You can spit out PNG graphics.""" start="00:00:27.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""In this case, we're using an SVG.""" start="00:00:31.120" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""What I'm going to show you today""" start="00:00:33.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is how to take daily health journal items:""" start="00:00:36.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""in other words, things like I exercised""" start="00:00:39.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""such and such number of minutes today,""" start="00:00:42.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I got X hours of sleep last night,""" start="00:00:44.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I used such and such number of pieces of nicotine gum,""" start="00:00:47.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""say five pieces. So let's see,""" start="00:00:51.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""we've got this whole picture here, all right,""" start="00:00:54.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and I've tracked here...""" start="00:00:58.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is a month of data from my life.""" start="00:00:59.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is... I'm not showing all the variables,""" start="00:01:02.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but this is what I felt comfortable sharing""" start="00:01:05.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""in order to help people who might have a need to track,""" start="00:01:08.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""either because of a chronic condition,""" start="00:01:14.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""or just because of a health improvement goal""" start="00:01:15.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""or what have you, people who might need to""" start="00:01:18.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""track health data in a way""" start="00:01:20.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that's a little bit more robust""" start="00:01:23.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""than just one or two variables""" start="00:01:24.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and just weight or just blood pressure.""" start="00:01:26.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So in this case, I've got exercise,""" start="00:01:29.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I've got the number of hours of sleep,""" start="00:01:33.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the number of doses of nicotine,""" start="00:01:36.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""(that's the yellow line here),""" start="00:01:38.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and this is referring to nicotine gum.""" start="00:01:40.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""What we're going to be talking about""" start="00:01:44.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is looking at connections, the idea""" start="00:01:45.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that plotting your data can actually""" start="00:01:47.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""help you figure out what's going on.""" start="00:01:49.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is just one month.""" start="00:01:52.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I've been doing this for a couple of months now,""" start="00:01:53.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but I felt comfortable showing one month""" start="00:01:55.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with a limited subset of the variables.""" start="00:01:57.560" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""What I'm going to be doing in this presentation""" start="00:01:59.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is showing you how to set up your org templates""" start="00:02:02.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so that you can, you know, hit a hotkey""" start="00:02:05.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""to capture today's data with an org template--""" start="00:02:08.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""or in this case yesterday's. Usually I'm saying, okay,""" start="00:02:11.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""yesterday this happened,""" start="00:02:14.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because you don't know until the day's over""" start="00:02:15.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""how many pieces of nicotine gum you ate""" start="00:02:17.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""or how many hours you slept.""" start="00:02:19.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So usually we're recording data for the previous day.""" start="00:02:21.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""We can set up a capture template""" start="00:02:25.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so that it fills a little org entry. One for exercise,""" start="00:02:28.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""one for sleep, one for nicotine, one for distress.""" start="00:02:30.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Here distress is just 1 to 10:""" start="00:02:34.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""how bad do you feel today?""" start="00:02:36.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""It's not a scientific measure, but you know,""" start="00:02:38.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""many, many things ask you to rate""" start="00:02:41.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""on a scale of 1 to 10, how bad is the anxiety,""" start="00:02:43.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""how bad is the general level of stress,""" start="00:02:47.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and so without a lot of complication,""" start="00:02:49.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I just rate that one to ten.""" start="00:02:51.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Pain, okay, we won't have to get into any details,""" start="00:02:53.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but if there is a level of chronic pain, well,""" start="00:02:58.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I put that between 1 and 10. As we can see here,""" start="00:03:00.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""during the period that I've shown you, it's pretty low.""" start="00:03:04.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""There's some. If you miss a dose of medication,""" start="00:03:07.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""you can track that, in this case""" start="00:03:11.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with a big ugly red triangle, you know.""" start="00:03:13.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You can see, I can see here that in mid-, in late September,""" start="00:03:17.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""sorry, in early to mid-October,""" start="00:03:24.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I stopped using the nicotine gum""" start="00:03:29.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and probably should have cut down more gradually""" start="00:03:31.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because my sleep suffered. Look at this.""" start="00:03:32.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The sleep line is down here, okay?""" start="00:03:34.760" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""What I'm going to do now,""" start="00:03:38.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""now that I've shown you the graph""" start="00:03:39.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and some of the things that are useful about it,""" start="00:03:40.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm going to actually take a step back""" start="00:03:44.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and show you from start to finish how you can do this""" start="00:03:46.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""in GNU Emacs, and I have a little template generator""" start="00:03:50.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that you can use if you'd like.""" start="00:03:53.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""All right, so let's go back.""" start="00:03:56.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Let's step back from this file.""" start="00:03:59.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""We're going to split the screen, and on the left side,""" start="00:04:01.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm going to put the underlying Org file""" start="00:04:07.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that generates this graph.""" start="00:04:09.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Let me shrink that a little bit.""" start="00:04:10.920" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""All right, I'm going to work my way backwards""" start="00:04:16.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""from the template to the template generator,""" start="00:04:22.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""meaning that you'll be able to spit out,""" start="00:04:26.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""given your own specification of health variables,""" start="00:04:28.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""you'll be able to have it spit out""" start="00:04:31.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""a custom Gnuplot script like this""" start="00:04:33.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that's preset up with the definitions""" start="00:04:38.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""for the column view in Org mode.""" start="00:04:41.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm assuming a little bit of familiarity""" start="00:04:43.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with Org mode and Gnuplotting,""" start="00:04:45.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but I'll try to explain as much as I can as I go along.""" start="00:04:47.200" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""The journal here is where... okay, okay, one moment.""" start="00:04:51.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So as you can see, there's a sub-entry here""" start="00:04:59.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""for each day that I've included from my data set""" start="00:05:03.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""starting on September 13th of this year""" start="00:05:06.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and ending on October 17th.""" start="00:05:08.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""And there's an Org property drawer with""" start="00:05:10.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the corresponding names of each field and the value.""" start="00:05:16.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Now the idea here is that the columns specify...""" start="00:05:29.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""if you know a little bit about Org mode,""" start="00:05:36.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""what happens is that you...""" start="00:05:40.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""let's say that I hit the key for my journal template,""" start="00:05:43.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""which... Mine is very similar.""" start="00:05:50.920" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""This is the capture buffer for today's date,""" start="00:05:52.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and if you're recording yesterday's date,""" start="00:06:00.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""you can just flip it like that if you need to.""" start="00:06:02.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Then I say, yesterday, I remember""" start="00:06:04.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I went for about a one-mile walk,""" start="00:06:08.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so that's probably about 20 minutes,""" start="00:06:11.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and that I had such and such,""" start="00:06:14.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I had eight and a half hours of sleep, let's say.""" start="00:06:16.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I estimate how many pieces of nicotine gum I have.""" start="00:06:19.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I try to count as closely as I can, how much distress,""" start="00:06:22.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""you know what I mean,""" start="00:06:25.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""whether or not I missed a dose of medication.""" start="00:06:26.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Then when you hit C-c C-c,""" start="00:06:28.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""it captures that to the end of your Org file.""" start="00:06:32.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Now what this shows is that... I cut and paste it in.""" start="00:06:39.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I've been keeping these entries every day for months,""" start="00:06:46.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and that I cut and pasted in a month of data.""" start="00:06:48.160" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""Now I'm going to dig in a little bit to the Gnuplot script.""" start="00:06:51.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This here, all this stuff, is one component of the graph,""" start="00:07:00.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and I'll go over how it works.""" start="00:07:07.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""First, the items through this column declaration here,""" start="00:07:11.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and the id:myid, this columnview table here,""" start="00:07:19.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""\#+BEGIN: columnview, this whole bit here,""" start="00:07:30.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is going to get filled in with the corresponding columns,""" start="00:07:34.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""exercise minutes, sleep hours, nicotine doses.""" start="00:07:39.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""And then it gets pumped out by Org mode into a file""" start="00:07:43.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that looks like this: tab-separated values""" start="00:07:53.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with an ISO-style date at the beginning.""" start="00:07:59.841" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""So what we're going to do is we're going to go through""" start="00:08:03.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the Gnuplot portion of this,""" start="00:08:10.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and I'm going to enlarge the font a little.""" start="00:08:14.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm going to go line by line through the Gnuplot portion.""" start="00:08:21.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Now, my template generator will give you one like this.""" start="00:08:23.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You don't have to write this from scratch.""" start="00:08:30.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""But I'm going to go through it line by line""" start="00:08:33.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because if you do use the template,""" start="00:08:35.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""then it'll help to have gone through it line by line,""" start="00:08:37.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because you're probably going to have to modify it.""" start="00:08:42.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So first, we're going to clear the graphics""" start="00:08:46.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""from any previous runs""" start="00:08:49.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so that if we reuse the same Gnuplot process,""" start="00:08:50.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""we're not overwriting the old--""" start="00:08:53.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that we are completely overwriting the old image.""" start="00:08:57.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So that's the purpose of this line here.""" start="00:09:00.720" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""The output parameters: we want to put out an SVG file.""" start="00:09:03.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Font Arial, that's funny,""" start="00:09:08.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but I don't know what font it's actually ending up choosing,""" start="00:09:13.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but it looks fine.""" start="00:09:16.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Then we want it to be square,""" start="00:09:16.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so I'm giving it 900 by 900 pixels,""" start="00:09:19.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""even though it is a scalable vector graphic.""" start="00:09:21.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""We're putting it in the same folder as the org file,""" start="00:09:23.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""example.svg.""" start="00:09:29.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""These lines here set it up to use the Org mode format""" start="00:09:30.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that we showed in the other file over here.""" start="00:09:39.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The time format is four-digit year, two-digit month,""" start="00:09:42.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""two-digit day.""" start="00:09:48.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The time format doesn't specify here the time,""" start="00:09:50.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but that doesn't seem to mess it up.""" start="00:09:56.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This line &quot;set datafile separator&quot; means that""" start="00:09:59.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the separators between that""" start="00:10:02.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and between all the other fields are tabs,""" start="00:10:04.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""which is what Org mode does""" start="00:10:06.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""when it spits out a table by default.""" start="00:10:08.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Okay, along to the next lines.""" start="00:10:11.000" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""We're going to set up for time series data,""" start="00:10:15.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""meaning that the x-axis is going to be time,""" start="00:10:18.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""x2tics 1 format.""" start="00:10:22.808" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I believe this means that every day has one tick""" start="00:10:26.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and that this tells it that the first--""" start="00:10:30.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""unfortunately, I forget the exact meaning of this one line.""" start="00:10:32.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm just going to move on. We want one X tick per day,""" start="00:10:39.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and because X is in seconds,""" start="00:10:44.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""it's 24 hours times 60 minutes times 60 seconds.""" start="00:10:46.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This line &quot;set grid xtics&quot; gives us""" start="00:10:50.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""a vertical line on each day of the graph.""" start="00:10:55.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'll pull up the graph""" start="00:10:57.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""just so that it's a little easier to see.""" start="00:10:58.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""All these vertical lines, one on each day,""" start="00:11:00.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that's given to you by &quot;set grid xtics&quot;.""" start="00:11:03.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""One Y tick every five points.""" start="00:11:06.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So here at five pieces of nicotine,""" start="00:11:10.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""we've got a five, at ten pieces – well,""" start="00:11:13.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""we don't want to eat ten pieces, but ten, fifteen, twenty.""" start="00:11:15.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Rotating the labels to make them fit a little bit better,""" start="00:11:19.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that's this part here where the labels are sideways,""" start="00:11:25.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and even with just one month of data,""" start="00:11:28.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""they're getting a little crowded.""" start="00:11:30.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This &quot;set key box lc&quot; just makes the line around the key,""" start="00:11:35.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the legend here, a little bit less severe.""" start="00:11:41.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""set xtics format: this makes it so that, for example,""" start="00:11:44.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I've done a United-States-style date here""" start="00:11:51.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with the month and then the day.""" start="00:11:53.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You don't necessarily have to do that.""" start="00:11:55.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You can have whatever you want.""" start="00:11:58.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This xtics format,""" start="00:12:01.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that relates to how the dates are printed.""" start="00:12:03.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Remember that over here, this set timefmt,""" start="00:12:06.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that relates to how the dates are formatted""" start="00:12:12.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""in the Org mode output.""" start="00:12:15.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So remember, those are two...""" start="00:12:17.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You don't want to mix those up.""" start="00:12:18.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""All right, &quot;yrange [0:40]&quot;.""" start="00:12:19.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Thus far, my exercise sessions have all been""" start="00:12:23.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""less than 30 minutes, and nothing's gone over 30.""" start="00:12:28.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""If you have a health variable""" start="00:12:31.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that is in a significantly different range,""" start="00:12:35.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""you may need to get a slightly more complicated""" start="00:12:38.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Gnuplot script because it is possible to plot""" start="00:12:41.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""multiple yranges in one plot""" start="00:12:43.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""if you have a variable that uses a different range.""" start="00:12:46.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""It's just a little trickier.""" start="00:12:48.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""These parts here, aside from the fact""" start="00:12:49.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that you might make some changes that relate to""" start="00:12:55.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the date and your country format,""" start="00:12:59.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""are going to be the same.""" start="00:13:01.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is like boilerplate for almost anything.""" start="00:13:03.240" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""Now here are the parts that are going to vary""" start="00:13:05.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""depending on what health variables you want to store.""" start="00:13:09.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""There are three main sections here.""" start="00:13:13.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""One is setting the different line types that are used.""" start="00:13:18.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Setting linetype 1 with line width 2, line color RGB.""" start="00:13:28.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Unfortunately, Gnuplot is a little bit cryptic,""" start="00:13:32.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""which is why I've made this template generator""" start="00:13:34.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that I'll show you in a moment.""" start="00:13:36.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I pick a color. So this is exercise, forest green.""" start="00:13:38.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Point size 1, meaning you get""" start="00:13:43.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""these little green triangles about that size.""" start="00:13:49.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""But the point type 9 is the pointing up triangle.""" start="00:13:51.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Line type 2, purple. So that's the sleep line.""" start="00:13:54.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So we're just establishing these different line types""" start="00:13:59.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that we've given arbitrary numbers.""" start="00:14:03.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Now onto the next section.""" start="00:14:04.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Oh, before I move on here,""" start="00:14:08.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""you can see point type 11 for line 5, which is red.""" start="00:14:12.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""And that's the missed medications line,""" start="00:14:16.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so you get a triangle that's upside down""" start="00:14:18.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because that's point shape 11.""" start="00:14:20.640" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""All right. The next section here is the goal lines.""" start="00:14:22.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""There are horizontal dashed lines here""" start="00:14:27.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""at 8 purple hours of sleep, because 8 hours is the goal.""" start="00:14:33.441" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So there's a horizontal line at Y = 8.""" start="00:14:37.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""For pieces of nicotine gum,""" start="00:14:41.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm trying to keep it to around 5 right now.""" start="00:14:43.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So my goal line is at 5. So these...""" start="00:14:46.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Here, a goal of at least 20 minutes of exercise.""" start="00:14:52.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Sometimes I get more, sometimes I get less.""" start="00:14:56.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""There's a green line and a 20, showing that that's the goal.""" start="00:14:59.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""These lines here are actually the goal lines.""" start="00:15:02.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""You can specify the goal for each one""" start="00:15:06.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""in the template generator that I'll show you.""" start="00:15:09.120" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""The last part is the actual plot command.""" start="00:15:12.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So the dependent... So okay,""" start="00:15:28.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""these all start with 1, &quot;using 1&quot; against this variable.""" start="00:15:30.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So $2... This is a ternary operator here""" start="00:15:34.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that says if the value of the second column is zero,""" start="00:15:41.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""then don't plot a point. In other words,""" start="00:15:49.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""not a number means it won't plot a point.""" start="00:15:52.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The template generator lets you skip over""" start="00:15:56.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the details of that. It sticks this in there.""" start="00:15:58.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'll show you.""" start="00:16:02.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So we only want to plot a point when the value is non-zero.""" start="00:16:02.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""If there was no exercise, we're not plotting a point.""" start="00:16:09.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The with construct means we'll plot data""" start="00:16:12.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""using date against exercise with points,""" start="00:16:15.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the title is &quot;exercise (minutes)&quot;, line type 1.""" start="00:16:21.341" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Remember, we established line type 1 up here""" start="00:16:25.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""as being forest green, point style 1,""" start="00:16:29.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""point type 9, green triangles.""" start="00:16:35.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Now I'm going to show 1 against column 3,""" start="00:16:37.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""which is &quot;hours of sleep&quot;.""" start="00:16:42.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This one is plotted with lines,""" start="00:16:43.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""so we don't specify a point type or point size,""" start="00:16:46.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""just a line type 2. And remember, you can see""" start="00:16:48.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that line type 2 is defined as purple""" start="00:16:51.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""with point type 1, point size 1.""" start="00:16:55.241" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Okay, so I did specify point size and point type,""" start="00:16:57.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but because I'm not plotting with points,""" start="00:16:59.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""those are ignored.""" start="00:17:01.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Here we come to the line with nicotine.""" start="00:17:02.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The fourth column is the nicotine number,""" start="00:17:08.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the fourth column from the Org mode file.""" start="00:17:11.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So here you can see how we're telling Gnuplot""" start="00:17:13.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""to take each column of the tab-separated Org mode file""" start="00:17:16.008" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and put it into the graph.""" start="00:17:19.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The line types are set up here.""" start="00:17:21.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The goal lines are set up here.""" start="00:17:25.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""And then the actual plot command is set up here.""" start="00:17:30.800" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""So now we're going to work further backwards""" start="00:17:35.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""from this Gnuplot template""" start="00:17:41.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""to the template generator that I used to make it.""" start="00:17:42.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Now I'm not going to go into""" start="00:17:46.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""all of the details of the code,""" start="00:18:01.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but what I am going to show you is that""" start="00:18:03.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""there's a variable called `health-factors`.""" start="00:18:06.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""And what this does, this `health-factors-from-list`""" start="00:18:10.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""lets you specify, with a property list""" start="00:18:15.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""of keyword and value pairs""" start="00:18:20.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""(here's the keyword name and the value is exercise),""" start="00:18:22.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the goal that I want 20 minutes of exercise,""" start="00:18:24.800" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that the unit is minutes,""" start="00:18:28.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that the color is forest green, and so on.""" start="00:18:30.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The aspects of the Gnuplot setup""" start="00:18:36.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""have been abstracted here.""" start="00:18:39.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Eight hours of sleep is the goal here.""" start="00:18:43.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""The hours are units. What color,""" start="00:18:49.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""what thickness of the line.""" start="00:18:54.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Here we specify the number of points.""" start="00:18:55.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""There's references online""" start="00:19:00.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that show you what point types are what shapes in Gnuplot,""" start="00:19:01.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and so on and so forth.""" start="00:19:05.200" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""I'll walk through the code a little bit that does this,""" start="00:19:11.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that actually takes these pieces,""" start="00:19:17.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that takes this specification of what your variables are""" start="00:19:20.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and turns it into a template.""" start="00:19:24.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""First, I'm using EIEIO,""" start="00:19:30.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the object system that's included with GNU Emacs.""" start="00:19:37.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""It's a reasonable facsimile""" start="00:19:41.720" video="mainVideo-health" id="subtitle"]]
+[[!template text="""of the Common Lisp Object System.""" start="00:19:45.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""What I'm going to be doing here""" start="00:19:47.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is defining a class with each of those items,""" start="00:19:51.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""those properties that we talked about in that list""" start="00:19:56.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that lets you specify name, what the goal is,""" start="00:19:58.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""what the units are, and the Gnuplot things""" start="00:20:01.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""(the Gnuplot parameters like thickness,""" start="00:20:04.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""plot type, and all that) into a class that will then""" start="00:20:06.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""spit out the template once you feed it""" start="00:20:13.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""some of these health factor objects. So just a moment.""" start="00:20:16.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""For example, you can see that this template""" start="00:20:27.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""originally came from being generated by this code here.""" start="00:20:34.480" video="mainVideo-health" id="subtitle"]]
+[[!template text="""To use the template,""" start="00:20:46.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""to use this little template generator...""" start="00:20:52.960" video="mainVideo-health" id="subtitle"]]
+[[!template text="""See, here's where it spits out the line type""" start="00:20:55.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""given the pieces.""" start="00:21:06.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is all just text formatting.""" start="00:21:07.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is one of the things that Emacs Lisp""" start="00:21:09.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""just really excels at.""" start="00:21:11.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I need to take a piece of data""" start="00:21:13.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""like a list of health information,""" start="00:21:19.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""a list of health variables, what their units are,""" start="00:21:22.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and how they're supposed to be formatted in Gnuplot,""" start="00:21:25.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and go from that to the nice template.""" start="00:21:28.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""So that's pretty much the whole thing.""" start="00:21:30.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I want to see if there's anything I missed.""" start="00:21:31.720" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""Bring up the chart.""" start="00:21:41.000" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This has been really useful""" start="00:21:51.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""for communicating with healthcare professionals""" start="00:21:54.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because you are both on the same page""" start="00:21:59.600" video="mainVideo-health" id="subtitle"]]
+[[!template text="""about exactly what is happening,""" start="00:22:04.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""what's been happening because if... Let's say""" start="00:22:05.880" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that you're tired when you talk to your care provider.""" start="00:22:10.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Well, if you have objective information""" start="00:22:15.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that you've been recording every day,""" start="00:22:17.560" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that you're ahead of the game, really,""" start="00:22:18.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""because you don't need, necessarily, the presence of mind""" start="00:22:22.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""to be able to give your care provider""" start="00:22:25.120" video="mainVideo-health" id="subtitle"]]
+[[!template text="""a complete picture of what's going on in your world.""" start="00:22:27.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""If you can find those few minutes a day to enter--""" start="00:22:30.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""not even a few minutes,""" start="00:22:33.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""really just a minute to enter the data""" start="00:22:34.400" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and say what happened yesterday...""" start="00:22:37.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I'm finding over these months""" start="00:22:39.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""that I've been more in touch with my health when I can--""" start="00:22:42.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""not forced, but when I have the habit,""" start="00:22:45.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the consistent habit every single day""" start="00:22:49.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""of recording that data--I'm accountable to myself.""" start="00:22:52.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""It's interesting.""" start="00:22:55.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I guess it gets into a little bit of ideas""" start="00:22:57.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""about the Quantified Self""" start="00:23:01.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and how holding yourself accountable""" start="00:23:02.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""can change what you do and what the outcomes are.""" start="00:23:05.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Just look at this here.""" start="00:23:09.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Without getting into too much detail,""" start="00:23:14.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""one of the reasons I track my sleep is because,""" start="00:23:17.280" video="mainVideo-health" id="subtitle"]]
+[[!template text="""as you can see, my sleep""" start="00:23:19.680" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is not as well-regulated as most people,""" start="00:23:22.040" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and that's why I need to do that.""" start="00:23:26.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This was a time... 10, 12,""" start="00:23:31.440" video="mainVideo-health" id="subtitle"]]
+[[!template text="""here's 14 hours of sleep, that's depression.""" start="00:23:34.441" video="mainVideo-health" id="subtitle"]]
+[[!template text="""It oscillates a little bit. But then below the goal line,""" start="00:23:36.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""the things are a little more normal here.""" start="00:23:43.520" video="mainVideo-health" id="subtitle"]]
+[[!template text="""This is a little more normal.""" start="00:23:45.640" video="mainVideo-health" id="subtitle"]]
+[[!template text="""But then, really, without thinking about it too much,""" start="00:23:46.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I cut out the nicotine, and my sleep suffered.""" start="00:23:52.080" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Just the fact that I'm able to look and see that connection""" start="00:23:56.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""is really amazing to me.""" start="00:24:00.200" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Maybe I would have anyway,""" start="00:24:01.360" video="mainVideo-health" id="subtitle"]]
+[[!template text="""but looking at the whole months of data,""" start="00:24:02.760" video="mainVideo-health" id="subtitle"]]
+[[!template text="""there have been many things to discuss""" start="00:24:05.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and many things to think about.""" start="00:24:07.400" video="mainVideo-health" id="subtitle"]]
+[[!template new="1" text="""Because this is a short presentation,""" start="00:24:09.920" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I probably should wrap up.""" start="00:24:12.160" video="mainVideo-health" id="subtitle"]]
+[[!template text="""I just want to thank the whole Emacs community""" start="00:24:13.840" video="mainVideo-health" id="subtitle"]]
+[[!template text="""for being there and for including me in the conference""" start="00:24:18.240" video="mainVideo-health" id="subtitle"]]
+[[!template text="""and I hope to participate next year as well.""" start="00:24:23.320" video="mainVideo-health" id="subtitle"]]
+[[!template text="""Thank you so much.""" start="00:24:27.080" video="mainVideo-health" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20health%3A%20Health%20data%20journaling%20and%20visualization%20with%20Org%20Mode%20and%20gnuplot)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/health-before.md b/2022/info/health-before.md
new file mode 100644
index 00000000..68441993
--- /dev/null
+++ b/2022/info/health-before.md
@@ -0,0 +1,56 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, David O'Toole shares how he tracked and graphed his personal data using Org mode and Gnuplot, and how you can use a template generator to do the same. Afterwards, he will handle questions over BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="health">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect stroke-width="3" x="564" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 25-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-health>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T20:00:00Z" end="2022-12-03T20:25:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~3:00 PM - 3:25 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~2:00 PM - 2:25 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~1:00 PM - 1:25 PM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~12:00 PM - 12:25 PM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~8:00 PM - 8:25 PM UTC <br />Saturday, Dec 3 2022, ~9:00 PM - 9:25 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~10:00 PM - 10:25 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~1:30 AM - 1:55 AM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~4:00 AM - 4:25 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~5:00 AM - 5:25 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="health-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="health-mainVideo" data="""
+00:00.000 Introduction
+00:33.640 How to take daily health journal items
+01:59.440 How to set up your org templates
+03:38.320 How to do it in GNU Emacs
+04:16.840 Overview of the presentation
+04:51.960 The journal
+05:52.800 The capture buffer
+06:51.320 The columnview table
+08:03.480 Gnuplot
+09:03.320 Output parameters
+10:15.480 Time series data
+13:05.920 Health variables
+14:22.680 Goal lines
+15:12.000 The Gnuplot command
+17:35.560 The template generator
+19:11.480 The code that creates a template
+21:41.000 The power of the chart
+24:09.920 Thanks
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.webm">Download --main.webm (95MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.opus">Download --main.opus (17MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/j4M57ijUYE4DMVwT9X3CYB">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="health-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="health-qanda" data="""
+00:50.800 Do you use this just for yourself? Or do you use this to discuss/show with doctors/health professionals?
+02:38.157 How do you input the health data?
+03:53.121 How do you track the various health statistics that you are gathering?
+04:50.422 It's possible to download data from the Apple watch's health app. Is it easy enough to incorporate those .csv files into your implementation of Gnuplot?
+06:48.800 Regarding the medication tracking you only have option to record missed or not. If one needs to take multiple medication throughout the day, how would you propose to track that? Within gnuplot or separate?
+08:27.720 How's the workflow when working on the gnuplot code?
+09:07.680 How much time does it take to process the amount of data that you add inside GNU Emacs?
+09:38.190 Will indent-guide behave well with yaml files for helm?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="health-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.webm">Download --answers.webm (95MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.opus">Download --answers.opus (6.8MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/health-nav.md b/2022/info/health-nav.md
new file mode 100644
index 00000000..15fa5106
--- /dev/null
+++ b/2022/info/health-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/maint">Maintaining the Maintainers: Attribution as an Economic Model for Open Source</a>
+Next by track: <a href="/2022/talks/eev">Bidirectional links with eev</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/hyperorg-after.md b/2022/info/hyperorg-after.md
new file mode 100644
index 00000000..2de66414
--- /dev/null
+++ b/2022/info/hyperorg-after.md
@@ -0,0 +1,7 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20hyperorg%3A%20Powerful%20productivity%20with%20Hyperbole%20and%20Org%20Mode)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/hyperorg-before.md b/2022/info/hyperorg-before.md
new file mode 100644
index 00000000..2b52af8c
--- /dev/null
+++ b/2022/info/hyperorg-before.md
@@ -0,0 +1,12 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Bob Weiner discusses utilizing GNU Hyperbole action-oriented buttons in Org mode documents for interactive demos and task automation.
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="hyperorg-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--main.webm" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--main.webm">Download --main.webm (110MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--main.opus">Download --main.opus (19MB)</a></li><li><a href="https://toobnix.org/w/uz8zLQWbjGC49LSx3Y1Vx7">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="hyperorg-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.webm" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div>Listen to just the audio:<br /><audio controls preload="none" id="hyperorg-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.webm">Download --answers.webm (42MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.opus">Download --answers.opus (15MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/hyperorg-nav.md b/2022/info/hyperorg-nav.md
new file mode 100644
index 00000000..d22df26b
--- /dev/null
+++ b/2022/info/hyperorg-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/rms">What I'd like to see in Emacs</a>
+Next by track: <a href="/2022/talks/detached">Getting detached from Emacs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/indieweb-after.md b/2022/info/indieweb-after.md
new file mode 100644
index 00000000..ffe7d3c2
--- /dev/null
+++ b/2022/info/indieweb-after.md
@@ -0,0 +1,364 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="indieweb-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hey everyone, I'm Michael,""" start="00:00:00.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and I'm going to be talking about""" start="00:00:02.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Org mode and the IndieWeb.""" start="00:00:03.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I am located in the San Francisco Bay Area,""" start="00:00:06.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where I'm a developer as well as""" start="00:00:08.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a longtime Emacs user.""" start="00:00:10.321" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""So, I maintain a personal website using Org mode.""" start="00:00:14.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""If you're watching this talk,""" start="00:00:17.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'm going to guess that you probably are too.""" start="00:00:19.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""For anybody who isn't,""" start="00:00:21.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""let me explain exactly what I mean by that.""" start="00:00:24.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have a static website. I author the pages""" start="00:00:28.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""in Org mode's markup language,""" start="00:00:32.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""otherwise known as Orgdown.""" start="00:00:34.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I use the Org export facility""" start="00:00:36.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to transcode that markup to HTML.""" start="00:00:38.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And then I just use rsync to push""" start="00:00:43.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the resulting HTML pages up to a VPS.""" start="00:00:47.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I like the workflow.""" start="00:00:51.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's familiar to me as a coder.""" start="00:00:52.854" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I get to use familiar tools like Git and Make.""" start="00:00:57.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Publishing and then pushing the site""" start="00:01:03.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to a local test server is just `make`.""" start="00:01:06.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Pushing it to the live site is just `make prod`.""" start="00:01:09.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""That said, certain problems made themselves apparent""" start="00:01:13.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""with this arrangement pretty quickly.""" start="00:01:18.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Commenting was one. It's very difficult""" start="00:01:22.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to support commenting on a static website.""" start="00:01:25.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've got no database.""" start="00:01:28.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have no real server, and so on.""" start="00:01:29.501" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Yes, of course, there is Disqus""" start="00:01:34.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and other third party services""" start="00:01:35.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that will do this for you,""" start="00:01:37.868" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but I was uncomfortable outsourcing that job.""" start="00:01:38.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And it was more than just comments.""" start="00:01:43.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There was a general sense of isolation.""" start="00:01:45.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There's no connection to places""" start="00:01:48.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""like Reddit, or Mastodon, or Twitter,""" start="00:01:50.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you know, where all the people are.""" start="00:01:53.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I guess you can post, then Tweet a link to it.""" start="00:01:56.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""But suppose somebody responds to your Tweet.""" start="00:01:59.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now you've got a conversation going on on Twitter""" start="00:02:01.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that you're a visitor, and""" start="00:02:05.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that a non-Twitter-using visitor to your site""" start="00:02:07.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""would be completely disconnected from.""" start="00:02:09.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I am seeing people using Reddit effectively""" start="00:02:15.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""as the comment section for their sites.""" start="00:02:19.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""But unless you've got an audience, you know,""" start="00:02:22.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the size of Derek's or Amos's,""" start="00:02:24.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I don't think that's really feasible either.""" start="00:02:27.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, after casting about for some time,""" start="00:02:32.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I stumbled upon something called the IndieWeb.""" start="00:02:34.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In their own words, the IndieWeb is""" start="00:02:37.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a community of independent and personal websites""" start="00:02:39.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""connected by simple standards based on""" start="00:02:41.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the principles of owning your domain""" start="00:02:44.401" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and using it as your primary identity,""" start="00:02:46.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""publishing on your own site,""" start="00:02:48.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and optionally syndicating elsewhere,""" start="00:02:50.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and owning your data.""" start="00:02:52.418" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I would describe it as a collection of individuals""" start="00:02:54.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""who've chosen to own their own platforms,""" start="00:02:57.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""alongside a loosely specked set of standards""" start="00:03:01.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that tie those sites together.""" start="00:03:05.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And it's really those standards""" start="00:03:07.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that make the IndieWeb""" start="00:03:09.218" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""more than just a call for everybody""" start="00:03:10.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to go back to the arts""" start="00:03:13.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and blog on on their own sites.""" start="00:03:14.735" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, this presentation isn't going to""" start="00:03:17.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""focus on the IndieWeb as such.""" start="00:03:19.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's more about using Org mode""" start="00:03:21.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to put your site on the IndieWeb.""" start="00:03:23.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'm a little limited by time here,""" start="00:03:24.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""so I'm going to focus on""" start="00:03:28.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""just one of those protocols,""" start="00:03:30.351" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and that's Webmentions.""" start="00:03:32.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, what's a Webmention?""" start="00:03:33.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Let's begin with the inveterate Alice,""" start="00:03:35.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""who has a website""" start="00:03:38.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and has posted content to that site.""" start="00:03:39.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Her old friend Bob comes along,""" start="00:03:42.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""notices that content""" start="00:03:46.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and wishes to say something about it.""" start="00:03:47.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""He posts to his site""" start="00:03:49.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and his publication software will,""" start="00:03:51.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""if it supports Webmentions,""" start="00:03:54.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""will notice that he's mentioned Alice's post.""" start="00:03:57.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At that point, his publication software""" start="00:04:00.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""reaches out to Alice's site,""" start="00:04:04.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""asks for the mentioned document,""" start="00:04:07.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and will examine it to see""" start="00:04:11.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""if Alice advertises an endpoint at her site""" start="00:04:12.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""capable of receiving Webmentions.""" start="00:04:15.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In this case, it does.""" start="00:04:18.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, Bob's publishing software does it.""" start="00:04:19.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At the end of the day,""" start="00:04:23.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a Webmention is really just""" start="00:04:24.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""an HTTP post request with two parameters,""" start="00:04:26.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a source and a target.""" start="00:04:30.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""On receipt, Alice's server will""" start="00:04:33.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""reach out to Bob's site,""" start="00:04:36.818" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""request the document that contains the mention,""" start="00:04:39.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and validate it, decide whether or not""" start="00:04:43.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""she wants to accept the Webmention.""" start="00:04:45.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In this case, it's legit, it's accepted,""" start="00:04:48.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and Alice chooses to make a note,""" start="00:04:50.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to update her content,""" start="00:04:54.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to make a note of the fact""" start="00:04:56.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that it was mentioned by Bob.""" start="00:04:58.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now a couple of things to note here.""" start="00:05:00.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The first is that this is effectively""" start="00:05:01.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""decentralized commenting.""" start="00:05:03.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Both parties own their content,""" start="00:05:04.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and there's no third party involved,""" start="00:05:07.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""trusted or otherwise.""" start="00:05:09.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now at this point, you might object that, well,""" start="00:05:13.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""as the owner of a statically generated site,""" start="00:05:16.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have essentially none of the infrastructure""" start="00:05:18.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I need to implement this.""" start="00:05:21.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have no server above and beyond Apache.""" start="00:05:22.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I can't really…, I have no database.""" start="00:05:27.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I guess you could send Webmentions with curl,""" start="00:05:30.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but now to do Webmention endpoint discovery,""" start="00:05:33.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you're going to be parsing arbitrary HTML.""" start="00:05:37.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's a lot of work.""" start="00:05:39.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""That's okay. There are sites out there""" start="00:05:41.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that offer Webmentions as a service.""" start="00:05:45.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, let's take a look at how that goes.""" start="00:05:48.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We return to our original example.""" start="00:05:51.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Alice continues to advertise an endpoint""" start="00:05:54.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""capable of receiving Webmentions,""" start="00:05:57.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but it's no longer on her site.""" start="00:06:00.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's at webmention.io.""" start="00:06:01.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Bob is essentially in the same position,""" start="00:06:03.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but he now has in his world""" start="00:06:08.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a third party site called Telegraph.""" start="00:06:09.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""When Bob wants to publish,""" start="00:06:13.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""he no longer needs to go through all the work""" start="00:06:16.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""of sending Webmention,""" start="00:06:19.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and of carrying out Webmention endpoint discovery.""" start="00:06:21.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""He sends one API request to Telegraph,""" start="00:06:25.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""effectively saying, please send a Webmention for me.""" start="00:06:27.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Asynchronously, telegraph.io is going to""" start="00:06:31.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""retrieve Alice's post,""" start="00:06:36.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""do Webmention endpoint discovery,""" start="00:06:38.718" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and send the Webmention on Bob's behalf.""" start="00:06:41.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Except this time he's sending it to webmention.io.""" start="00:06:45.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now, at some arbitrary point in the future,""" start="00:06:48.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Alice can ask webmention.io,""" start="00:06:53.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""&quot;Hey, do I have any new Webmentions?&quot;""" start="00:06:55.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And if she does, she may choose""" start="00:06:57.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to update her content and publish.""" start="00:07:00.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Okay, so let's code this up.""" start="00:07:04.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now, I'm recording this talk""" start="00:07:07.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""about a month ahead of time""" start="00:07:09.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and I haven't been able to put together""" start="00:07:10.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a little demo project.""" start="00:07:12.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Hopefully, I can hack something together""" start="00:07:13.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""before this video streams.""" start="00:07:16.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""But in the meantime,""" start="00:07:18.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'd like to imagine a little test site.""" start="00:07:20.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It has a single page,""" start="00:07:22.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""maybe we'll call it index.org,""" start="00:07:25.218" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and we're going to publish it.""" start="00:07:28.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We're going to export it to""" start="00:07:30.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a subdirectory of our project directory,""" start="00:07:32.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""simply called www.""" start="00:07:35.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, the entry point to the Org export system""" start="00:07:39.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""is the function org-publish,""" start="00:07:44.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""whose docstring helpfully says,""" start="00:07:46.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""it publishes all projects.""" start="00:07:49.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The set of all projects is defined by""" start="00:07:52.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the variable `org-publish-project-alist`,""" start="00:07:56.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which is a very flexible association list""" start="00:07:59.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that lets you define""" start="00:08:02.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""what files are in your project,""" start="00:08:03.868" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""how you wish to export them,""" start="00:08:05.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where they're going to go, etc, etc, etc.""" start="00:08:07.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So great. This is actually pretty straightforward.""" start="00:08:10.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We just give ourselves a little Elisp file""" start="00:08:13.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and a single function.""" start="00:08:15.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'll call it publish,""" start="00:08:17.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and all it will do is define""" start="00:08:18.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""`org-publish-project-alist`""" start="00:08:22.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and invoke `org-publish-all`.""" start="00:08:25.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At that point, exporting is a one-liner.""" start="00:08:26.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We just invoke Emacs, load up our site.el file,""" start="00:08:31.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and invoke the publish function.""" start="00:08:35.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And if we want to publish to the live server,""" start="00:08:37.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that's just another one-liner of ours.""" start="00:08:43.668" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, that's the publication framework.""" start="00:08:45.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, let's take a look at sending Webmentions.""" start="00:08:48.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The idea is that we're going to""" start="00:08:51.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""get our fingers into the publication process.""" start="00:08:54.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Note when we see a Webmention in""" start="00:08:57.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the process of exporting our Orgdown,""" start="00:09:01.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and write it out to disk for sending later on.""" start="00:09:04.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now, I didn't want to send a Webmention""" start="00:09:07.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for every single link in the post.""" start="00:09:11.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I wanted this to be an intentional choice.""" start="00:09:13.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And it turns out there are""" start="00:09:14.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""different sorts of Webmentions""" start="00:09:16.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you can make on a page.""" start="00:09:19.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""For instance, if you add""" start="00:09:20.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the CSS class u-in-reply-to to your link,""" start="00:09:22.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the recipient will""" start="00:09:26.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""interpret this Webmention as a reply.""" start="00:09:28.635" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There are similar CSS classes""" start="00:09:30.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for likes, reposts, and generalized mentions.""" start="00:09:33.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""When the recipient gets your Webmention,""" start="00:09:37.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""if they want to know who's talking to them,""" start="00:09:42.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""they need to parse your page""" start="00:09:45.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and look for DOM elements with certain CSS classes""" start="00:09:47.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""defined by the protocol as well.""" start="00:09:51.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""I'm a visual thinker,""" start="00:09:54.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""so I kind of drew out the process of publication,""" start="00:09:57.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and exactly where we're going to""" start="00:10:00.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""get our fingers into this.""" start="00:10:03.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, this is me invoking make,""" start="00:10:05.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which of course fires up Emacs.""" start="00:10:07.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Just as before, my publish function will define""" start="00:10:09.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""`org-publish-project-alist` with one difference.""" start="00:10:14.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There is an attribute,""" start="00:10:17.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a property in the list called `publishing-function`.""" start="00:10:21.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We're going to need to customize that.""" start="00:10:23.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""As usual, we then call…,""" start="00:10:26.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""we kick off the process by calling `org-publish-all`.""" start="00:10:28.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""org-publish-all will invoke""" start="00:10:31.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""your publishing function""" start="00:10:36.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for each page, and it will hand to""" start="00:10:37.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""your publishing function for each page.""" start="00:10:40.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The name of the file you're publishing,""" start="00:10:42.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where it's going, and a parameter entitled plist.""" start="00:10:45.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""This is not super well documented.""" start="00:10:50.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There are points in the docs""" start="00:10:53.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that refer to this as a communication channel.""" start="00:10:55.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""What I discovered by simply reading the code was that""" start="00:10:57.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""it's a property list that is initialized""" start="00:11:01.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for each invocation of your publication function.""" start="00:11:04.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The initial properties are""" start="00:11:09.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""inherited from your project,""" start="00:11:13.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but you are free to add properties as you go""" start="00:11:16.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to communicate between different portions""" start="00:11:20.801" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""of the publication process.""" start="00:11:23.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""My publication function really does one thing,""" start="00:11:25.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and that's simply swap out the HTML template""" start="00:11:30.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that's passed to `org-publish-to`.""" start="00:11:34.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, in order to take note of""" start="00:11:36.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""each Webmention that I send,""" start="00:11:43.696" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I took advantage of another""" start="00:11:45.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Org mode extension point""" start="00:11:47.585" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""called defining new link types.""" start="00:11:49.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Here you can see""" start="00:11:52.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've created a new link type called reply.""" start="00:11:54.851" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""One of the attributes that you can attach to this""" start="00:11:58.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""is the function that is used to export your link.""" start="00:12:01.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've elided the code for""" start="00:12:06.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""mentions, likes, and reposts.""" start="00:12:08.562" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""If you look at my export function,""" start="00:12:10.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you can see that it ultimately yields""" start="00:12:13.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the appropriate HTML for this link.""" start="00:12:16.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Before that, it calls a little helper function""" start="00:12:19.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that will pull out the actual""" start="00:12:22.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""target URL of the link""" start="00:12:24.518" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and shove it into this communication channel""" start="00:12:26.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""under the property name `sp1ff/mentions`.""" start="00:12:28.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""So, `org-publish-to` is really the workhorse""" start="00:12:31.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""of the publication process.""" start="00:12:37.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The first thing it's going to do is""" start="00:12:40.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""transcode from the parsed Orgdown,""" start="00:12:42.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which is an intermediate representation""" start="00:12:47.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""known as Org elements, to HTML.""" start="00:12:50.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In particular, for every one of my new links""" start="00:12:53.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that I'm using to mark Webmentions,""" start="00:12:57.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""it's going to invoke my little export function.""" start="00:13:00.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And so as we work our way through the post,""" start="00:13:04.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'm going to accumulate all the Webmentions""" start="00:13:06.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that I've made in the property list.""" start="00:13:09.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The second step is to actually render""" start="00:13:10.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the final HTML document,""" start="00:13:14.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and that's where my specialized template comes in.""" start="00:13:16.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""All I do there is, use it to get""" start="00:13:18.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""my authorship information into the page.""" start="00:13:21.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And then the last step is called finalization.""" start="00:13:24.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At this point, we have the rendered HTML document,""" start="00:13:29.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and Org mode gives you an extension point here,""" start="00:13:32.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where you can do arbitrary post-processing""" start="00:13:35.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""on that document.""" start="00:13:38.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I arguably abuse it to retrieve""" start="00:13:39.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""all the Webmentions I've made""" start="00:13:42.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""out of the communication channel""" start="00:13:44.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and write them to disk.""" start="00:13:46.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At this point, when we type make,""" start="00:13:47.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""we wind up with the rendered HTML""" start="00:13:54.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for our Orgdown document,""" start="00:13:59.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""along with a little text file""" start="00:14:01.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""in which we've recorded all the Webmentions""" start="00:14:03.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that need to be sent.""" start="00:14:06.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""The next step is to send said Webmentions.""" start="00:14:07.349" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""This is surprisingly easy in Emacs Lisp.""" start="00:14:11.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""This is my actual implementation.""" start="00:14:15.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I use the request.el package to talk to Telegraph.""" start="00:14:17.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And at this point, we really don't need to""" start="00:14:22.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""add a lot to our little site Elisp file.""" start="00:14:26.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I sketched out a `send-webmentions` implementation""" start="00:14:30.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that just goes through in a loop""" start="00:14:34.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and calls my send-webmention function.""" start="00:14:36.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And now publication becomes a two-step process.""" start="00:14:39.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""First, the org-publish, then sending Webmentions.""" start="00:14:42.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Okay, so I realize this has been""" start="00:14:46.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a bit of a whirlwind.""" start="00:14:51.418" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, where are we now?""" start="00:14:52.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We have a sample site that we can publish""" start="00:14:55.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and have sent Webmentions.""" start="00:15:00.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And we've done it with just Emacs, Org mode,""" start="00:15:02.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a little Lisp, and a make file.""" start="00:15:05.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""If you'd like to see more,""" start="00:15:07.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've put my library up on GitHub.""" start="00:15:09.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It has logic for both""" start="00:15:11.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""sending and receiving Webmentions""" start="00:15:13.754" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""as well as something""" start="00:15:15.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that on the IndieWeb is called POSSE,""" start="00:15:16.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which is an acronym standing for""" start="00:15:19.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Publish (on your) Own Site, Syndicate Elsewhere.""" start="00:15:22.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""What that means is that""" start="00:15:25.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you turn the publication step""" start="00:15:27.818" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""from merely publishing new content to your site""" start="00:15:31.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to also replicating it to places""" start="00:15:35.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""like Twitter and Facebook and so forth.""" start="00:15:36.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And also when people like, comment,""" start="00:15:39.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and retweet your content,""" start="00:15:44.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that gets fed back to your site,""" start="00:15:45.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where you can display it as comments.""" start="00:15:47.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""In terms of the future,""" start="00:15:51.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I feel like I'm at a decision point.""" start="00:15:52.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Org mode is admirably flexible,""" start="00:15:54.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and I'm confident that I can continue to""" start="00:15:58.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""add support for IndieWeb protocols.""" start="00:16:00.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""On the other hand, it is so flexible""" start="00:16:02.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that the process of figuring out""" start="00:16:05.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which extension points to use in any situation""" start="00:16:07.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""is very challenging.""" start="00:16:10.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""When I started down this path,""" start="00:16:12.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""my mindset was keep it simple""" start="00:16:14.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and let's just see how far I could get with Org mode.""" start="00:16:17.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And I feel like I might be bumping up""" start="00:16:20.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""against the limitations of that approach now.""" start="00:16:23.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:16:25.800" video="mainVideo-indieweb" id="subtitle"]]
+
+
+
+Captioner: bhavin192
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20indieweb%3A%20Putting%20Org%20Mode%20on%20the%20Indieweb)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/indieweb-before.md b/2022/info/indieweb-before.md
new file mode 100644
index 00000000..843d566c
--- /dev/null
+++ b/2022/info/indieweb-before.md
@@ -0,0 +1,62 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Michael Herstine shows how to set up Org Mode for sending and publishing Webmentions as part of the Indieweb. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="indieweb">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect stroke-width="3" x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 17-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-indieweb>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T20:25:00Z" end="2022-12-04T20:45:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~3:25 PM - 3:45 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~2:25 PM - 2:45 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~1:25 PM - 1:45 PM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~12:25 PM - 12:45 PM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~8:25 PM - 8:45 PM UTC <br />Sunday, Dec 4 2022, ~9:25 PM - 9:45 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~10:25 PM - 10:45 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~1:55 AM - 2:15 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~4:25 AM - 4:45 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~5:25 AM - 5:45 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="indieweb-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="indieweb-mainVideo" data="""
+00:00.000 Introduction
+00:14.080 Maintaining a personal website using Org mode
+01:13.880 Problems with comments and isolation
+02:32.040 The Indieweb
+03:17.800 Webmentions
+05:00.600 Decentralized commenting
+07:04.160 The publication framework
+08:48.080 Sending Webmentions
+09:54.000 The process of publication
+11:36.840 Defining new link types
+12:31.920 org-publish-to
+14:07.349 Sending Webmentions with request.el
+14:46.520 Summary
+15:51.400 The future
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.webm">Download --main.webm (51MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/bTV1JohHSkRvnHYQKZ39hm">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="indieweb-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="indieweb-qanda" data="""
+00:00.000 Introduction
+01:05.500 Q0 - How did you create the drill down representation of the make call?
+02:22.132 Q1 - Have you seen Reclaim ID?
+02:22.840 Q2 - what happens when you republish or re-export the same post will the web mentions be sent out repeatedly
+03:14.300 Q3 - Backend storage - alternative to database
+04:01.107 Q4 - Any thoughts on using it with ox-hugo?
+05:27.632 Q6 - web 1, web 2 vs web3 (?)
+05:57.207 Intermission - opening the Q&A message
+08:12.207 Q7 - Cutting telegraph out of the equation?
+09:08.715 Q8 - Web3 - indieweb vs(?) static site
+09:55.232 Q9 - Do you have a process running on the webserver to receive requests?
+10:44.857 Q8 (bis) - discussion about Web3 + having a demo
+12:20.957 Q9 - How satisfied are you? - current vs alternative indieweb protocols
+13:44.440 Q10 - Are you not doing too much inside emacs?
+14:32.540 Q11 - If you start with Telegraph and then want to change the endpoint, what happens?
+15:55.814 Q12 - Have you seen Agregore browser?
+16:13.914 Q13 - Are you not doing too much inside emacs? (bis)
+17:33.690 Closing and moving to the next speaker
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="indieweb-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.webm">Download --answers.webm (39MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--answers.opus">Download --answers.opus (6.7MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/indieweb-nav.md b/2022/info/indieweb-nav.md
new file mode 100644
index 00000000..dbe52317
--- /dev/null
+++ b/2022/info/indieweb-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/dbus">The Wheels on D-Bus</a>
+Next by track: <a href="/2022/talks/localizing">Pre-localizing Emacs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/journalism-after.md b/2022/info/journalism-after.md
new file mode 100644
index 00000000..8df9d23a
--- /dev/null
+++ b/2022/info/journalism-after.md
@@ -0,0 +1,277 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="journalism-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""All right. Hello, everyone. Welcome to my talk.""" start="00:00:00.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""We'll be talking today about Emacs journalism""" start="00:00:06.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and what that means.""" start="00:00:10.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""First of all, I'd like to thank the EmacsConf organizers.""" start="00:00:12.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Thank you very much, Sacha, for being very patient with me.""" start="00:00:15.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Let's get right into it. So who's this talk for?""" start="00:00:20.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""First of all, it's for anyone""" start="00:00:22.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""who wants to learn about workflows""" start="00:00:24.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and how you can work with Emacs""" start="00:00:26.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to basically do anything you want.""" start="00:00:28.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And it's for all levels of Emacs lovers.""" start="00:00:31.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I'll keep it accessible.""" start="00:00:33.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""Why this talk? So first of all,""" start="00:00:36.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I want to share a lot of Emacs.""" start="00:00:37.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I also wanted to learn about workflows myself.""" start="00:00:40.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So what better way than to talk about them""" start="00:00:42.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to be able to learn? And we could maybe learn a thing""" start="00:00:46.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""or two about collaboration and using Emacs to that motive.""" start="00:00:49.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I think it's useful to try and figure out who am I?""" start="00:00:56.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Why am I having this talk? I'm a journalist based""" start="00:01:00.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""in Hong Kong and a documentary filmmaker. So that means""" start="00:01:03.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that I have interviews quite often.""" start="00:01:06.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I'm dealing with texts and subtitles,""" start="00:01:08.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which I have to transcribe.""" start="00:01:11.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And I'm also dealing with a lot of research.""" start="00:01:14.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So that means going through a lot of documents and a lot of,""" start="00:01:16.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""well, skimming through documents""" start="00:01:22.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to be able to have something to write.""" start="00:01:26.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And I also use Emacs since basically one year ago,""" start="00:01:30.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I started using it full time""" start="00:01:34.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to have a great detriment of my productivity.""" start="00:01:35.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So we'll be talking about, we'll be talking about, well,""" start="00:01:39.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""basically, my workflow for Emacs""" start="00:01:45.600" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and how I went about having an Emacs workflow.""" start="00:01:48.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""So what is best when you're thinking about your own workflow""" start="00:01:52.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and some things to think about journalism""" start="00:01:56.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and about using these kinds of tools""" start="00:01:59.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""in combination for this? So where do we all start?""" start="00:02:03.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Let's start with a simple-ish definition""" start="00:02:09.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""of what is a workflow. A workflow is""" start="00:02:11.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""any sequence of actions or tools you use to accomplish that.""" start="00:02:14.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So it doesn't have to be through text processing,""" start="00:02:18.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""though obviously being a text-oriented community,""" start="00:02:23.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""it will most likely be partially text.""" start="00:02:27.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But it's just about how we accomplish a task""" start="00:02:31.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and which tools and mindsets we go into it with.""" start="00:02:35.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""For example, let's talk about my old workflow.""" start="00:02:39.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""That workflow was basically just Google Drive""" start="00:02:42.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""using proprietary tools like Notion, Google Drive, Office,""" start="00:02:46.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Storyboarder, and for communication, WeChat.""" start="00:02:50.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""If I could forgive all the privacy concerns of WeChat,""" start="00:02:55.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I wouldn't, but I still wouldn't forgive""" start="00:02:59.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""the terribly buggy interface, and I hate it.""" start="00:03:03.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So there are certain tools that you have to use""" start="00:03:06.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and you have to modify your workflow""" start="00:03:09.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""or just adapt your workflow to the tools""" start="00:03:11.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that you have to use. So for me, unfortunately,""" start="00:03:13.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that means having to use WeChat. You compartmentalize it""" start="00:03:17.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and set it aside, try not to think about it too hard.""" start="00:03:23.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And this is the part that hurts the most, right?""" start="00:03:27.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""You're thinking about your workflow,""" start="00:03:29.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""you're thinking about, all right,""" start="00:03:31.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I have this thing that works, I don't think about it.""" start="00:03:32.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And all of a sudden, oh, I'm not happy""" start="00:03:37.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""with what I have right now. So let's get into,""" start="00:03:40.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""let's get into how, oops. So let's get into how and why""" start="00:03:44.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""we're not happy with our workflows.""" start="00:03:50.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Because obviously, it's quite nice""" start="00:03:51.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to not have to think about things.""" start="00:03:55.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But once you've thought about it,""" start="00:03:57.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and once you're not happy with how it works,""" start="00:03:58.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I think it's quite useful to think about""" start="00:04:01.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""why we're not happy about it.""" start="00:04:03.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""A huge part of what Emacs is being conscious of, well,""" start="00:04:05.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""how do we find our workflows?""" start="00:04:10.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""How do we find what we want to do? And for me, obviously,""" start="00:04:11.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""the best way to find that is to write it down""" start="00:04:17.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and to try and tailor my tools to it.""" start="00:04:19.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""This is what I came up with.""" start="00:04:24.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I want to be able to manage my accounting,""" start="00:04:26.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to manage collaboration. So: working on files""" start="00:04:28.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""alongside my colleagues, communication,""" start="00:04:30.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""so that's planning out and managing meetings,""" start="00:04:33.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""managing teammates, managing tasks, information gathering.""" start="00:04:38.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So that's what I was saying, going through documents,""" start="00:04:44.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""going through all these lists of tasks and all of these,""" start="00:04:45.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""not lists of tasks, all of these, well, basically,""" start="00:04:50.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""scientific papers, notes, references and wikis, media.""" start="00:04:54.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I want to be able to have a music player,""" start="00:04:59.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""a podcast player, a movie player. That's outside of work,""" start="00:05:02.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""but it's still one of the tasks that I do. Media processing,""" start="00:05:06.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""so this is where my job kind of gets into it a bit more.""" start="00:05:10.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I want to be able to take notes""" start="00:05:13.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""on the media that I watch,""" start="00:05:15.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to transcribe the interviews""" start="00:05:16.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and even the conversations that I have,""" start="00:05:19.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to be able to later on have an easier time.""" start="00:05:21.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Photo editing, video editing, so unfortunately,""" start="00:05:26.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Emacs isn't quite quite oriented to that.""" start="00:05:32.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Graphic design, color grading, storyboarding.""" start="00:05:35.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And so obviously, you go into it a bit more.""" start="00:05:40.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So managing to do scheduling tasks, interviews,""" start="00:05:43.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""preparing shot lists, tracking time,""" start="00:05:46.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""setting daily work goals, setting priorities,""" start="00:05:49.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""independent tasks, publishing,""" start="00:05:53.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""so publishing stuff for my work on my work CMS,""" start="00:05:55.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""publishing stuff on my personal CMS,""" start="00:05:59.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""although that's not happened yet. I've been kind of busy.""" start="00:06:01.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Security and privacy, so making sure""" start="00:06:06.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that everything that I use respects my data and respects me.""" start="00:06:08.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Unfortunately, not the case, but you take what you can.""" start="00:06:13.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Text processing. So that's journaling,""" start="00:06:18.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""writing down articles, my personal wiki, my work wiki,""" start="00:06:20.600" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which I use to document, well, for example,""" start="00:06:26.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""several projects that I have currently.""" start="00:06:34.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I basically have my work wiki that I'm trying""" start="00:06:37.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to fill out where I'll be able""" start="00:06:43.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to basically go into it later on""" start="00:06:45.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and have my thoughts written down.""" start="00:06:47.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And programming, which I'm not very good at.""" start="00:06:50.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""Some people might have noticed""" start="00:06:56.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that this looks a lot like [literate] programming.""" start="00:06:59.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""If you go into my config file,""" start="00:07:17.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I have something kind of similar.""" start="00:07:18.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I was planning on having a bit more time""" start="00:07:20.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""for this presentation and making it stick to that.""" start="00:07:22.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But you'll see basically the mess that is my Emacs config.""" start="00:07:26.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But it kind of sticks to the same thoughts, right?""" start="00:07:31.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Text processing, web browsing, finances,""" start="00:07:33.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that's my accounting, media and research.""" start="00:07:37.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So my BibTeX... Here be dragons.""" start="00:07:39.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Terrible, terrible config""" start="00:07:43.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that I've stolen from plenty of people.""" start="00:07:45.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So basically, that's how Emacs fits into this.""" start="00:07:47.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So this is where I talk about literate configs""" start="00:07:52.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and how that's helped me. Obviously, I've extolled""" start="00:07:57.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""the virtue of literate configs""" start="00:08:01.920" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to quite an extent right here. It's basically...""" start="00:08:04.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""The concept is to have documents, living documents""" start="00:08:09.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and documentation as code.""" start="00:08:15.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So basically, let's go back into my config.""" start="00:08:18.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I talk about what the config file does, have code blocks.""" start="00:08:22.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So this is something that Emacs does. I'm pretty sure""" start="00:08:31.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that there are some resources about that accessible online,""" start="00:08:33.600" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which are even accessible in the Emacs Gulf. And so, yeah,""" start="00:08:36.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""basically just having everything accessible""" start="00:08:46.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""in one single source, one single file,""" start="00:08:50.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which allows you to basically put everything down""" start="00:08:52.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and integrate things from your config much much more easily.""" start="00:08:54.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""That's something that I found very useful in Emacs""" start="00:09:00.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and which I think everyone can benefit from""" start="00:09:05.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""or the idea of it, like having everything stored centrally.""" start="00:09:07.600" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""It doesn't have to be used just for Emacs.""" start="00:09:11.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""It can be used also, it can be used also for, for example,""" start="00:09:15.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""a Qt browser or for other window manager configs.""" start="00:09:22.000" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""That kind of thing.""" start="00:09:26.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And it's not been very easy to set a place.""" start="00:09:28.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I haven't done that just yet, but that's the plan.""" start="00:09:32.920" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""Basically, this is all thanks to Org mode.""" start="00:09:37.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So, small presentation of what Org mode is. Org mode""" start="00:09:41.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""is basically a project / task management,""" start="00:09:45.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""past management and task management,""" start="00:09:49.600" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and writing mode for Emacs.""" start="00:09:52.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I can just put in a heading to do Hello World,""" start="00:09:54.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""send a message to Rosie tomorrow about the shoot space MDS--""" start="00:10:00.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that's thanks to wonderful Doom Emacs--and schedule it.""" start="00:10:10.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I don't know. It's tomorrow. Let's go and set it to 9am.""" start="00:10:15.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And say, maybe it's it's tomorrow already. I've done it.""" start="00:10:21.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I've sent a message. Perfect. It's done.""" start="00:10:28.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And it also allows you to have an agenda view.""" start="00:10:31.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I hope there's nothing too compromising right here.""" start="00:10:33.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Whatever. It's fine. So it allows you""" start="00:10:37.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to basically manage your agenda from there.""" start="00:10:41.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And you might have seen me doing my little space nrf""" start="00:10:45.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and wonderful key binding by Org Roam. So this""" start="00:10:54.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""is also another thing which is quite quite nice""" start="00:10:58.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""with Emacs is that you can you can have Org Roam, which""" start="00:11:01.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""is basically a database management program.""" start="00:11:06.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I can have documentary ideas""" start="00:11:09.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and have basically my ideas which link up to another file.""" start="00:11:12.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So for example, this one, which I have nothing for,""" start="00:11:21.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""but you get the idea. So it allows you to apps""" start="00:11:25.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to link up with different files and to manage your thoughts.""" start="00:11:29.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And this gets back into the workflow part of my talk,""" start="00:11:33.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which is, well, this, this is a way""" start="00:11:37.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to control what your workflow""" start="00:11:41.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""is control what the tools you're using are and to control,""" start="00:11:44.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""basically the way in which you interact""" start="00:11:49.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""with your technology.""" start="00:11:52.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""So I am getting back into the way that I collaborate.""" start="00:11:52.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Because obviously it's no good having just""" start="00:11:59.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""one Emacs user who's trying to share to share things""" start="00:12:02.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""with his editor. So I use pandoc.""" start="00:12:07.920" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""For example, let's go back into my file right here.""" start="00:12:11.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Obviously, I don't spend much time inside of tables.""" start="00:12:17.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But if I select this one, that's &quot;SPC m e&quot;.""" start="00:12:24.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Thank you, Doom Emacs for the for the keybindings.""" start="00:12:29.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And I can just export it via pandoc right here, So &quot;p&quot;.""" start="00:12:32.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And I can just export it to doc, docx, or export it to ODT.""" start="00:12:38.240" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So as an ODT file, which is typically what I do.""" start="00:12:50.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And then I just send it through WeChat,""" start="00:12:55.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which is not optimal, but I'm not allowed""" start="00:12:57.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""to do anything else. So it is what it is.""" start="00:13:00.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Basically, this is how I export my files. And I re-import,""" start="00:13:04.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I re-import them with pandoc as well.""" start="00:13:12.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So I convert my Pages files, which I receive""" start="00:13:15.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""through an ICS plugin. It's not quite finalized,""" start="00:13:19.800" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""so I'm not ready to show it,""" start="00:13:22.880" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""but there's a link that I'll be putting""" start="00:13:24.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""in the description which talks about this.""" start="00:13:26.360" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So this is my sharing part.""" start="00:13:29.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""It's nothing very special, honestly.""" start="00:13:32.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""It's just making sure that your documents""" start="00:13:35.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""are able to be shared.""" start="00:13:38.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I have certain things. So for example,""" start="00:13:41.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""if I go into retro gaming in Hong Kong,""" start="00:13:44.080" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""if I go into my scripts, there are certain headings""" start="00:13:47.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which I have. So for example, they ignore...""" start="00:13:53.920" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""My editor doesn't like to have some headings.""" start="00:13:55.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But when I have a video script that I'm preparing,""" start="00:13:58.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I like to have them for my own organization""" start="00:14:02.600" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and for my thinking. So I keep them in right there""" start="00:14:05.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and put in ignore. This is the advantage""" start="00:14:09.400" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""of the Emacs because you can just SPC m e o o,""" start="00:14:11.761" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and this is ready to send, basically.""" start="00:14:17.281" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""There are ways to have export presets,""" start="00:14:20.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""but I'm not quite there yet. It's a lot of work.""" start="00:14:24.040" video="mainVideo-journalism" id="subtitle"]]
+[[!template new="1" text="""So, getting back to my presentation.""" start="00:14:26.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""This all goes into basically other packages,""" start="00:14:30.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""which I want to implement, but I haven't been able to.""" start="00:14:36.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""My main conclusion: you don't have to get lost in the weeds.""" start="00:14:39.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I kind of did that while preparing this talk.""" start="00:14:43.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So basically, you don't have to do it all at once.""" start="00:14:48.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Don't let it consume your life.""" start="00:14:51.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I probably should have done this earlier.""" start="00:14:55.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But Emacs configs are forever work in progress.""" start="00:14:57.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So there are lots of features which you can add,""" start="00:15:02.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""a lot of things which you can implement if you only had,""" start="00:15:04.920" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I don't know, five weeks to be able to implement them.""" start="00:15:08.120" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""But you're working right now.""" start="00:15:11.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And this is a message to me five months ago.""" start="00:15:12.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Don't do it. Just keep working""" start="00:15:16.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and don't get lost in configuration all day.""" start="00:15:19.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""So yeah, basically the aim is to use software that you love,""" start="00:15:23.640" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""but not die in the process.""" start="00:15:27.560" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And yeah, basically just using it as much as you can""" start="00:15:29.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""using fast software as much as you can.""" start="00:15:34.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I'm doing that as well for...""" start="00:15:36.520" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I have certain software such as storyboarder or bit tags,""" start="00:15:39.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""that kind of thing, which I try to use as much as possible,""" start="00:15:46.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""even outside of Emacs.""" start="00:15:50.160" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And the aim is to get the work done in the end.""" start="00:15:51.840" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I'm not an absolutist on this. So yeah, basically,""" start="00:15:56.280" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""let's keep modding our configs and having fun.""" start="00:16:00.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""If you've got any questions about the talk,""" start="00:16:03.920" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I'm happy to answer. I am a novice at this,""" start="00:16:06.480" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""both presenting in front of camera""" start="00:16:10.440" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and at talking about Emacs.""" start="00:16:12.960" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I'm sure I've gotten a few things wrong,""" start="00:16:15.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""and it's not been the smoothest talk, but it's 10pm, almost.""" start="00:16:18.680" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I need to get back home. Yeah, take care, everyone.""" start="00:16:23.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""Thanks again to the organizers. Here's my contact info.""" start="00:16:28.760" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""And I'll be in touch with the questions.""" start="00:16:32.720" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""I don't think I'll be able to do the live answers,""" start="00:16:36.200" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""but that's more or less it. Thanks so much for listening,""" start="00:16:38.320" video="mainVideo-journalism" id="subtitle"]]
+[[!template text="""if you've been listening, and take care.""" start="00:16:41.880" video="mainVideo-journalism" id="subtitle"]]
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20journalism%3A%20Emacs%20journalism%20%28or%20everything%27s%20a%20nail%20if%20you%20hit%20it%20with%20Emacs%29)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/journalism-before.md b/2022/info/journalism-before.md
new file mode 100644
index 00000000..6c1b25c5
--- /dev/null
+++ b/2022/info/journalism-before.md
@@ -0,0 +1,45 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="journalism">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect stroke-width="3" x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 17-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-journalism>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T14:05:00Z" end="2022-12-03T14:25:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~9:05 AM - 9:25 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~8:05 AM - 8:25 AM CST (US/Central)<br />Saturday, Dec 3 2022, ~7:05 AM - 7:25 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~6:05 AM - 6:25 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~2:05 PM - 2:25 PM UTC <br />Saturday, Dec 3 2022, ~3:05 PM - 3:25 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~4:05 PM - 4:25 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~7:35 PM - 7:55 PM IST (Asia/Kolkata)<br />Saturday, Dec 3 2022, ~10:05 PM - 10:25 PM +08 (Asia/Singapore)<br />Saturday, Dec 3 2022, ~11:05 PM - 11:25 PM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="journalism-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="journalism-mainVideo" data="""
+00:00.000 Introduction
+00:36.120 Why this talk
+01:52.160 Thinking about workflows
+02:39.120 My old workflow
+04:05.280 Finding my workflow
+06:56.800 Literate configuration
+09:37.640 Org Mode
+11:52.960 Collaborating with Pandoc
+14:26.960 You don't have to get lost in the weeds
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.webm">Download --main.webm (112MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.opus">Download --main.opus (9.9MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/nqaGcHbHSY2dGxVpzvc3WX">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="journalism-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="journalism-qanda" data="""
+00:58.920 Why was WeChat a necessity for you?
+02:33.520 Have you looked at crdt.el for collaborative real-time editing?
+05:11.520 Sharing Org Mode files is trickier than we expect. Do you do this?
+07:15.520 Do you use pandoc for incoming and outgoing docs? Do you find that repeated conversions lose document quality?
+10:16.520 What was your moment when you started to work in Emacs instead of config editing?
+12:53.520 Why is Emacs recommended for journalism?
+19:17.520 Do you use any fancy solutions for annotating text onto particular video timestamps?
+24:08.520 When you get stuck with an Emacs problem, is there somewhere you go to get help (nice place for non-tech people)?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="journalism-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.webm">Download --answers.webm (114MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-journalism--emacs-journalism-or-everythings-a-nail-if-you-hit-it-with-emacs--alfred-zanini--answers.opus">Download --answers.opus (8.7MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/journalism-nav.md b/2022/info/journalism-nav.md
new file mode 100644
index 00000000..530eee48
--- /dev/null
+++ b/2022/info/journalism-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/sat-open">Saturday opening remarks</a>
+Next by track: <a href="/2022/talks/school">Back to school with Emacs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/jupyter-after.md b/2022/info/jupyter-after.md
new file mode 100644
index 00000000..830fdf16
--- /dev/null
+++ b/2022/info/jupyter-after.md
@@ -0,0 +1,270 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="jupyter-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hi, my name is Blaine Mooers.""" start="00:00:00.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I'm an associate professor of biochemistry""" start="00:00:03.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""at the University of Oklahoma Health Sciences Center""" start="00:00:05.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in Oklahoma City.""" start="00:00:08.200" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I'm going to talk about the use of Emacs""" start="00:00:09.760" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""to edit live Jupyter notebook cells""" start="00:00:12.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""as well as text areas on web pages.""" start="00:00:16.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So like a lot of technical workers,""" start="00:00:20.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I find myself having to write prose""" start="00:00:22.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in text areas on web pages,""" start="00:00:24.880" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""as well as working with code""" start="00:00:28.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in Jupyter notebooks and Colab notebooks,""" start="00:00:31.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and often I have wished for""" start="00:00:37.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""the full power of Emacs while doing so.""" start="00:00:39.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Well, now that is possible.""" start="00:00:43.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Actually, there are several solutions""" start="00:00:45.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that have been available for some time.""" start="00:00:46.800" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I'm going to talk about one solution""" start="00:00:49.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that I'm familiar with and has worked out for me.""" start="00:00:50.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""So this requires the use of two software packages,""" start="00:00:55.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""GhostText and Atomic Chrome.""" start="00:00:58.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""GhostText is an extension for the web browser,""" start="00:01:01.600" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""whereas Atomic Chrome is a package for Emacs.""" start="00:01:04.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""You have to have both of these.""" start="00:01:07.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So Chrome is for the editor side""" start="00:01:10.880" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and GhostText handles the browser side.""" start="00:01:13.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""The GhostText extension is available""" start="00:01:18.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in the Chrome web store.""" start="00:01:22.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And GhostText is represented by this icon,""" start="00:01:26.800" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""which has a ghost in front of the capital letter T.""" start="00:01:29.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""It is being developed by Federico Brigante.""" start="00:01:31.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""He is a very prolific JavaScript developer.""" start="00:01:36.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""He has a web page committed to GhostText,""" start="00:01:41.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""as well as a GitHub site.""" start="00:01:44.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So here's an example of GhostText.""" start="00:01:47.200" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This is a snapshot from a session""" start="00:01:50.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that I had while editing LaTeX on the Overleaf website.""" start="00:01:54.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Overleaf is this web service""" start="00:02:01.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that empowers the editing of LaTeX documents on the web.""" start="00:02:03.760" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I have clicked on this GhostText icon in the toolbar.""" start="00:02:09.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I had already opened up Emacs,""" start="00:02:14.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and I had the Atomic Chrome server running.""" start="00:02:17.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So a connection was established,""" start="00:02:19.880" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""as indicated by this blue border around this text area.""" start="00:02:21.800" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And as soon as that appeared,""" start="00:02:28.600" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""the text appeared in a buffer inside of Emacs.""" start="00:02:30.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I have overlaid the area where normally the compiled PDF""" start="00:02:35.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""would appear in an Overleaf session.""" start="00:02:40.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I'm using a configuration for LaTeX that I developed,""" start="00:02:43.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""which is available through the MooersLab GitHub site.""" start="00:02:47.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I also gave a talk about how I use LaTeX in Emacs""" start="00:02:52.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""at the Berlin Emacs meetup in August.""" start="00:02:55.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This talk was not recorded,""" start="00:02:58.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""but the slides are available on this website.""" start="00:03:00.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I would like to now switch to a little live coding""" start="00:03:05.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""to make this a little more interesting.""" start="00:03:09.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I start my day at this other website called 750Words.""" start="00:03:12.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""This site just takes plain text,""" start="00:03:22.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""but I like to write in LaTeX.""" start="00:03:25.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So GhostText came to my rescue""" start="00:03:28.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""when I started using this everyday last May.""" start="00:03:31.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I clicked on the GhostText icon.""" start="00:03:34.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""It highlighted that area in blue.""" start="00:03:37.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""There's some boilerplate""" start="00:03:39.760" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that I like to start my day with.""" start="00:03:41.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I like to get a list of my deadlines""" start="00:03:45.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that are coming up, as shown here,""" start="00:03:50.600" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""for the next several months.""" start="00:03:54.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then I have landed at this tab stop.""" start="00:03:55.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And so I had issued a tab trigger""" start="00:03:59.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""which inserted this almost 50 lines of text""" start="00:04:04.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""from a snippet through Yasnippet.""" start="00:04:09.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then I'll change this text to whatever.""" start="00:04:13.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then I can hit TAB to move to the next site.""" start="00:04:17.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I was dead tired last night, so I fell asleep at my desk,""" start="00:04:29.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and whatever. So I just keep on going""" start="00:04:38.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and then hit TAB again and enter my &quot;To Be Done&quot; items.""" start="00:04:42.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then what I love about Emacs is that""" start="00:04:47.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""you can hit C-c C-j to insert a new item and so forth,""" start="00:04:50.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""so you can extend the list.""" start="00:04:56.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Initially, I just have 10 items.""" start="00:05:03.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I'm going to have more. And on I go,""" start="00:05:05.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""using the full power of LaTeX.""" start="00:05:08.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I have configured Atomic Chrome""" start="00:05:12.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""so it will recognize this website as a –""" start="00:05:16.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""it will open up this website –""" start="00:05:20.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""the connection to this website with this buffer""" start="00:05:21.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in the LaTeX major mode. To turn this off,""" start="00:05:26.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""we can close – simply just close the buffer""" start="00:05:36.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and that will shut things down.""" start="00:05:40.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""On the browser side, you can right-click on the icon""" start="00:05:42.960" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and disconnect GhostText on this page.""" start="00:05:46.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Okay, let's go to a different situation.""" start="00:05:49.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This is not a feature that's advertised by the developer,""" start="00:05:53.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""but I discovered that you can edit code cells""" start="00:05:57.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""(or any kind of cell for that matter)""" start="00:06:00.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in a Jupyter Notebook.""" start="00:06:02.800" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""However, we have a challenge here.""" start="00:06:04.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""We have three text areas open – three code cells.""" start="00:06:05.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So if we click on the GhostText icon,""" start="00:06:09.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""these three areas will show up in green""" start="00:06:14.760" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we'll be prompted to select the one""" start="00:06:17.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that we want to activate.""" start="00:06:19.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""We want to activate the one with text.""" start="00:06:20.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So then we can go in here and make edits, of course,""" start="00:06:22.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and you can do this in Emacs""" start="00:06:31.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""or we can do it in the browser. It doesn't matter.""" start="00:06:33.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""You saw me editing in Emacs,""" start="00:06:35.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""but we can also make the edits""" start="00:06:38.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in the text area of the browser""" start="00:06:40.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and they will show up immediately in Emacs.""" start="00:06:44.880" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So we could change the case of that M and that's going to –""" start="00:06:47.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""shows up over here. Okay, we can run this code.""" start="00:06:54.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So this is R, one of the three major""" start="00:06:59.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""programming languages for data science.""" start="00:07:03.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""At least, Jupyter is supposed to be""" start="00:07:05.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""a combination of Julia, Python, and R.""" start="00:07:07.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So we're running mcmc to get the posterior distribution""" start="00:07:13.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we're going to plot those out with this pyplots package,""" start="00:07:17.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we have these beautiful plots showing the median""" start="00:07:21.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""of the posterior distribution for four variables in –""" start="00:07:24.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""four parameters in the CARS data set,""" start="00:07:27.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""which is available – built into the R package.""" start="00:07:31.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then these shaded areas are the 80% interval.""" start="00:07:38.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Okay. Oops.""" start="00:07:45.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So now for the Python side,""" start="00:07:49.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""here's an example in which I'm going to actually""" start="00:08:07.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""insert a snippet of that cell""" start="00:08:13.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and then I'm going to enter nvlig for nglview ligand,""" start="00:08:18.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and just hit enter. Oops. Hit TAB, excuse me,""" start="00:08:27.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we don't need this line of code, so delete that.""" start="00:08:43.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Yep, we want to load up this pdb file""" start="00:08:48.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that's in this subdirectory.""" start="00:08:52.200" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So the pdb file is a plain text file""" start="00:08:54.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that contains atomic coordinates""" start="00:08:56.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""of protein crystal structure.""" start="00:08:58.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This protein happens to be important in cancer""" start="00:09:00.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we have – we screened by docking 55,000 compounds""" start="00:09:03.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""on a supercomputer""" start="00:09:09.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and then we did MD [molecular dynamics] simulations""" start="00:09:10.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""of the top 10 [actually 20] leads.""" start="00:09:12.744" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Twelve of them had the compound remain bound""" start="00:09:14.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""during the period of the simulation,""" start="00:09:18.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""so those have some potential for –""" start="00:09:19.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and require experimental validation.""" start="00:09:22.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So we'll run this chunk of code,""" start="00:09:25.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and this will give a view of the molecule""" start="00:09:28.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""that we can interact with by using the mouse.""" start="00:09:30.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""But I want to share this with my colleague.""" start="00:09:36.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""My colleague is not set up to use Jupyter,""" start="00:09:39.880" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""but instead we can write this out to a HTML file,""" start="00:09:42.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""which I have loaded up already.""" start="00:09:46.960" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And so we can actually – perhaps.""" start="00:09:48.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""We click on these two arrows pointing at each other,""" start="00:09:55.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we can get a full screen view of this molecule""" start="00:10:01.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and he can identify each atom in this structure.""" start="00:10:05.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Over a thousand atoms present.""" start="00:10:10.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""We're just hovering over a specific atom.""" start="00:10:12.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So shown in gray is the ligand that is bound. Okay.""" start="00:10:14.960" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So we still have this box selected""" start="00:10:27.760" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and we still have these two different –""" start="00:10:32.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""so for each of the – our selected text areas""" start="00:10:36.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""we have a separate – we have a separate buffer open. Okay.""" start="00:10:40.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""To wrap things up here, here's an example of using –""" start="00:11:03.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""with evolving Julia code.""" start="00:11:06.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And so this Julia code in this cell is in a Emacs buffer.""" start="00:11:08.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""So you've got an idea now, I think.""" start="00:11:12.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So in terms of plain text areas like in Overleaf""" start="00:11:19.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and then these cells in Jupyter Notebooks,""" start="00:11:23.760" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""these are other areas that can be edited""" start="00:11:27.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""like in the text areas within Outlook Webmail and Gmail.""" start="00:11:30.960" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Instead of having to point with the mouse""" start="00:11:37.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""or click with the mouse,""" start="00:11:42.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""one can also use keybindings or keyboard shortcuts.""" start="00:11:43.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So here are the ones for three major operating systems.""" start="00:11:48.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So how does GhostText work?""" start="00:11:51.600" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Main thing is you have to open up Emacs""" start="00:11:54.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and get this Atomic Chrome server running.""" start="00:11:57.200" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""And then with it up and going,""" start="00:11:59.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""GhostText will be able to – has to be activated""" start="00:12:03.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and it will find the GhostText server""" start="00:12:06.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""through the localhost port 4001.""" start="00:12:09.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Put that into the web browser.""" start="00:12:15.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""If you navigate to that port,""" start="00:12:19.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""you'll get output that looks like this""" start="00:12:21.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""if everything's working well.""" start="00:12:23.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Otherwise, you'll get a error message""" start="00:12:25.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and it should have a port socket –""" start="00:12:27.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""a web socket port number.""" start="00:12:30.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""It will not be the same every time.""" start="00:12:34.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So these are the supported web browsers""" start="00:12:36.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in addition to Chrome. These are supported""" start="00:12:42.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""and likewise anything in these –""" start="00:12:45.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""any browser related to these""" start="00:12:47.280" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""can probably use these extensions.""" start="00:12:49.880" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""For example, the Brave browser will use Chrome extension""" start="00:12:53.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and the Firefox browser extension works with WaterFox.""" start="00:12:56.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""These are the supported editors.""" start="00:13:01.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Each editor has its own extension""" start="00:13:05.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and this GhostText was initially developed for SublimeText.""" start="00:13:10.200" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So if you have SublimeText,""" start="00:13:15.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""then you can use its smooth operation as positive control""" start="00:13:17.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""when things go wrong with Emacs.""" start="00:13:21.960" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This is Atomic. This is a GitHub site for Atomic Chrome.""" start="00:13:25.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Atomic Chrome is available for installation through Melpa.""" start="00:13:29.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""This is my configuration for Atomic Chrome.""" start="00:13:33.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I have this setup so the server starts whenever I log in,""" start="00:13:40.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and I have it set up so that default major mode is Python""" start="00:13:45.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""to deal with the Jupyter notebooks and Colab notebooks.""" start="00:13:50.320" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then I have major modes""" start="00:13:55.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""for these other websites defined below.""" start="00:13:57.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This is a testing site so the developer has made""" start="00:13:59.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""to help with troubleshooting.""" start="00:14:06.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""He also has a protocol on his website""" start="00:14:08.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""to follow during troubleshooting.""" start="00:14:11.160" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So here are some precautions.""" start="00:14:13.560" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""You'll find that GhostText doesn't work with Pluto.""" start="00:14:16.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Pluto is a new computational notebook""" start="00:14:19.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""for working with Julia.""" start="00:14:21.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""My suggestion would be just to run IJulia in Jupyter.""" start="00:14:23.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""It also doesn't work, of course, with RStudio.""" start="00:14:27.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Even though RStudio sort of resembles""" start="00:14:32.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""a web page, web browser, it's not.""" start="00:14:35.200" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Of course, you can always run R,""" start="00:14:39.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""as you've just seen, using the IPy kernel.""" start="00:14:41.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I will also caution you that if you use the Emacs server,""" start="00:14:48.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""you may run into issues""" start="00:14:52.240" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""with the server competing with the port 4001.""" start="00:14:53.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So instead, you should probably configure the Emacs server""" start="00:14:58.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""to use a specific port.""" start="00:15:01.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So far – although I haven't done that myself –""" start="00:15:05.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""so far, I haven't found any conflicts""" start="00:15:07.640" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""with the Org Roam user interface.""" start="00:15:11.000" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So my conclusions are: GhostText allows you to edit prose""" start="00:15:13.480" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""with your favorite major mode""" start="00:15:20.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""in the text areas of web pages""" start="00:15:24.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and in the cells of Jupyter notebooks.""" start="00:15:28.120" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""This allows you to tap into snippets""" start="00:15:31.080" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and thereby save time as you have – probably have –""" start="00:15:34.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""hopefully got an idea of.""" start="00:15:37.520" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I'd like to thank my friends and mentors""" start="00:15:39.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""who've helped me out during my second year""" start="00:15:44.040" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""in my Emacs learning spiral.""" start="00:15:46.600" video="mainVideo-jupyter" id="subtitle"]]
+[[!template new="1" text="""These include my local colleagues.""" start="00:15:49.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""We meet once a month in the Oklahoma Data Science Workshop.""" start="00:15:55.840" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Last July, I gave a presentation about GhostText.""" start="00:15:58.680" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""And then also my friends at Berlin and Austin Emacs meetups""" start="00:16:01.720" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""and in the UK research software engineer""" start="00:16:08.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Emacs research Slack channel.""" start="00:16:12.960" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""So I don't attend these every month,""" start="00:16:17.600" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""but I try to make the meetings as often as I can.""" start="00:16:18.920" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""Then I'm supported by the following grants,""" start="00:16:21.440" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""which allow me to spend""" start="00:16:25.400" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""at least some time each day in Emacs.""" start="00:16:28.360" video="mainVideo-jupyter" id="subtitle"]]
+[[!template text="""I'll be happy to take any questions.""" start="00:16:30.680" video="mainVideo-jupyter" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [Blaine-Mooers@ouhsc.edu](mailto:Blaine-Mooers@ouhsc.edu?subject=Comment%20for%20EmacsConf%202022%20jupyter%3A%20Edit%20live%20Jupyter%20notebook%20cells%20with%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/jupyter-before.md b/2022/info/jupyter-before.md
new file mode 100644
index 00000000..f64c7d85
--- /dev/null
+++ b/2022/info/jupyter-before.md
@@ -0,0 +1,52 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Blaine Mooers shows how to use GhostText and Atomic Chrome to edit Jupyter notebook cells and other text areas within Emacs. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="jupyter">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect stroke-width="3" x="635" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 18-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-jupyter>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T20:45:00Z" end="2022-12-03T21:05:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~3:45 PM - 4:05 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~2:45 PM - 3:05 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~1:45 PM - 2:05 PM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~12:45 PM - 1:05 PM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~8:45 PM - 9:05 PM UTC <br />Saturday, Dec 3 2022, ~9:45 PM - 10:05 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~10:45 PM - 11:05 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~2:15 AM - 2:35 AM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~4:45 AM - 5:05 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~5:45 AM - 6:05 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="jupyter-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="jupyter-mainVideo" data="""
+00:00.000 Introduction
+00:51.520 GhostText and Atomic Chrome
+01:26.920 GhostText
+03:13.120 Live coding demo
+05:57.040 Editing code cells
+07:57.160 Python
+11:11.040 Julia
+11:59.600 How does GhostText work?
+12:44.320 Supported web browsers
+13:33.000 Atomic Chrome configuration
+14:21.560 Precautions
+15:21.480 Conclusions
+15:48.560 Thanks
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.webm">Download --main.webm (62MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.opus">Download --main.opus (8.4MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--slides.pdf">Download --slides.pdf (2MB)</a></li><li><a href="https://toobnix.org/w/3umjDWcUmHoypvBnzw7dTQ">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="jupyter-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="jupyter-qanda" data="""
+01:00.520 Do you have a favorite color theme?
+01:54.360 To your knowledge, are recent coming security changes in Chrome going to impact browser extensions?
+03:07.960 Is this browser-agnostic, or do you have to use Chrome?
+03:47.580 You mentioned a couple other solutions to allow emacs editing of text areas. Pointers?
+05:49.520 Why not save text from Emacs?
+08:03.320 Have you been talking with John Kitchin?
+10:06.160 Journey
+11:37.560 What was the keybinding for Linux Firefox?
+12:44.960 How long have you been using Emacs?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="jupyter-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.webm">Download --answers.webm (34MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--answers.opus">Download --answers.opus (5MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/jupyter-nav.md b/2022/info/jupyter-nav.md
new file mode 100644
index 00000000..bef304bc
--- /dev/null
+++ b/2022/info/jupyter-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/eev">Bidirectional links with eev</a>
+Next by track: <a href="/2022/talks/haskell">Haskell code exploration with Emacs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/justl-after.md b/2022/info/justl-after.md
new file mode 100644
index 00000000..25ce11e8
--- /dev/null
+++ b/2022/info/justl-after.md
@@ -0,0 +1,290 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="justl-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hi everyone, I am Sibi Prabakaran""" start="00:00:00.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and welcome to my session on Justl Emacs Mode.""" start="00:00:04.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""A bit about me, I have been working""" start="00:00:09.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as a Haskell Engineer""" start="00:00:11.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""at FPComplete for the last 4 years.""" start="00:00:12.880" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I am based out of India.""" start="00:00:15.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I occasionally blog at my website psibi.in""" start="00:00:17.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""where you can find more information about me.""" start="00:00:20.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I have been using Emacs""" start="00:00:23.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for more than a decade now.""" start="00:00:25.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I help in the maintenance""" start="00:00:26.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of the Terraform client for LSP mode.""" start="00:00:28.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I have also authored dhall-mode and rego-mode""" start="00:00:31.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which are the major modes""" start="00:00:33.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for the respective languages.""" start="00:00:35.000" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Before jumping into the demo""" start="00:00:39.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of the Emacs package,""" start="00:00:40.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I would like to give a brief introduction""" start="00:00:42.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""about justfiles and what it is.""" start="00:00:44.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I will also try to compare it with Makefiles""" start="00:00:46.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as it takes a lot of inspiration from it.""" start="00:00:49.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""What you see currently in the buffer""" start="00:00:53.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is a sample justfile.""" start="00:00:55.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""If you have previously used Makefiles,""" start="00:00:57.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you would be able to see""" start="00:00:59.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that there is quite a bit of similarity""" start="00:01:00.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""between them.""" start="00:01:02.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Anything that starts with hash""" start="00:01:03.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is a documentation comment.""" start="00:01:05.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can see that I have the first recipe""" start="00:01:07.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is named as default.""" start="00:01:09.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""So if you run the just executable""" start="00:01:10.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""without any arguments,""" start="00:01:12.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by default it is going to run""" start="00:01:14.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the first recipe.""" start="00:01:15.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This recipe's definition""" start="00:01:17.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""calls the just command""" start="00:01:18.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in turn, with the two arguments,""" start="00:01:20.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""namely --list and --unsorted,""" start="00:01:21.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which basically asks just""" start="00:01:24.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to list down all the recipes""" start="00:01:25.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in an unsorted order.""" start="00:01:27.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Each line of each recipe is executed""" start="00:01:29.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by a fresh shell.""" start="00:01:32.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""That pretty much""" start="00:01:33.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is the high level overview""" start="00:01:35.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of getting started to use this tool.""" start="00:01:36.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This tool assumes the presence of a shell""" start="00:01:38.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is bash in most GNU/Linux systems,""" start="00:01:40.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but you can configure it""" start="00:01:43.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to explicitly use any specific shell""" start="00:01:44.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you have in mind.""" start="00:01:47.160" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Let me in fact go and try executing""" start="00:01:48.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the first recipe.""" start="00:01:50.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I will first execute it""" start="00:01:52.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""without any arguments,""" start="00:01:53.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which will force it to run the first recipe.""" start="00:01:55.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see, it listed all the recipes.""" start="00:01:59.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now I can actually execute""" start="00:02:01.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a particular recipe""" start="00:02:03.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by passing an explicit recipe name.""" start="00:02:04.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me execute the hello recipe now""" start="00:02:06.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which will basically print &quot;hello world&quot;.""" start="00:02:08.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""It works as expected.""" start="00:02:11.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see, that's all that's required""" start="00:02:15.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to get started with this tool.""" start="00:02:17.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You create a file named justfile""" start="00:02:18.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in a directory, define some recipes""" start="00:02:20.349" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and then run them""" start="00:02:22.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""via the just executable.""" start="00:02:23.640" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Note that there are""" start="00:02:27.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""various other features in justfile.""" start="00:02:28.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can define variables,""" start="00:02:30.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""mark some variables""" start="00:02:32.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to be exported as environment variables,""" start="00:02:33.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""have optional parameters""" start="00:02:35.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that can be passed to a recipe.""" start="00:02:37.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can also set up dependency""" start="00:02:38.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""between recipes""" start="00:02:40.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and also write scripts within a recipe""" start="00:02:42.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in a language of your choice.""" start="00:02:44.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I won't be going into the details,""" start="00:02:46.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but I encourage you to go through""" start="00:02:48.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the very helpful manual page""" start="00:02:50.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to learn more about it.""" start="00:02:51.640" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Also, let me compare it with Makefiles.""" start="00:02:56.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I do think it's kind of unfair""" start="00:02:59.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to compare both the tools""" start="00:03:00.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""since make is a build automation tool""" start="00:03:02.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""whereas just's goal is a task runner,""" start="00:03:04.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and since just doesn't try to be""" start="00:03:07.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a build system,""" start="00:03:09.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it can avoid the associated complexity""" start="00:03:10.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that comes with the tool like make.""" start="00:03:12.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""There is one nice historical fact""" start="00:03:15.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""about just.""" start="00:03:17.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The initial version of just""" start="00:03:18.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""relied on make command being available,""" start="00:03:19.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""so it was basically""" start="00:03:21.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a glorified wrapper around it.""" start="00:03:23.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""But it was removed,""" start="00:03:25.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and justfile doesn't have""" start="00:03:26.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that dependency anymore.""" start="00:03:27.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""If you are using make as a task runner""" start="00:03:29.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""then you would have to use""" start="00:03:31.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""something called phony targets.""" start="00:03:33.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I don't want to go into the details,""" start="00:03:35.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but makefiles have good reason""" start="00:03:37.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for why they need something like that.""" start="00:03:39.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Since justfile is not a build system,""" start="00:03:41.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it doesn't have to deal with them.""" start="00:03:44.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The error message""" start="00:03:45.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and user experience of this tool,""" start="00:03:47.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in my opinion, is better.""" start="00:03:48.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""To show you a concrete example,""" start="00:03:50.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""justfile errors out by default""" start="00:03:52.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""if you have duplicate recipes.""" start="00:03:54.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This is in contrast with make""" start="00:03:56.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""where I believe it prints out""" start="00:03:58.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a warning about it,""" start="00:04:00.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but still executes the target action.""" start="00:04:01.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Justfile also gives you the ability""" start="00:04:03.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to easily create scripts""" start="00:04:06.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""written in any language within a recipe.""" start="00:04:08.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""My personal opinion is that""" start="00:04:10.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""if you are using makefile""" start="00:04:12.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as a task runner,""" start="00:04:14.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you might want to check out justfile""" start="00:04:15.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to see if it will suit your workflow.""" start="00:04:17.440" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""With that, I'll move on to justl.el,""" start="00:04:19.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is basically an Emacs package""" start="00:04:25.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for driving justfiles.""" start="00:04:26.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I started writing this tool""" start="00:04:28.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""around a year ago""" start="00:04:29.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""when my usage of justfile increased.""" start="00:04:31.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The objective of the tool""" start="00:04:33.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is to reduce the usage of the CLI""" start="00:04:35.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and drive the execution of the recipes""" start="00:04:37.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""natively within the editor.""" start="00:04:40.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me take you back to the justfile""" start="00:04:41.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which we saw previously.""" start="00:04:44.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This time we will drive it""" start="00:04:45.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""within the editor itself,""" start="00:04:47.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""instead of executing commands via vterm""" start="00:04:48.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as done previously.""" start="00:04:51.400" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""So the idea is you either""" start="00:04:52.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""open the justfile,""" start="00:04:54.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""or any other file in the directory.""" start="00:04:56.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""That doesn't matter, actually.""" start="00:04:57.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Once you do that,""" start="00:04:59.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you call the justl command.""" start="00:05:00.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now as you can see, it lists down""" start="00:05:02.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""all the recipes,""" start="00:05:06.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""along with the description if present.""" start="00:05:07.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can move on to different recipes""" start="00:05:09.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by your usual keybinding.""" start="00:05:11.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""And for executing a specific recipe,""" start="00:05:13.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you have to press the e keybinding,""" start="00:05:15.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and that will run the recipe""" start="00:05:18.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and show its output""" start="00:05:19.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""on a special buffer named *just*""" start="00:05:21.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is built on top of""" start="00:05:23.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the compilation mode available in Emacs.""" start="00:05:25.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me actually try""" start="00:05:27.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""executing the hello recipe""" start="00:05:28.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which we previously executed in vterm.""" start="00:05:30.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see,""" start="00:05:32.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it executed the recipe""" start="00:05:38.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and the &quot;hello world&quot; output""" start="00:05:39.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is visible in the just buffer.""" start="00:05:41.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can also see that there is""" start="00:05:42.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""other metadata like""" start="00:05:44.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""when it started executing""" start="00:05:45.880" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and when did it finish executing.""" start="00:05:47.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""If a recipe execution fails,""" start="00:05:49.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it will also change the color""" start="00:05:51.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and print the corresponding exit code.""" start="00:05:53.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me actually show you""" start="00:05:55.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by modifying the hello recipe""" start="00:05:57.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and making it exit.""" start="00:05:59.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see,""" start="00:06:03.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it clearly indicates the error message now.""" start="00:06:08.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""That is a pretty much""" start="00:06:10.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a good high level overview""" start="00:06:12.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of how to execute recipes""" start="00:06:14.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""using this Emacs extension.""" start="00:06:15.680" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""If I press the h or the ? key,""" start="00:06:17.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it will display the various ways""" start="00:06:21.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to drive it.""" start="00:06:23.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now as you can see,""" start="00:06:24.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you can pass various options to it.""" start="00:06:27.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I find the dry run option effective""" start="00:06:29.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""whenever I have to print the recipe contents""" start="00:06:31.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""without actually executing the recipe.""" start="00:06:34.560" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""There are also various ways to execute it.""" start="00:06:36.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can use Emacs's eshell to execute it""" start="00:06:39.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by pressing the E keybinding.""" start="00:06:42.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me try executing the hello recipe again,""" start="00:06:45.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but this time via Emacs's eshell.""" start="00:06:48.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see now I have an eshell instance""" start="00:06:50.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""where it executed the just hello recipe.""" start="00:06:54.840" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""You can also directly""" start="00:06:57.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""go to the recipe line""" start="00:07:02.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by pressing the return key.""" start="00:07:03.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""So let's say if I want to""" start="00:07:05.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""go to the recipe build app""" start="00:07:08.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""all I have to do is press the return key""" start="00:07:09.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and it will go to the just file""" start="00:07:12.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""with the proper line.""" start="00:07:14.400" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""You can also re-execute the same recipe""" start="00:07:15.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""from the output just buffer.""" start="00:07:19.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I find this very helpful""" start="00:07:21.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""when iterating on certain things.""" start="00:07:23.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""In my day job,""" start="00:07:25.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I often have to work with a Kubernetes cluster,""" start="00:07:26.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and I would have to write""" start="00:07:29.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""resource manifest files for applications.""" start="00:07:30.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Having the ability to run the recipes""" start="00:07:33.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""while iterating on the project""" start="00:07:36.377" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is very useful, in my opinion.""" start="00:07:37.943" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Let me actually show you""" start="00:07:39.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""an example of what I am talking about.""" start="00:07:42.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me run the build app recipe now,""" start="00:07:43.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which will basically build the manifest""" start="00:07:46.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and print it out.""" start="00:07:48.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now let me open one of the application files.""" start="00:07:49.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I will open the ingress.yaml file.""" start="00:07:58.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""So I have this YAML file which I am working on,""" start="00:07:59.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and I also have this output buffer""" start="00:08:06.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is basically the output""" start="00:08:08.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of the build app recipe.""" start="00:08:10.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now I can basically go through this buffer""" start="00:08:11.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and see if everything is alright,""" start="00:08:14.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but I find out that I didn't want""" start="00:08:18.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the hostname to be emacs2022.""" start="00:08:21.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I wanted it to be just emacs.""" start="00:08:23.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I can go and fix it in my YAML file,""" start="00:08:25.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and then I can go on""" start="00:08:29.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to the output buffer""" start="00:08:34.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and basically just re-run the command""" start="00:08:36.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by pressing the g key binding.""" start="00:08:38.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see,""" start="00:08:40.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it executed the same recipe again,""" start="00:08:42.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and I can see that""" start="00:08:48.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the hostname is indeed emacs.""" start="00:08:49.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I find this kind of workflow very convenient""" start="00:08:51.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""while I am working on a project.""" start="00:08:55.000" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Another way of interacting""" start="00:08:56.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""with the justl extension""" start="00:08:59.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is by using the interactive function""" start="00:09:00.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""justl-exec-recipe-in-dir.""" start="00:09:02.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The use case of this function""" start="00:09:04.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is executing a one-off recipe""" start="00:09:06.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""while you are working on something else.""" start="00:09:07.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me show you an example of it.""" start="00:09:09.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see, it shows me""" start="00:09:11.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a drop down of various recipes""" start="00:09:19.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""available in the justfile.""" start="00:09:21.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can choose any particular one""" start="00:09:22.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and execute the corresponding recipe.""" start="00:09:24.880" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""In this case, I will choose""" start="00:09:26.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the build-app recipe,""" start="00:09:28.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and we will get the output""" start="00:09:29.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in the *just* buffer""" start="00:09:31.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which should be similar""" start="00:09:32.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to what we saw previously.""" start="00:09:33.200" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""So this was a quick introduction""" start="00:09:34.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to what justfile is""" start="00:09:43.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and how to drive them within Emacs.""" start="00:09:45.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Hopefully it was helpful""" start="00:09:46.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and it would encourage you""" start="00:09:48.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to use justfiles in your workflow.""" start="00:09:50.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Thank you for allowing me to present.""" start="00:09:51.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I am available in IRC""" start="00:09:53.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""if you have any questions.""" start="00:09:55.480" video="mainVideo-justl" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [psibi2000@gmail.com](mailto:psibi2000@gmail.com?subject=Comment%20for%20EmacsConf%202022%20justl%3A%20justl%3A%20Driving%20recipes%20within%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/justl-before.md b/2022/info/justl-before.md
new file mode 100644
index 00000000..584be749
--- /dev/null
+++ b/2022/info/justl-before.md
@@ -0,0 +1,22 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Sibi Prabakaran shares how to use justl to run justfile tasks from inside Emacs, including a comparison with Makefiles. Afterwards, he will handle questions over IRC.
+
+<div class="vid"><video controls preload="none" id="justl-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="justl-mainVideo" data="""
+00:00.000 Introduction
+00:39.320 Justfiles
+01:48.520 Executing recipes
+02:27.680 Other features
+02:56.440 Comparison with Makefiles
+04:19.280 justl.el
+04:52.400 Executing recipes in Emacs
+06:17.280 Options
+06:36.600 Eshell
+06:57.320 Going to the recipe line
+07:15.520 Re-executing recipes
+07:39.560 Example
+08:56.600 justl-exec-recipe-in-dir
+09:34.680 End
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.webm">Download --main.webm (52MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--slides.pdf">Download --slides.pdf</a></li><li><a href="https://toobnix.org/w/tonDBKQYxzZMXQhreMpoca">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/justl-nav.md b/2022/info/justl-nav.md
new file mode 100644
index 00000000..57ceda4b
--- /dev/null
+++ b/2022/info/justl-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/orgsuperlinks">Linking headings with org-super-links (poor-man's Zettelkasten)</a>
+Next by track: <a href="/2022/talks/orgvm">orgvm: a simple HTTP server for org</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/links-after.md b/2022/info/links-after.md
new file mode 100644
index 00000000..12818346
--- /dev/null
+++ b/2022/info/links-after.md
@@ -0,0 +1,5 @@
+<!-- Automatically generated by emacsconf-generate-after-page -->
+
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20links%3A%20Linking%20headings%20with%20org-super-links%20%28poor-man%27s%20Zettelkasten%29)
+<!-- End of emacsconf-generate-after-page -->
diff --git a/2022/info/links-before.md b/2022/info/links-before.md
new file mode 100644
index 00000000..7b781ff6
--- /dev/null
+++ b/2022/info/links-before.md
@@ -0,0 +1,2 @@
+<!-- Automatically generated by emacsconf-generate-before-page -->
+<!-- End of emacsconf-generate-before-page --> \ No newline at end of file
diff --git a/2022/info/links-nav.md b/2022/info/links-nav.md
new file mode 100644
index 00000000..66faaeb3
--- /dev/null
+++ b/2022/info/links-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/rolodex">Build a Zettelkasten with the Hyperbole Rolodex</a>
+Next by track: <a href="/2022/talks/buttons">Linking personal info with Hyperbole implicit buttons</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/localizing-after.md b/2022/info/localizing-after.md
new file mode 100644
index 00000000..bd8b2bbf
--- /dev/null
+++ b/2022/info/localizing-after.md
@@ -0,0 +1,248 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="localizing-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Hello everyone, I am Jean-Christophe Helary,""" start="00:00:00.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I live in Japan, and I'm a translator.""" start="00:00:05.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here is my second presentation on this very""" start="00:00:09.680" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""prestigious stage that is the Emacs conference.""" start="00:00:12.633" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Following my &quot;Let's Translate the 2 million words""" start="00:00:15.300" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""in the Emacs manual&quot; in 2021, my topic this year,""" start="00:00:18.367" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""always related to translation, is""" start="00:00:21.767" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""pre-localizing Emacs or much less pretentiously,""" start="00:00:25.167" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;Just make sure that your strings don't mix up plurals&quot;.""" start="00:00:28.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, for some reason I resumed Emacs use""" start="00:00:31.933" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""around 2016, and as I was rediscovering the thing""" start="00:00:36.133" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I found really old outline-mode files here""" start="00:00:39.940" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and there on my machine.""" start="00:00:42.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And I started to experiment""" start="00:00:44.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""again and write again with Emacs.""" start="00:00:45.140" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I think that at the time,""" start="00:00:47.167" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I was coming from Aquamacs and because of""" start="00:00:48.564" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""an integration bug with macOS, I decided""" start="00:00:50.433" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to check what was going on in the code.""" start="00:00:53.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""That was my first official contribution.""" start="00:00:55.440" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So as I was happily installing and uninstalling""" start="00:00:59.040" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""things, I noticed something weird one day.""" start="00:01:02.233" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Let me enlarge that picture.""" start="00:01:05.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""See? And even if I were not a translator,""" start="00:01:09.080" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I would not like that string, and obviously""" start="00:01:12.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""the same bug bites you when the string""" start="00:01:14.960" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""tells you to erase the package.""" start="00:01:16.833" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Boom, so we agree that we have a problem here.""" start="00:01:20.520" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, I started to do some spelunking into the code,""" start="00:01:26.720" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and at least that was my feeling""" start="00:01:29.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""because I really am not a programmer""" start="00:01:31.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""by any stretch of the imagination.""" start="00:01:33.100" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And what I found was an amazing piece of""" start="00:01:37.240" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""natural language engineering that was mixing code""" start="00:01:39.467" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""with English suffixes and all that,""" start="00:01:41.840" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and I could see that the people who had""" start="00:01:44.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""written that code were pretty smart,""" start="00:01:46.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""but had missed a number of edge cases""" start="00:01:47.767" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that produced the above bugs.""" start="00:01:49.533" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""That was my first experience with""" start="00:01:51.280" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""all the message related functions,""" start="00:01:53.500" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;format&quot;, &quot;concat&quot;, &quot;message&quot;, etc.""" start="00:01:55.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""But even with my beginner's eyes I could see that""" start="00:01:58.360" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""something was off because when you want""" start="00:02:00.433" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to produce natural language strings you never ever""" start="00:02:03.040" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""should use &quot;replace-regex-in-string&quot; to""" start="00:02:06.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""add an &quot;ing&quot; or an &quot;ed&quot; suffix""" start="00:02:08.600" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to change the mode of a sentence.""" start="00:02:11.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""But that's what I was seeing was happening.""" start="00:02:12.980" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, what we had to deal with here""" start="00:02:16.840" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""was way more than just a missed plural.""" start="00:02:20.333" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""It was an attempt at engineering all""" start="00:02:22.220" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""the message strings destined to the user""" start="00:02:24.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""with the smart code that was making assumptions""" start="00:02:26.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""on the structure of words,""" start="00:02:28.567" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and in the localization world that's a big no-no.""" start="00:02:30.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I'm a translator, and such UI strings issues""" start="00:02:33.220" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""have been sorted out decades ago.""" start="00:02:36.667" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So I was a bit shocked.""" start="00:02:38.433" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""The final patch took me about a year to write,""" start="00:02:41.320" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""because I'm slow, because I needed to verify""" start="00:02:43.533" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and understand a lot, because there are""" start="00:02:45.380" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""plenty of rules and plenty of people who are""" start="00:02:47.167" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""explaining you very nicely what the rules are,""" start="00:02:49.100" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""because I have kids, and because the""" start="00:02:51.433" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Emacs development list is such a cool place to be""" start="00:02:53.733" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that you often forget why you're there sometimes.""" start="00:02:55.600" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Anyway, for people who can't click on a video,""" start="00:02:58.560" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and I can't either, here are the relevant""" start="00:03:01.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""parts with some short comments.""" start="00:03:03.640" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I'll be talking with localization in mind,""" start="00:03:05.840" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""knowing full well that Emacs localization""" start="00:03:07.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""is not on the map at the moment.""" start="00:03:09.640" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So first, there is this thing""" start="00:03:12.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""about &quot;format&quot; and &quot;concat&quot;.""" start="00:03:14.167" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And if I remember correctly,""" start="00:03:15.520" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;format&quot; is better for user-facing things,""" start="00:03:17.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and &quot;concat&quot; is better for internal things.""" start="00:03:20.300" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here, there are two things.""" start="00:03:25.160" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""First, a rule that we have when we prepare""" start="00:03:26.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""strings that need to be localized is""" start="00:03:28.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""never ever make assumptions on the way""" start="00:03:30.700" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""numbers are expressed in the language.""" start="00:03:33.333" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here, the assumption is that""" start="00:03:35.780" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""we have either a singular or plural form,""" start="00:03:37.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and that's not always the case.""" start="00:03:40.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""That usually means that you should externalize""" start="00:03:42.040" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""numbers and find a generic way to express them.""" start="00:03:44.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So it makes for slightly less natural""" start="00:03:48.280" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""language strings, but it's better anyway.""" start="00:03:50.833" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Then we have that comma there that's trying""" start="00:03:54.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to be externalized and that's weird,""" start="00:03:56.667" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""so I put it back into the sentence.""" start="00:03:58.167" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here we have another construct, or two rather,""" start="00:04:02.620" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that really should not be used like this.""" start="00:04:04.967" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""It's &quot;prin1&quot; that uses quoting characters,""" start="00:04:06.960" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""just like &quot;print&quot;, and &quot;princ&quot; that does not.""" start="00:04:10.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And you see why they were combined together.""" start="00:04:12.480" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And they were both trying to be really smart""" start="00:04:15.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""about which article to put in front of a vowel.""" start="00:04:17.133" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And you just don't do that.""" start="00:04:19.780" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""You just keep things simple.""" start="00:04:20.960" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here again, the code is trying to be smart,""" start="00:04:25.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""but it's really not much more efficient than""" start="00:04:26.633" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""plainly stating what you want.""" start="00:04:28.480" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And here again, we have &quot;concat&quot; things""" start="00:04:34.940" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that we could just use to plainly state""" start="00:04:36.500" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""what we want to state.""" start="00:04:40.367" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, instead of &quot;concat&quot; I just put a &quot;message&quot;.""" start="00:04:41.980" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And here we have something that's very cute.""" start="00:04:49.880" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""It's a computerized plural.""" start="00:04:52.260" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here again, assuming that""" start="00:04:54.540" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""there are only plural or singular forms.""" start="00:04:55.700" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""But the end string is not that much more natural""" start="00:04:58.640" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""than the fix, the code is less efficient""" start="00:05:00.867" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and is harder to understand.""" start="00:05:02.700" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here again, the code is trying to make""" start="00:05:07.760" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""smart things where it could be much simpler.""" start="00:05:09.433" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""That is the part where you get the""" start="00:05:13.520" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""number of packages and their names.""" start="00:05:14.667" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here the whole sentence with the semicolons""" start="00:05:19.480" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and the question mark is split in parts,""" start="00:05:22.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""between which something will be inserted.""" start="00:05:26.333" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""That's really ugly and difficult to read.""" start="00:05:29.180" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Here again, another &quot;ing&quot; waiting to be""" start="00:05:34.240" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""regex-inserted into the code.""" start="00:05:37.700" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And here at last, we get to the point""" start="00:05:44.840" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""where everything started.""" start="00:05:46.633" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And you can see that unlike in the other spots,""" start="00:05:48.760" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""there is no possibility for the expression""" start="00:05:50.833" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to be singular.""" start="00:05:52.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, I guess that if it hadn't been for that bug,""" start="00:05:54.680" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I would not have found the other items,""" start="00:05:57.600" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and we would be left with code that works,""" start="00:05:59.320" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""of course, but that is""" start="00:06:01.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""harder to understand, and maintain.""" start="00:06:02.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Last but not least, a last version of""" start="00:06:06.020" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;just plainly state what you mean to state&quot;.""" start="00:06:08.333" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Keep it simple.""" start="00:06:10.920" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So first, we have this wonderful CONTRIBUTE file""" start="00:06:14.880" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that is very explicit about""" start="00:06:19.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""how we must proceed when contributing code.""" start="00:06:21.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, that's really the first place""" start="00:06:23.520" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that we should all read.""" start="00:06:25.233" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""The README file is pretty cool too,""" start="00:06:27.760" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""especially at the beginning of the process,""" start="00:06:29.333" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""when you're not sure whether""" start="00:06:30.967" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""you want to fix that bug or just report it.""" start="00:06:31.867" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And then we've got packages.""" start="00:06:36.240" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""We've got a number of packages that are really""" start="00:06:37.920" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""helpful when it comes to reading""" start="00:06:39.900" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""the information and the manuals.""" start="00:06:42.600" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I'm mentioning three of them here,""" start="00:06:45.880" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and I think they are the most important for us.""" start="00:06:48.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So &quot;helpful&quot; is on the right,""" start="00:06:53.720" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and it's overflowing the window with""" start="00:06:55.600" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""all the contextualized information it provides,""" start="00:06:58.667" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and the standard &quot;help&quot; is on the left.""" start="00:07:01.900" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I mean, really there are like two or three""" start="00:07:05.280" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""screen-full of information in the &quot;helpful&quot; output,""" start="00:07:07.933" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""so you really only see a part,""" start="00:07:11.567" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""but I guess if you use it, you know what I'm saying.""" start="00:07:13.233" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""What I like the most here is the &quot;view in manual&quot;""" start="00:07:16.320" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""part, where you can actually click and even get""" start="00:07:18.867" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""more information that's sometimes""" start="00:07:21.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""easier to read and understand.""" start="00:07:23.667" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And then you've got the &quot;info&quot; versus &quot;inform&quot; formats.""" start="00:07:28.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""When you're in the manual,""" start="00:07:33.640" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;inform&quot; makes a huge difference.""" start="00:07:34.567" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""You can see here that you've got colorized items,""" start="00:07:37.140" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and also in the middle you've got that""" start="00:07:39.367" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""'read' part that's green and bold.""" start="00:07:42.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""In &quot;info&quot; it's not a specific object,""" start="00:07:45.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""it's just a string. In 'inform' it's actually""" start="00:07:49.333" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""a link that you can click,""" start="00:07:52.200" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and actually go to that 'read' manual page.""" start="00:07:53.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Now, we've got &quot;which-key&quot;.""" start="00:07:58.320" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;which-key&quot; is a savior for beginners too.""" start="00:08:01.300" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Just wait half a second or something,""" start="00:08:03.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and Emacs will show you all the keys""" start="00:08:04.867" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that you can access from the prefix combination""" start="00:08:06.500" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that you just typed.""" start="00:08:08.433" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, it's really helpful for discovering functions""" start="00:08:09.920" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and learning new functions, getting used to them.""" start="00:08:13.200" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And so that whole process started…,""" start="00:08:19.160" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""it was May 23, 2017,""" start="00:08:21.500" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""with that thread when I found the bug.""" start="00:08:26.533" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""I just bumped into an English/code bug""" start="00:08:30.440" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""this morning. In package.el, when one package""" start="00:08:32.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""is not needed anymore, the message is:""" start="00:08:36.920" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;Package menu: Operation finished.""" start="00:08:39.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""1 packages are no longer needed&quot;, etc.""" start="00:08:41.300" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, I was asking whether we had best practices""" start="00:08:44.880" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""for using messages, and we had a whole thread""" start="00:08:49.633" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""about that. And while I was discussing on that""" start="00:08:53.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""thread, I started that new thread, which is:""" start="00:08:57.867" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;package.el strings&quot;.""" start="00:09:01.240" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""The whole thing actually ended on June 27, 2018.""" start="00:09:02.867" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, a year after, with that message from Noam""" start="00:09:09.900" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""telling me that &quot;Yes I can close the bug,&quot;""" start="00:09:15.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and that was it.""" start="00:09:18.567" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, it took about a year to finish that.""" start="00:09:22.040" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""What I did learn basically is that""" start="00:09:24.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""helping with Emacs is not that difficult.""" start="00:09:28.133" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""It takes time when you're not fluent with the code,""" start="00:09:32.160" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""but that's okay because the reference""" start="00:09:36.100" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""is excellent, and there are lots of people""" start="00:09:37.100" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""who are here to help.""" start="00:09:39.300" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Basically, the solution to all our problems is""" start="00:09:41.520" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""&quot;Keep It Simple and Straightforward&quot;.""" start="00:09:45.700" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""As you can see in that patch,""" start="00:09:47.733" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""even if it's a beginner's patch,""" start="00:09:51.033" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""what I did shows what can be done by Emacs Lisp""" start="00:09:53.233" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""beginners to help with &quot;straightening&quot; the strings""" start="00:09:57.733" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to reduce the number of potential English bugs.""" start="00:09:59.533" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And then to make Emacs strings easier""" start="00:10:02.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""to be handled by real localization processes one day.""" start="00:10:04.533" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""But it doesn't have to be about strings""" start="00:10:07.233" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""because strings can be an easy entry point to Emacs,""" start="00:10:09.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""but it can be any itch that you want to scratch.""" start="00:10:12.767" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And my real conclusion is that""" start="00:10:16.720" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Emacs is free software, and what that means is mostly""" start="00:10:18.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""that it allows you to do things that you would""" start="00:10:22.160" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""never have thought of being able to do before.""" start="00:10:24.067" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""That's really the biggest lesson to be learned here.""" start="00:10:27.920" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""So, I want to thank all the people""" start="00:10:32.000" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""who allowed this to be happening, allowed me to""" start="00:10:33.400" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""learn a bit and contribute a bit to that wonderful""" start="00:10:37.920" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""piece of software that Emacs is.""" start="00:10:41.267" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""And thank you everyone for listening,""" start="00:10:42.800" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""and hopefully I'll see you next year""" start="00:10:44.533" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""with a different translation related presentation.""" start="00:10:46.700" video="mainVideo-localizing" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:10:51.520" video="mainVideo-localizing" id="subtitle"]]
+
+
+
+Captioner: jean-christophe
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20localizing%3A%20Pre-localizing%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/localizing-before.md b/2022/info/localizing-before.md
new file mode 100644
index 00000000..91f3f803
--- /dev/null
+++ b/2022/info/localizing-before.md
@@ -0,0 +1,30 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="localizing">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect stroke-width="3" x="658" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 11-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-localizing>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T21:00:00Z" end="2022-12-04T21:10:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~4:00 PM - 4:10 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~3:00 PM - 3:10 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~2:00 PM - 2:10 PM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~1:00 PM - 1:10 PM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~9:00 PM - 9:10 PM UTC <br />Sunday, Dec 4 2022, ~10:00 PM - 10:10 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~11:00 PM - 11:10 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~2:30 AM - 2:40 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~5:00 AM - 5:10 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~6:00 AM - 6:10 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="localizing-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.webm">Download --main.webm (23MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/7E7zo6E6KvrWamsQUxfRuR">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="localizing-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="localizing-qanda" data="""
+06:11.680 Is Emacs localized/localizable?
+10:07.160 You mention regex on strings is a red flag for localization, are there others to look out for?
+13:49.980 So, your project is to localize all of Emacs?
+14:47.325 How deep would usefull localization go? Because at the core of Emacs are docstrings and localizing them could also imply localizing Elisp.
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="localizing-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.webm">Download --answers.webm (36MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-localizing--prelocalizing-emacs--jeanchristophe-helary--answers.opus">Download --answers.opus (6.1MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/localizing-nav.md b/2022/info/localizing-nav.md
new file mode 100644
index 00000000..d2aac021
--- /dev/null
+++ b/2022/info/localizing-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/indieweb">Putting Org Mode on the Indieweb</a>
+Next by track: <a href="/2022/talks/devel">Emacs development updates</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/lspbridge-after.md b/2022/info/lspbridge-after.md
new file mode 100644
index 00000000..848d11a0
--- /dev/null
+++ b/2022/info/lspbridge-after.md
@@ -0,0 +1,332 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="lspbridge-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Good morning folks, I'm Matthew.""" start="00:00:00.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Welcome to another year of EmacsConf.""" start="00:00:04.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""It's looking fantastic this year.""" start="00:00:07.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Firstly, I have to apologize for my voice""" start="00:00:10.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and occasional cough today.""" start="00:00:13.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""I am currently recovering from a cold,""" start="00:00:15.880" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""hopefully it's not Covid or flu,""" start="00:00:18.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so please bear with me today.""" start="00:00:21.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Actually, this talk was supposed to be brought to you""" start="00:00:24.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""by Manatee Lazycat, the author of lsp-bridge.""" start="00:00:27.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""But verbal English isn't Lazycat's strongest skill,""" start="00:00:31.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and we are good friends as we maintain""" start="00:00:36.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the Emacs Application Framework together,""" start="00:00:38.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so here I am today presenting to you this package.""" start="00:00:41.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Welcome to my talk on lsp-bridge:""" start="00:00:46.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""a smooth-as-butter asynchronous LSP client.""" start="00:00:48.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""What is LSP?""" start="00:00:50.321" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The first question is, what is LSP?""" start="00:00:57.201" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""For anyone who doesn't know here,""" start="00:01:01.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP stands for Language Server Protocol,""" start="00:01:03.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it is a set of protocols defined by Microsoft""" start="00:01:06.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that provides smart features like autocomplete,""" start="00:01:09.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""go to definition, documentation, etc.,""" start="00:01:13.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that can be implemented across different editors and IDEs.""" start="00:01:17.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""It was initially created""" start="00:01:23.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for their Visual Studio Code product,""" start="00:01:25.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""then publically shared with everyone.""" start="00:01:28.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""So there are language servers out there""" start="00:01:33.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that implemented this procotol,""" start="00:01:36.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and editors need to implement the same procotols""" start="00:01:38.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to talk to the language servers""" start="00:01:41.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""in order to retrieve necessary information.""" start="00:01:43.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Emacs has 2 LSP clients already, the lsp-mode and eglot,""" start="00:01:46.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""both implemented the protocols and both are very good.""" start="00:01:53.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Now comes to the second question, of course,""" start="00:02:00.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""given lsp-mode and eglot, why another LSP client?""" start="00:02:03.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""I used to use lsp-mode all the time,""" start="00:02:09.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""I have to say I really appreciate Ivan Yonchovski""" start="00:02:12.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and the team's efforts. Also, I'd like to congratuate eglot""" start="00:02:16.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for making into Emacs 29! These are fantastic packages,""" start="00:02:20.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""they are very mature and robust.""" start="00:02:27.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""However, with all due respect, both of the implementation""" start="00:02:31.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""are fundamentally limited""" start="00:02:35.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""by the single-threaded nature of Emacs,""" start="00:02:36.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it is neither the fault of lsp-mode nor eglot.""" start="00:02:39.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Although in recent years there have been""" start="00:02:46.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""improvements to Emacs core such as native JSON support,""" start="00:02:47.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""there are still scenarios where Emacs clog""" start="00:02:51.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for a brief second when processing large amounts of data,""" start="00:02:55.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""as Emacs is processing everything in the single thread.""" start="00:02:59.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""This problem is especially apparent in some LSP servers""" start="00:03:03.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that feeds in tens of thousands of JSON data""" start="00:03:08.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""with every single key press.""" start="00:03:11.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Additionally, the large amount of data""" start="00:03:15.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""sent by the LSP server, such as the completion candidates,""" start="00:03:17.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the diagnostics and documentation,""" start="00:03:21.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""they are temporarily stored in the Emacs memory,""" start="00:03:23.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""which will trigger garbage collection very frequently,""" start="00:03:27.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""this also causes stuttering user experience.""" start="00:03:31.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Increasing the gc-cons-threshold helps,""" start="00:03:34.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""but doesn't eliminate the problem.""" start="00:03:37.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""For something like the LSP,""" start="00:03:43.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the language servers need time to compute,""" start="00:03:45.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and Emacs needs capacity to process and filter""" start="00:03:48.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""all the data coming from the language servers.""" start="00:03:52.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""A large codebase project with a slow language server""" start="00:03:55.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that sends tens of thousands of JSON""" start="00:03:59.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""will significantly increase the time needed to process it,""" start="00:04:02.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""when we don't have a multi-thread,""" start="00:04:06.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the single thread originally allocated for perhaps,""" start="00:04:08.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""handling user input will be used to process all the data,""" start="00:04:12.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and don't even talk about the garbage collection along the way.""" start="00:04:17.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The unfortunate truth is that the size of the codebase""" start="00:04:22.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and the efficiency of the language server""" start="00:04:26.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""is completely out of Emacs' control,""" start="00:04:28.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it is also out of both the lsp-mode and eglot's control.""" start="00:04:31.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""If there's an LSP client""" start="00:04:38.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that can completely eliminate stuttering""" start="00:04:40.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and provide a seamless feedback,""" start="00:04:42.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that would be great, isn't it?""" start="00:04:45.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""However, we're vaguely talking about speed right now,""" start="00:04:50.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""what is considered fast?""" start="00:04:53.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""What is considered seamless?""" start="00:04:56.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""What we really mean when we say""" start="00:04:58.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the current LSP implementation is slow?""" start="00:05:01.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Let's first look at the problem fundamentally.""" start="00:05:05.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""We interact with Emacs through a keyboard,""" start="00:05:12.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so what we perceive as a fast and smooth feedback""" start="00:05:17.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""completely depends on how long it takes""" start="00:05:22.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for a keyboard input to display on the Emacs buffer.""" start="00:05:26.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""From a pure graphical perspective,""" start="00:05:29.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""we need a minimum of 24 frames per second,""" start="00:05:32.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the standard in the media industry,""" start="00:05:36.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for us humans to perceive something as seamless.""" start="00:05:39.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Say we need 25 frames per second, this means,""" start="00:05:42.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""if we divide 1000 milliseconds by 25,""" start="00:05:47.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""we only have approximately 40 millisecond window""" start="00:05:50.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for the response time to spare.""" start="00:05:54.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Even if we relax the constraint a bit more,""" start="00:05:57.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""on average a typist takes about 100 to 200 milliseconds""" start="00:06:01.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""between typing each character,""" start="00:06:06.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so as long as we see a response within this timeframe,""" start="00:06:09.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it is tolerable. However, using a slow language server""" start="00:06:12.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""on a large codebase easily exceeds""" start="00:06:19.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the hundred millisecond mark,""" start="00:06:22.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and sometimes takes more than 200 milliseconds,""" start="00:06:24.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and inevitably will cause an inconsistent delay""" start="00:06:27.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for the end user.""" start="00:06:32.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""At this point, someone might want to point out""" start="00:06:33.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that nobody is gonna type at the maximum pace all the time.""" start="00:06:37.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""That's right, frankly speaking most of my time""" start="00:06:41.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""spent at programming is not writing code,""" start="00:06:45.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""but staring at the screen""" start="00:06:47.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""thinking about how to write the code.""" start="00:06:49.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""However, when we do actually type,""" start="00:06:51.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""maybe only a sentence, a variable name, a keyword,""" start="00:06:55.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""or just performing keybinding shortcuts,""" start="00:07:00.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that's when we want to see our input feedback immediately.""" start="00:07:03.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""We've already spend so much time""" start="00:07:08.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""thinking about how to write,""" start="00:07:10.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""we don't want to waste any more time waiting for Emacs""" start="00:07:12.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to process and show us what we've written""" start="00:07:16.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""half a second ago. Otherwise the frustration will build up.""" start="00:07:19.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""In the past two years of EmacsConf, I've talked about""" start="00:07:28.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the Emacs Application Framework, a project that extended""" start="00:07:32.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Emacs Lisp to Python, Qt and JavaScript ecosystems.""" start="00:07:35.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The EAF project specializes in improving""" start="00:07:39.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the graphical and multimedia capabilities of Emacs""" start="00:07:43.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""through other languages, it was a great success.""" start="00:07:47.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""It demonstrated the endless possibilities of Emacs""" start="00:07:51.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""by embracing the strengths in other ecosystems.""" start="00:07:55.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""If anyone is interested for more information on EAF,""" start="00:08:00.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""please see the EAF repo and refer to my talks""" start="00:08:04.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""from EmacsConf2020 and 2021.""" start="00:08:08.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:08:12.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The EAF project was created by Manatee Lazycat as well,""" start="00:08:12.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so he thought if there is a way to design""" start="00:08:16.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""an LSP client similar to EAF""" start="00:08:20.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that takes the advantage of Python's multi-threading,""" start="00:08:22.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it will be able to solve our problem.""" start="00:08:25.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Conveniently EAF had already done most of the ground work""" start="00:08:27.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and demonstrated the possibility""" start="00:08:32.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""of cooperating Elisp and Python using the Emacs RPC effectively.""" start="00:08:34.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP Bridge has several goals in mind.""" start="00:08:42.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Firstly, performance is the number one priority.""" start="00:08:45.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Secondly, use Python multi-threading to bypass""" start="00:08:50.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the aforementioned bottlenecks of a single-threaded Emacs.""" start="00:08:55.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Thirdly, provide a simple solution that requires""" start="00:08:59.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""minimal setup for someone who just wants to have""" start="00:09:04.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""a fast autocomplete system in Emacs.""" start="00:09:07.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""This means, LSP Bridge does not intend""" start="00:09:10.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and will not implement the entire LSP protocol,""" start="00:09:16.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""which is a vastly different approach""" start="00:09:21.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""than a solution like lsp-mode,""" start="00:09:23.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""we do not want to compete this way.""" start="00:09:25.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""We also believe some of the LSP Protocol features""" start="00:09:28.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""are unnecessary, or we already have better solutions""" start="00:09:33.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""in the Emacs ecosystem,""" start="00:09:37.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""such as tree-sitter for syntax highlighting.""" start="00:09:38.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""So we will not reinvent the wheel.""" start="00:09:42.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Ultimately, we want to provide the fastest, butter-smooth""" start="00:09:44.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and performant LSP client out of the box.""" start="00:09:50.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Design.""" start="00:09:53.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Now let's look at the design architecture diagram.""" start="00:09:54.561" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""As you can see, it is split into""" start="00:10:01.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the top half and bottom half.""" start="00:10:04.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The top is the design for a single file model,""" start="00:10:07.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and the bottom half is for project model.""" start="00:10:10.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""We make this distinction because we don't want a new user""" start="00:10:13.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to be troubled on choosing a project root directory""" start="00:10:18.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""as the first impression to LSP""" start="00:10:22.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""before even start writing code.""" start="00:10:25.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:10:27.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""From a new user's perspective,""" start="00:10:27.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""they've just installed this package,""" start="00:10:30.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and all they are expecting""" start="00:10:32.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""is using a smart autocomplete system,""" start="00:10:35.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""what does root directory even mean in this context?""" start="00:10:37.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""So we make the decision for them""" start="00:10:41.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""based on whether this file is part of a git repository.""" start="00:10:44.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Often times we write code in its own standalone file,""" start="00:10:48.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""this is extremely common for scripting languages""" start="00:10:56.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""like bash or python. So in the single file model,""" start="00:10:59.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP Bridge will start a dedicated LSP server""" start="00:11:03.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for this particular file based on file type,""" start="00:11:07.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and every file corresponds to a LSP server,""" start="00:11:10.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so each server doesn't interfere with one another.""" start="00:11:13.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The project model will have every file of the same type""" start="00:11:17.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""under the same project share one server.""" start="00:11:23.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""We believe this is a positive trade-off for user experience.""" start="00:11:25.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:11:30.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP Bridge internally implemented two main threads,""" start="00:11:30.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""one is the Request Thread, the other is Response Thread.""" start="00:11:36.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The Request Thread is used to handle all the requests""" start="00:11:40.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""coming from Emacs, it does not answer immediately,""" start="00:11:45.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""this is important because Emacs doesn't need to wait""" start="00:11:48.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""for any response under any reason,""" start="00:11:52.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""even if the server is buggy or died out,""" start="00:11:54.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it shouldn't matter to the performance of Emacs.""" start="00:11:58.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The Response Thread is used to handle""" start="00:12:01.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the response coming from LSP servers.""" start="00:12:04.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""After retrieving a response, regardless of the JSON size,""" start="00:12:06.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it sends to its own thread for computation,""" start="00:12:11.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""such as candidate filtering and renaming.""" start="00:12:14.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Once the computation is finished,""" start="00:12:17.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it will determine if this information is expired,""" start="00:12:20.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""if not, then push it to Emacs.""" start="00:12:23.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:12:26.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""From the Emacs side, when it receives the LSP information,""" start="00:12:26.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it only needs to determine the course of action,""" start="00:12:31.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""either popup completion, jump to definition,""" start="00:12:34.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""renaming action, or show references and show documentions.""" start="00:12:39.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""You see, from a user, all LSP Bridge doing""" start="00:12:44.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""is these 5 things, the user doesn't need to care about""" start="00:12:49.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""anything else like the complicated""" start="00:12:52.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Language Server Protocols.""" start="00:12:54.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:12:56.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Python side caches heavy data""" start="00:12:56.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""such as candidate documentation and diagnostics.""" start="00:13:02.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""We process as much server data as possible in Python,""" start="00:13:06.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and only pass to Emacs as little data as possible""" start="00:13:11.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so it doesn't clog the Emacs thread""" start="00:13:15.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and triggers garbage collection.""" start="00:13:18.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:13:19.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""This design is critical, because all Emacs needs to do""" start="00:13:19.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""is sending LSP requests to LSP Bridge,""" start="00:13:24.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it doesn't wait for a response,""" start="00:13:27.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it simply knows what to do *when* there is a response.""" start="00:13:29.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""So the user's input immediately displays on the buffer""" start="00:13:33.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""well within the 40 millisecond window,""" start="00:13:37.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and in the mean time, the user can continue to type""" start="00:13:39.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""if he doesn't need the help from LSP right away,""" start="00:13:45.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it fundamentally resolves the stuttering problem.""" start="00:13:48.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Now I want to talk about acm-mode,""" start="00:13:51.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""which stands for asynchronous completion menu,""" start="00:13:59.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it is a completion framework""" start="00:14:09.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that currently bundled with LSP Bridge""" start="00:14:12.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""designed to accomodate for""" start="00:14:15.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the asynchronous nature of LSP servers.""" start="00:14:17.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""It is a replacement for the built-in capf,""" start="00:14:20.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""short for completion-at-point-functions,""" start="00:14:26.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""used in almost everywhere""" start="00:14:30.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""including company-mode and corfu-mode.""" start="00:14:32.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Yes, we unfortunately reinvented a very fundamental wheel.""" start="00:14:35.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""No, it wasn't an easy decision.""" start="00:14:40.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""However we still believe it's worth it.""" start="00:14:44.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP Bridge initially used company-mode,""" start="00:14:47.880" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""then moved on to corfu-mode for a while,""" start="00:14:53.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""but eventually Lazycat determined""" start="00:14:56.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that it is much more painful to write""" start="00:14:59.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""a lot of workaround code to force LSP Bridge""" start="00:15:00.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to handle capf nicely than to just fork Corfu,""" start="00:15:05.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""remove all the capf code,""" start="00:15:09.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and write a new completion framework from the remainings.""" start="00:15:12.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:15:15.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Performance wise, capf requires Emacs to store""" start="00:15:15.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the entire candidate list""" start="00:15:20.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""when looking up candidate annotations.""" start="00:15:23.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""It needs to search through the entire candidate list first,""" start="00:15:27.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""then use the candidate as a key""" start="00:15:30.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to search for the actual information.""" start="00:15:32.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""This entire process will be repeated every time""" start="00:15:34.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""when drawing the completion menu.""" start="00:15:38.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""This is truly intensive computing task for Emacs to handle.""" start="00:15:40.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""On top of that, the existing capf frameworks assume""" start="00:15:45.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""the candidate list, which is retrieved from the LSP server,""" start="00:15:50.520" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to be ready and finalized in place""" start="00:15:54.280" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""when the completion popup occurred.""" start="00:15:56.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""However given the design of LSP Bridge,""" start="00:15:58.720" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Emacs will not sit there and wait for the server response,""" start="00:16:02.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""instead the Response Thread may feed Emacs data""" start="00:16:05.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""whenever it's ready. This makes capf almost impossible""" start="00:16:10.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to form a finalized candidate list during popup.""" start="00:16:14.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""""" start="00:16:21.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""The complete reasons regarding why capf is incompatible""" start="00:16:21.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""with the asynchronous nature of LSP servers""" start="00:16:26.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""are very complicated and deserves its own talk.""" start="00:16:28.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Lazycat wrote an entire blog post detailing his reasonings,""" start="00:16:32.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""while Corfu's author Daniel Mendler a.k.a minad""" start="00:16:37.080" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""also done his own investigations and experiments,""" start="00:16:41.000" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and reached a common conclusion.""" start="00:16:44.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""For anyone interested, I've pasted the links""" start="00:16:47.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to the corresponding posts here.""" start="00:16:50.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Therefore, keep in mind that LSP Bridge""" start="00:16:52.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""can only use acm-mode to work nicely,""" start="00:16:57.400" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""so please disable other completion frameworks""" start="00:16:59.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""like company and corfu before trying LSP Bridge.""" start="00:17:03.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""By designing ACM with asynchronous server response in mind,""" start="00:17:07.160" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""this unlocks LSP Bridge project's potential""" start="00:17:14.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to provide completions from almost any backends.""" start="00:17:18.760" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""ACM has blended all the backends together,""" start="00:17:22.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and configured a priority to display""" start="00:17:25.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""important completion results like LSP before other backends.""" start="00:17:28.800" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""It can autocomplete LSP, TabNine, Elisp symbols, yasnippets,""" start="00:17:32.840" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""even English dictionaries and much more.""" start="00:17:38.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""As long as you have the backends installed,""" start="00:17:41.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""they all work out-of-the-box!""" start="00:17:43.960" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Although LSP Bridge is a relatively new package""" start="00:17:46.320" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""with just over 7 months old, it is already a success!""" start="00:17:55.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""As of December of 2022, we have 67 contributors""" start="00:18:00.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""making more than 1000 commits,""" start="00:18:06.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and we reached more than 600 stars on Github!""" start="00:18:08.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP Bridge is easily extensible,""" start="00:18:12.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""developing a new language backend is very simple too,""" start="00:18:16.360" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""feel free to join us!""" start="00:18:18.880" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""LSP Bridge is another successful example""" start="00:18:20.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""of extending Emacs Lisp with Python, and just like EAF,""" start="00:18:25.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""it demonstrated the potential Emacs can achieve""" start="00:18:29.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""when we jump out of the Lisp-only world""" start="00:18:33.640" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""and embrace other ecosystems.""" start="00:18:37.040" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Recently Lazycat created a package called blink-search""" start="00:18:39.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that leveraged similar ideas""" start="00:18:43.480" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""but an asynchronous search framework,""" start="00:18:45.680" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""as well as a package called deno-bridge""" start="00:18:48.920" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""that extended Emacs Lisp""" start="00:18:51.240" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""with Deno JavaScript TypeScript runtimes.""" start="00:18:53.120" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Please check it out,""" start="00:18:56.440" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""if consider joining the development too!""" start="00:18:57.560" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""This is the entirety of my presentation, thanks for joining!""" start="00:19:05.200" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""Me and Lazycat will be available""" start="00:19:08.600" video="mainVideo-lspbridge" id="subtitle"]]
+[[!template text="""to answer questions on IRC and Etherpad.""" start="00:19:11.320" video="mainVideo-lspbridge" id="subtitle"]]
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20lspbridge%3A%20lsp-bridge%3A%20a%20smooth-as-butter%20asynchronous%20LSP%20client)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/lspbridge-before.md b/2022/info/lspbridge-before.md
new file mode 100644
index 00000000..536ac2cb
--- /dev/null
+++ b/2022/info/lspbridge-before.md
@@ -0,0 +1,4 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><video controls preload="none" id="lspbridge-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.webm">Download --main.webm (34MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.opus">Download --main.opus (9.4MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.org">Download --main.org</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-lspbridge--lspbridge-a-smooth-as-butter-asynchronous-lsp-client--andy-stewart-matthew-zeng--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/oWZ7s5B5pw6vayDKPJQVBG">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/lspbridge-nav.md b/2022/info/lspbridge-nav.md
new file mode 100644
index 00000000..bbffa0d4
--- /dev/null
+++ b/2022/info/lspbridge-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/handwritten">How to incorporate handwritten notes into Emacs Orgmode</a>
+Next by track: <a href="/2022/talks/science">Writing and organizing literature notes for scientific writing</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/mail-after.md b/2022/info/mail-after.md
new file mode 100644
index 00000000..e1221cf9
--- /dev/null
+++ b/2022/info/mail-after.md
@@ -0,0 +1,581 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="mail-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Greetings. Salaam. This is Mohsen Banan. محسن بنان.""" start="00:00:00.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am a software and internet engineer.""" start="00:00:09.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I have been interested in email and""" start="00:00:12.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs for a very long time.""" start="00:00:14.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""My interest in email started with X.400""" start="00:00:17.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and the Red and Blue CCITT books -- circa 1988.""" start="00:00:21.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Early on, in the very early 1990s, I jumped ship""" start="00:00:27.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and joined the Internet email movement.""" start="00:00:32.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am the primary author of two mobile email""" start="00:00:35.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""related Internet RFCs, RFC-2188 and RFC-2524.""" start="00:00:38.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""My interest in Emacs started in 1986 --""" start="00:00:45.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It was Emacs version 17 then. By around 1988""" start="00:00:49.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""when Emacs version 18 was well in place,""" start="00:00:54.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I started living inside of Emacs.""" start="00:00:58.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""My primary digital environment has been Emacs ever since.""" start="00:01:01.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It has been a good life.""" start="00:01:06.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It turns out that Emacs and email mix up really well.""" start="00:01:11.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Here, in this presentation and in the context of""" start="00:01:17.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Revisiting The Anatomy of Emacs Mail User Agents,""" start="00:01:21.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With MARMEE (Multi-Account Resident""" start="00:01:26.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Message Exchange Environment)""" start="00:01:30.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am offering my thoughts on this topic""" start="00:01:33.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in this Emacs Conference 2022.""" start="00:01:35.560" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Long ago, I asked myself:""" start="00:01:41.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""&quot;What should my ultimate mail environment be?&quot;""" start="00:01:43.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Over the past 20+ years, I have been exploring""" start="00:01:49.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the concept of the &quot;Ultimate Mail User Agent (MUA)&quot;.""" start="00:01:52.141" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We do care about privacy, autonomy,""" start="00:01:58.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""morality, ethics, society and philosophy,""" start="00:02:01.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""so from the get go, proprietary (Haraam) environments""" start="00:02:05.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""such as Microsoft Office's Outlook""" start="00:02:10.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and Google Office's Gmail were non-starters for me.""" start="00:02:14.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But these are significant realities""" start="00:02:20.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and we need to deal with these realities.""" start="00:02:23.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Notice how Microsoft and Google""" start="00:02:27.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""have both framed their MUAs in the context of &quot;office&quot;.""" start="00:02:30.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""That type of framing is correct.""" start="00:02:36.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""an MUA must be fully integrated""" start="00:02:38.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in the totality of one's digital ecosystem.""" start="00:02:41.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, the Ultimate Mail User Agent""" start="00:02:46.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""must be part of the Ultimate Usage Environment""" start="00:02:49.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of the Ultimate Digital Ecosystem.""" start="00:02:53.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In the non-proprietary (Halaal) universe, clearly""" start="00:02:57.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the ultimate usage environment is Emacs.""" start="00:03:02.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs is today's most potent and convivial""" start="00:03:07.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""non-proprietary usage environment.""" start="00:03:10.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, clearly, the ultimate Mail User Agent""" start="00:03:15.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""must be an integral part of Emacs.""" start="00:03:19.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Having reached that conclusion,""" start="00:03:22.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we then need to determine the specifics""" start="00:03:24.158" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of the shape and the anatomy of Emacs' MUAs.""" start="00:03:28.125" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""We could have arrived at this conclusion""" start="00:03:33.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""from the reverse direction as well.""" start="00:03:36.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Zawinski's Law states:""" start="00:03:38.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Every program attempts to expand until it can read mail.""" start="00:03:41.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Those programs which cannot so expand""" start="00:03:46.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""are replaced by ones which can.""" start="00:03:49.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Jamie's point is very simple and obvious.""" start="00:03:52.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The &quot;App&quot; that you &quot;live in&quot; all day""" start="00:03:56.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""should be your MUA and mail environment.""" start="00:03:59.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I ask those who jumped ship, who abandoned Emacs""" start="00:04:05.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in favor of VS Code: What about mail?""" start="00:04:09.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Long ago, Emacs expanded to including MUAs.""" start="00:04:15.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In fact there are many Emacs MUAs that you can choose from.""" start="00:04:21.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""If you are already hip with Emacs And Linux,""" start="00:04:27.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""you should definitely consider doing email in Emacs.""" start="00:04:30.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But if you are not already hip with Emacs,""" start="00:04:34.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I mean for new Emacs users, unfortunately,""" start="00:04:39.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""setting up and using email is not straight forward.""" start="00:04:43.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We (I mean, Emacs developers) should work on that!""" start="00:04:48.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs offers a good number of MUAs with""" start="00:04:54.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""different characteristics to suit differing tastes.""" start="00:04:57.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""As of 2022, you can choose from the following MUAs:""" start="00:05:01.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Gnus, VM, WanderLust, Mew, mu4e, notmuch.el, mh-e and Rmail.""" start="00:05:06.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Over the years I have tried several of these""" start="00:05:15.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and eventually landed on Gnus.""" start="00:05:17.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The relevance column in this table simply and only""" start="00:05:20.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""reflects my taste.""" start="00:05:25.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Throughout the rest of this presentation, I focus on Gnus.""" start="00:05:28.080" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""I have 3 types of audiences in mind for this presentation.""" start="00:05:32.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""First, if you are already using Emacs""" start="00:05:36.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""as more than an editor,""" start="00:05:39.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""it makes good sense for you to also use Emacs as your MUA.""" start="00:05:42.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""There may well be some relevant information here for you""" start="00:05:47.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in that situation.""" start="00:05:50.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Second, for those interested in philosophy of Emacs,""" start="00:05:52.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I go on some bigger picture tangents""" start="00:05:57.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that may be of value to you.""" start="00:06:00.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Third, I address some Emacs developers with some feedback,""" start="00:06:02.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""some suggestions, and some requests.""" start="00:06:08.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The general model here is that""" start="00:06:11.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we would collectively work towards""" start="00:06:14.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""improving what is on the table.""" start="00:06:17.080" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""When a Mail User Agent is self-contained""" start="00:06:19.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and includes implementation of mail protocols,""" start="00:06:22.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we call it a Monolithic-MUA.""" start="00:06:26.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Just as it is with the physical mail postal service,""" start="00:06:29.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""sending mail and receiving mail""" start="00:06:33.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""are fundamentally separate activities.""" start="00:06:36.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And then there is mail processing.""" start="00:06:40.640" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Based on these categorizations,""" start="00:06:42.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs has a set of mature libraries""" start="00:06:45.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for composing mail, sending mail, and receiving mail.""" start="00:06:49.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""These are all independently well-documented""" start="00:06:53.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and are part of the basic emacs Distribution.""" start="00:06:58.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs MUAs then use these common libraries""" start="00:07:02.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to process mail (each somewhat differently).""" start="00:07:06.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The primary benefit of the Monolithic-MUA approach""" start="00:07:09.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is that Emacs MUAs then become self-contained""" start="00:07:15.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and therefore multi-platform.""" start="00:07:19.600" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""But, when it comes to the question of merits of""" start="00:07:22.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""implementation of mail protocols in Elisp inside of Emacs,""" start="00:07:25.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""there is also another approach:""" start="00:07:30.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that of a Split-MUA.""" start="00:07:33.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Concept of a split-MUA is that of""" start="00:07:36.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""splitting the MUA into two different parts:""" start="00:07:40.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""One being the usage environment,""" start="00:07:44.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and the other being mail protocols processing.""" start="00:07:47.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The interface between these can be either""" start="00:07:50.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""direct (the upper box)""" start="00:07:54.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""or through protocols (the lower box).""" start="00:07:57.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With Gnus, we primarily use the direct interface.""" start="00:08:00.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The split-MUA model has many advantages""" start="00:08:05.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""over the monolithic-MUA model.""" start="00:08:09.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With Split-MUAs, your messages are local,""" start="00:08:12.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""you can search them privately""" start="00:08:17.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and access to your email is faster.""" start="00:08:19.840" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Gnus can be used as both a Monolithic-MUA""" start="00:08:22.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and also as a Split-MUA.""" start="00:08:28.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Gnus and other Emacs MUAs are flexible enough""" start="00:08:30.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to allow you to create your own split-MUA.""" start="00:08:35.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For outgoing mail, Gnus can""" start="00:08:39.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""invoke a sendmail-like interface program.""" start="00:08:42.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For incoming mail, Gnus can access Maildirs directly""" start="00:08:45.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and let other programs imap-retrieve""" start="00:08:50.008" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and update into maildirs.""" start="00:08:53.725" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""You can then search through your maildirs""" start="00:08:56.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""locally and privately""" start="00:08:59.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""with various mail-oriented search engines,""" start="00:09:01.375" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and many have done so.""" start="00:09:04.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For example, what we are seeing on this slide""" start="00:09:07.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is from a 2014 Do It Yourself (DIY) recipe""" start="00:09:11.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that one of our fellow Emacs conference participants,""" start="00:09:15.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Adolfo, had published at the mentioned URL.""" start="00:09:20.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The recipe in that slide is based on the following tools:""" start="00:09:24.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""mbsync, mu, mu4e, and msmtp.""" start="00:09:29.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""All our choices are different.""" start="00:09:35.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""There are many such recipes out there on the web.""" start="00:09:38.280" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""So, here, I don't want to provide""" start="00:09:42.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""yet another Emacs Split-MUA recipe.""" start="00:09:46.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I want to do more.""" start="00:09:50.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Instead, I want to target the contours of the ultimate MUA""" start="00:09:51.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in the non-proprietary universe of digital ecosystems.""" start="00:09:56.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But, first, let's take a look at what is""" start="00:10:01.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""happening in the proprietary universe.""" start="00:10:05.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The 5 big American proprietary tech companies""" start="00:10:07.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""(Google, Microsoft, Apple, Facebook and Amazon)""" start="00:10:11.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""have created 5 competing enclaves as mostly separate""" start="00:10:14.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and isolated digital ecosystem.""" start="00:10:20.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In this slide, I am focusing on the first 3""" start="00:10:23.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and each of their office and email environments.""" start="00:10:27.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Let's clearly recognize that the economic model""" start="00:10:31.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of these proprietary digital ecosystems is:""" start="00:10:36.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""&quot;Surveillance Capitalism&quot;.""" start="00:10:40.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, when any of us goes there to get""" start="00:10:42.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""a free-of-charge email account,""" start="00:10:45.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""he has chosen to voluntarily forgo much of his privacy.""" start="00:10:47.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And many have done so.""" start="00:10:53.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Sadly, the rest of the world is becoming""" start="00:10:55.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Americanized through the American Internet.""" start="00:10:59.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""As of 2022, almost %90 of Facebook's""" start="00:11:02.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""daily active users come from outside of the US.""" start="00:11:08.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Also, with respect to email, each of the enclaves""" start="00:11:11.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""have MUAs that are fully integrated""" start="00:11:17.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in their digital ecosystems""" start="00:11:20.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in the form of an office environment""" start="00:11:22.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""comprising of address book, calendar, time management""" start="00:11:24.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and planning tools and multi-lingual authoring""" start="00:11:29.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and various other integrated tools.""" start="00:11:33.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Now, let's focus on the right side of this picture.""" start="00:11:36.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""On the non-proprietary side,""" start="00:11:40.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""based on the Western FLOSS model,""" start="00:11:43.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we have ended up with lots of components.""" start="00:11:46.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We have Debian as a platform,""" start="00:11:49.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we have Emacs as an editor-centered office environment""" start="00:11:52.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and we have Gnus as an incredibly powerful MUA.""" start="00:11:58.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But on the non-proprietary side we don't have anything""" start="00:12:03.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that can reasonably be considered a digital ecosystem.""" start="00:12:07.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I mean, the services aspect is missing.""" start="00:12:12.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Over the past two decades I have created""" start="00:12:16.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""quite an elaborate digital ecosystem for myself.""" start="00:12:20.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It is called: By*.""" start="00:12:24.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The Libre-Halaal ByStar Digital Ecosystem""" start="00:12:26.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is being built to provide autonomy-oriented services""" start="00:12:30.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""on internet scale.""" start="00:12:35.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The * in ByStar stands for Unix's globbing symbol,""" start="00:12:37.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""signifying that our scope is everything.""" start="00:12:42.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Notice in this bigger picture that in the red box,""" start="00:12:46.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""our focus remains to be Emacs, Gnus and the ultimate MUA.""" start="00:12:52.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am not here to sell you ByStar, but perhaps""" start="00:12:58.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""you should be in the market for something like that.""" start="00:13:03.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We need non-proprietary digital ecosystems.""" start="00:13:06.240" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Very briefly, I'll give you""" start="00:13:10.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""some pointers to the full ByStar story.""" start="00:13:13.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The full ByStar story is a 250 plus pages book titled:""" start="00:13:16.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Nature Of Polyexistentials,""" start="00:13:23.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Basis For Abolishment Of""" start="00:13:26.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The Western Intellectual Property Rights Regime,""" start="00:13:28.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And Introduction Of""" start="00:13:31.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The Libre-Halaal ByStar Digital Ecosystem.""" start="00:13:33.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I have it self-published on my own ByName public web page.""" start="00:13:36.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The ByStar story starts with understanding of the""" start="00:13:42.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Nature Of Polyexistentials.""" start="00:13:46.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Polyexistentials inherently exist in multiples.""" start="00:13:48.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Software is a polyexistential.""" start="00:13:53.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Polyexistentials are naturally non-scarce,""" start="00:13:56.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and making polyexistential artificially scarce,""" start="00:14:01.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which is what the Western""" start="00:14:06.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""intellectual property rights regime does,""" start="00:14:08.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is counter to nature.""" start="00:14:11.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Polyexistentials are unownable""" start="00:14:13.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and should not be considered property.""" start="00:14:17.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The Western IPR regime is in conflict with nature.""" start="00:14:20.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But, the book is more than just philosophy.""" start="00:14:25.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In that book I also cover""" start="00:14:29.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the bigger picture of healthy digital ecosystems""" start="00:14:32.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which also includes the topic of this presentation.""" start="00:14:35.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I'd be interested in your thoughts and your feedback,""" start="00:14:39.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""if you choose to dig deeper.""" start="00:14:43.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And if you want to dig deeper, here are some links.""" start="00:14:45.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""By* is about re-decentralization""" start="00:14:51.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of Internet application services.""" start="00:14:55.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Among other things, ByStar provides""" start="00:14:57.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""complete own-your-email services. I mean,""" start="00:15:00.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""private Hillary-Clinton-Style mail servers for everyone.""" start="00:15:05.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""There is an overview of ByStar at by-star.net.""" start="00:15:10.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""You may have noticed that I consistently use""" start="00:15:16.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the &quot;Libre-Halaal&quot; label with ByStar.""" start="00:15:21.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Halaal is a very sensitive word.""" start="00:15:25.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am a Moslem.""" start="00:15:28.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But my use of Halaal is not in a religious context.""" start="00:15:30.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It is in a philosphical context.""" start="00:15:35.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And the scope of the &quot;Libre-Halaal&quot; label""" start="00:15:39.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is manner-of-existence of Software and Services.""" start="00:15:42.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It is not about Halaal-ness with respect to""" start="00:15:46.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""function and use of Software and Services.""" start="00:15:50.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Unfortunately, the word Halaal""" start="00:15:54.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and the concept of Halaal does not exist in English.""" start="00:15:58.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, first I introduce it into Globish.""" start="00:16:02.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I have done so in PLPC-120039.""" start="00:16:06.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Further, I explain as to why labels""" start="00:16:12.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of Open Source and Free Software are both ill-directed.""" start="00:16:18.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We then carefully define""" start="00:16:22.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""&quot;Libre-Halaal Software&quot; and &quot;Libre-Halaal Services&quot;.""" start="00:16:25.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Notice that last link.""" start="00:16:30.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I bet, this is the first time""" start="00:16:33.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that anyone includes a link to his &quot;Open Business Plan&quot;""" start="00:16:36.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in an Emacs Conference.""" start="00:16:40.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I hope others would do this as well.""" start="00:16:43.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""There is appetite out there""" start="00:16:46.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for privacy- and autonomy-oriented digital ecosystems,""" start="00:16:49.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and there is no conflict between honest business,""" start="00:16:53.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""honest profit, and Libre-Halaal Software""" start="00:16:57.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and Libre-Halaal Services.""" start="00:17:01.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The sub-title of our open business plan is:""" start="00:17:02.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""&quot;An Inversion to the Proprietary Internet Services Model&quot;.""" start="00:17:08.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And here are the same links as a native Reveal slide.""" start="00:17:12.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""If instead of a video, you are viewing""" start="00:17:20.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""this presentation as a Reveal web page,""" start="00:17:24.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""you can just click on the pointers and URLs.""" start="00:17:27.400" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""So, what was the point of bringing ByStar""" start="00:17:31.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""into this presentation?""" start="00:17:36.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In tangible terms, what have we gotten out of""" start="00:17:38.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the tangent we took on the ByStar bigger picture?""" start="00:17:42.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Of course we have the ByStar Digital Ecosystem itself.""" start="00:17:45.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But that is not immediately relevant to this presentation.""" start="00:17:50.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Here, through BISOS we now have""" start="00:17:54.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""an integration framework, which we definitely needed.""" start="00:17:59.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We now have BISOS-MARMEE,""" start="00:18:04.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Multi-Account Resident Mail Exchange Environment,""" start="00:18:07.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which is a consistent set""" start="00:18:11.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of MUA-related software components --- which we need.""" start="00:18:13.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We also needed to augment Emacs in our own terms,""" start="00:18:17.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""so we have Blee for that,""" start="00:18:23.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""ByStar Libre-Halaal Emacs Environment,""" start="00:18:25.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is ByStar ecosystemized Emacs.""" start="00:18:29.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And finally Blee-Gnus, which is""" start="00:18:32.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Gnus and MARMEE integrated with Blee.""" start="00:18:37.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With these in place, we can now dive deeper into MARMEE.""" start="00:18:40.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The idea of MARMEE, is that of packaging together""" start="00:18:46.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the mail protocols parts of the Split-MUA.""" start="00:18:53.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""MARMEE (which is of course in the context of BISOS)""" start="00:18:56.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is the green box in this slide.""" start="00:19:00.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For outgoing mail, we use an altered qmail.""" start="00:19:03.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We will be looking deeper into qmail a bit later.""" start="00:19:08.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For incoming mail, we are using offlineimap""" start="00:19:12.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which is oauth2 aware.""" start="00:19:17.560" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Before going into more details,""" start="00:19:20.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""let's take a look at the parts lists for""" start="00:19:23.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""BISOS-MARMEE and Blee-Gnus.""" start="00:19:26.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""MARMEE is a collection of Python-based libraries""" start="00:19:29.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and Debian packages that provide for rich sending""" start="00:19:33.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and receiving of email outside of Emacs.""" start="00:19:37.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Here is our BISOS-MARMEE parts list.""" start="00:19:40.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""MARMEE features include tracked mail Sending""" start="00:19:44.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for confirmed mail communications""" start="00:19:48.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and email distribution facilities""" start="00:19:51.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""(say, similar to Constant Contact).""" start="00:19:54.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For Delivery Status Notification (DSN),""" start="00:19:57.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we have adopted flufl.bounce.""" start="00:20:02.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I'll be touching on everything that is qmail-related,""" start="00:20:06.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""namely qmail-remote.cs and mailfront, in a separate slide.""" start="00:20:10.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""notmuch is our choice of mail search engine.""" start="00:20:17.320" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Similarly, here is our Blee-Gnus Parts List.""" start="00:20:21.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Blee-Gnus is Gnus and MARMEE integrated with BISOS and Blee.""" start="00:20:27.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Notice mentions of org-msg and polymode here.""" start="00:20:33.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Later, I'll expand on these in the context of""" start="00:20:38.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""transitioning from Message-Mode to Message-Polymode.""" start="00:20:42.880" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""With these parts in place,""" start="00:20:47.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""now let's see how they will all come together.""" start="00:20:52.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Gnus is very flexible, and in combination with MARMEE,""" start="00:20:55.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""it can create an incredibly powerful MUA.""" start="00:21:00.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""On this slide, note the boxes""" start="00:21:03.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that include the FPs label.""" start="00:21:07.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""FP stand for File Parameters.""" start="00:21:10.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It is the basis of BISOS's configuration""" start="00:21:14.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and secrets management.""" start="00:21:18.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Notice that it has consistent agents""" start="00:21:20.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""inside of Emacs and on the OS.""" start="00:21:24.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This is a big deal""" start="00:21:27.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in that it can reduce user visible configuration complexity.""" start="00:21:29.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Also, notice the X822-Bus here.""" start="00:21:34.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The idea of X822-Bus is that of""" start="00:21:39.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""allowing for communication among user's preferences, Gnus""" start="00:21:44.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and MARMEE-qmail through addition of X- fields""" start="00:21:49.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in RFC-822 message headers.""" start="00:21:53.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""X822-Bus is used for selection of mail sending agents""" start="00:21:57.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and specification of delivery status parameters.""" start="00:22:03.600" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Of key significance in this picture""" start="00:22:08.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is our choice of qmail for outgoing mail.""" start="00:22:12.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Compared to sendmail, postfix, exim,""" start="00:22:15.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and other conventional MTAs;""" start="00:22:22.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the qmail ecosystem is far more flexible and potent.""" start="00:22:25.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We are not using qmail as is.""" start="00:22:31.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Ours is called bystar-qmail.""" start="00:22:34.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""When we use it as a traditional MTA,""" start="00:22:38.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we refer to it as PALS-qmail.""" start="00:22:41.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And when we use it on the MUA side, we call it MARMEE-qmail.""" start="00:22:45.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Just like Emacs, qmail has""" start="00:22:52.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""a solid core and a flexible periphery.""" start="00:22:56.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""All our alterations have been on the periphery.""" start="00:22:59.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We have replaced qmail-remote""" start="00:23:04.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""with our own Python implementation called qmail-remote.cs.""" start="00:23:07.891" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""By being in Python, it can do a lot more a lot more easily.""" start="00:23:14.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For example, qmail-remote.cs interacts with""" start="00:23:20.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Google Oauth2 APIs and allows you to send through Gmail.""" start="00:23:26.541" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This is shown with the red circle.""" start="00:23:33.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We have also replaced qmail-smtpd with mailfront,""" start="00:23:36.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""shown with a blue circle.""" start="00:23:43.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This allows us to use MARMEE Split-MUA""" start="00:23:46.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""through protocol interfaces.""" start="00:23:51.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Let's take a look at that.""" start="00:23:54.000" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Previously we looked at the &quot;Direct Interface&quot; of MARMEE,""" start="00:23:56.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""specifically, qmail-inject and Maildir for Gnus.""" start="00:24:02.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But what if we wanted to use""" start="00:24:08.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""MARMEE with other MUAs outside of Emacs?""" start="00:24:11.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""That can be done through the &quot;Protocol Interface&quot;.""" start="00:24:15.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""MARMEE also includes &quot;mailfront&quot;""" start="00:24:18.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which can function as an SMTP submit server for localhost.""" start="00:24:22.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This way, we can configure""" start="00:24:27.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the outgoing mail part of any MUA to point to the localhost""" start="00:24:30.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and have MARMEE-qmail function as an outgoing proxy.""" start="00:24:36.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For incoming mail, MARMEE-Split-MUA-Protocol-Interface""" start="00:24:41.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""includes &quot;Courier&quot;, which can function""" start="00:24:47.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""as an IMAP server for localhost.""" start="00:24:51.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This way, we can configure the incoming mail part""" start="00:24:54.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of any MUA to point to the localhost""" start="00:24:58.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and have MARMEE function as an incoming proxy""" start="00:25:02.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""by serving the local Maildir to the MUA.""" start="00:25:06.520" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""All sources for all of ByStar, BISOS,""" start="00:25:10.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Blee and MARMEE are subject to Affero GPL.""" start="00:25:18.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The sources and documentation are all republished""" start="00:25:23.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""under various &quot;Organizations&quot;""" start="00:25:28.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""under github.com/mohsenBanan""" start="00:25:30.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""All of ByStar, BISOS, Blee and MARMEE""" start="00:25:35.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""reflect work in progress,""" start="00:25:40.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and we are NOT recruiting users at this time.""" start="00:25:42.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For more than two decades,""" start="00:25:46.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I have been using these all in that bigger context.""" start="00:25:49.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""They are mostly real,""" start="00:25:53.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""but so far, just for myself and a few other engineers.""" start="00:25:56.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Our model is similar to God's early days.""" start="00:26:01.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""You may ask:""" start="00:26:06.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""&quot;How did God create all of this in just 7 days?&quot;""" start="00:26:08.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Well, easy, He did not have an installed base to deal with.""" start="00:26:12.120" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""You can obtain and install MARMEE in two ways. As is:""" start="00:26:17.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""as standalone-MARMEE, you can just""" start="00:26:24.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""pip install bisos.marmee.""" start="00:26:29.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For the Gnus part you are completely on your own.""" start="00:26:31.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Or on a Debian-11, you can just run""" start="00:26:35.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the bisos bootstrap script.""" start="00:26:40.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""That way you will have all of BISOS, which includes MARMEE""" start="00:26:43.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and you will have Blee, which includes Blee-Gnus.""" start="00:26:48.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""If you plan to do so,""" start="00:26:52.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I suggest that you first try it in a disposable VM.""" start="00:26:54.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""BISOS and Blee are large.""" start="00:26:58.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Many apt and pip packages will be installed!""" start="00:27:02.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And here are the same links as a native Reveal slide.""" start="00:27:06.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""If you are viewing this presentation as Reveal.js web page,""" start="00:27:11.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""you can just click on the pointers and URLs.""" start="00:27:17.520" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Let's consider MARMEE as an Emacs &quot;Common Agent&quot;.""" start="00:27:20.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""By &quot;Common-Agent&quot; I mean a capability""" start="00:27:25.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which Emacs builds on""" start="00:27:28.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and which other Apps can also use.""" start="00:27:30.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs has a very rich applications development framework""" start="00:27:33.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for absorbing common-agents.""" start="00:27:38.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Consider how magit has absorbed git,""" start="00:27:41.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""or how flycheck has absorbed mypy""" start="00:27:45.475" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""or how EAF does its work outside of Emacs ---""" start="00:27:49.775" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""that too can be considered a common-agent.""" start="00:27:54.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The common-agent model permits us""" start="00:27:57.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to do more outside of Emacs.""" start="00:28:02.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Common-agents maximize social benefits""" start="00:28:04.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and are more convivial.""" start="00:28:08.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For example, any MUA can profit from MARMEE.""" start="00:28:10.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But we don't have good ways of""" start="00:28:15.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""packaging Emacs and its packages""" start="00:28:18.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""with their common-agents.""" start="00:28:21.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Instead, we usually end up with DIY recipes.""" start="00:28:23.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This is why I am contextualizing""" start="00:28:28.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs inside of Blee and BISOS.""" start="00:28:32.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""That is what they are for.""" start="00:28:35.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And that is why I consider them""" start="00:28:38.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""immediately relevant to this presentation.""" start="00:28:40.425" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With an incredibly powerful Display Engine,""" start="00:28:43.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and an incredibly powerful Elisp Engine,""" start="00:28:47.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and an incredibly powerful Input Methods Engine,""" start="00:28:51.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and an incredibly powerful Common-Agents paradigm,""" start="00:28:55.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Emacs has the potential of being""" start="00:28:59.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""any non-proprietary digital ecosystem's""" start="00:29:02.708" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""preferred usage environment.""" start="00:29:06.408" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am in favor of putting more around Emacs""" start="00:29:08.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and strengthening integration of Emacs""" start="00:29:14.091" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""with Debian, explicitly,""" start="00:29:17.441" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""perhaps even at the cost of""" start="00:29:19.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""de-emphasizing its multi-platform attribute.""" start="00:29:22.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""A smaller Emacs is a better Emacs.""" start="00:29:26.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Notice that in this slide,""" start="00:29:30.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I have used many arrows in many colors.""" start="00:29:33.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Much of Emacs's power comes from its ability""" start="00:29:37.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to absorb and to integrate.""" start="00:29:45.600" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Tomohiro is right on the mark when he says,""" start="00:29:47.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""&quot;The reason why Emacs platform is good""" start="00:29:51.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""is that it cooperates with OS,""" start="00:29:55.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""not because it is good by itself.&quot;""" start="00:29:58.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I am suggesting that we should""" start="00:30:00.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""raise the bar from the OS""" start="00:30:04.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to the entirety of our digital ecosystem.""" start="00:30:06.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""There are many models""" start="00:30:09.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for Emacs to cooperate with the OS""" start="00:30:13.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and with applications and with services.""" start="00:30:15.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The colors of arrows in the previous slide correspond to""" start="00:30:19.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the model of interface of the common-agent:""" start="00:30:25.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for example, sub-process invocation, pipe-based""" start="00:30:28.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""asynchronous interface, or file-based interactions.""" start="00:30:34.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""One important aspect of common-agent paradigm is that""" start="00:30:39.360" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""both the common-agent and its Emacs App""" start="00:30:44.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""need to be configured consistently.""" start="00:30:50.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In MARMEE and Blee-Gnus,""" start="00:30:53.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""we use File-Params to accomplish this.""" start="00:30:57.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In BISOS, there is a Python interface to File-Params,""" start="00:31:01.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""there is a Bash interface to File-Params,""" start="00:31:06.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and in Blee, there is an Elisp interface to File-Params.""" start="00:31:10.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, configurations are extended.""" start="00:31:15.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Furthermore, File-Params can be encrypted,""" start="00:31:18.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and credentials can be protected and shared.""" start="00:31:23.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This is a significant improvement over .authinfo""" start="00:31:26.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and its more recent incarnations.""" start="00:31:33.920" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""EmacsConf could be a great place""" start="00:31:36.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for users to provide feedback to developers""" start="00:31:41.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and for developers to suggest to developers.""" start="00:31:44.375" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In that spirit, my primary audience in this part""" start="00:31:47.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""are fellow Emacs developers.""" start="00:31:52.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""BISOS-MARMEE and Blee-Gnus are starting points.""" start="00:31:54.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We can collectively work""" start="00:32:00.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""towards improving what is in place.""" start="00:32:02.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Some such improvements involve""" start="00:32:04.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""collaboration among various Emacs developers.""" start="00:32:07.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Here, I am making some explicit requests""" start="00:32:11.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""from some of the relevant emacs developers.""" start="00:32:16.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""At most, these are requests and invitations.""" start="00:32:19.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For each of these requests, I am providing links""" start="00:32:24.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for additional details.""" start="00:32:28.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In due course, I'll follow up""" start="00:32:30.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in the Emacs developers mailing list.""" start="00:32:33.040" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""Gnus uses X-Message-SMTP-Method""" start="00:32:35.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for selection of Mail-Sending-Agent.""" start="00:32:41.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Even though all the qmail injection code is still in Gnus,""" start="00:32:45.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""support for &quot;X-Message-SMTP-Method: qmail&quot; is missing.""" start="00:32:50.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It takes 2 lines of code to revive it.""" start="00:32:58.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With regards to (1), qmail was previously supported in Gnus.""" start="00:33:02.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Lars, can you please reactivate it? Thanks.""" start="00:33:07.400" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""(2) is a terminology suggestion.""" start="00:33:11.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The term X-Message-SMTP-Method violates conceptual layering.""" start="00:33:16.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Please consider changing it to X-Message-Send-Method.""" start="00:33:21.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""In a Split-MUA setup, Gnus need not know about SMTP at all.""" start="00:33:27.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We just need to pass information""" start="00:33:33.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to a Mail-Sending-Agent selector.""" start="00:33:36.600" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""(3) is simply a design suggestion for""" start="00:33:39.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which I prepared the context.""" start="00:33:44.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text=""".authinfo and Emacs auth-source library""" start="00:33:46.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""are too Emacs-centric.""" start="00:33:51.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""We need to share config info and secrets""" start="00:33:54.200" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""between common-agents and Emacs.""" start="00:33:57.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""The File Parameters approach""" start="00:34:00.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""can be a general-purpose solution.""" start="00:34:03.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Is it reasonable to extend auth-source library to""" start="00:34:05.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""support File Params?""" start="00:34:10.840" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I'll cover (4) in the next slide.""" start="00:34:12.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""(5) is a philosophical common suggestion""" start="00:34:16.520" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""to all Emacs developers. We need to better cultivate""" start="00:34:21.160" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the model of Common-Agents integration with Emacs.""" start="00:34:26.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""And here are the same links as a native Reveal slide.""" start="00:34:30.880" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""A mail message comprises of""" start="00:34:39.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Envelope, Header and BodyParts.""" start="00:34:42.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Each of these have their own syntax (their own mode).""" start="00:34:45.600" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Conceivably Each BodyPart has its own mode.""" start="00:34:49.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, we need to evolve Message-Mode into Message-Polymode.""" start="00:34:53.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""More or less by default, org-mode has become""" start="00:34:59.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the beginnings of &quot;Emacs Native Markup Language -- ENML&quot;.""" start="00:35:03.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""With org-msg you can write your emails in org-mode ---""" start="00:35:09.000" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""destined as html.""" start="00:35:14.400" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""org-msg needs to become""" start="00:35:16.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""an integral part of Message-Polymode.""" start="00:35:19.560" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""It would be heavenly""" start="00:35:22.240" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""if Lars, Jérémy and Vitalie could collaborate""" start="00:35:25.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and give us the needed Message-Polymode. Thank you.""" start="00:35:29.960" video="mainVideo-mail" id="subtitle"]]
+[[!template new="1" text="""One way to verify that we have not gone astray""" start="00:35:34.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in our horizontal bigger pictures is to verify them""" start="00:35:38.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""through the concept of &quot;Vertical Slice Use Cases&quot;.""" start="00:35:42.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Let one use case be reading and writing""" start="00:35:46.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of mail on multiple gmail accounts with Gnus.""" start="00:35:50.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Google now requires use of oauth2 tokens""" start="00:35:54.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""which MARMEE can do outside of emacs.""" start="00:35:59.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""There is a recent email thread""" start="00:36:02.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""on that in the emacs-devel mailing list.""" start="00:36:05.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Let another use case be that of tracking delivery""" start="00:36:09.120" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and non-delivery reports for custom envelope addresses""" start="00:36:14.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""of byname.net (part of ByStar) autonomous mail services.""" start="00:36:18.680" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I would have loved to walk you through these""" start="00:36:26.040" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""vertical slice use cases""" start="00:36:30.320" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""as screen captures of my Blee environment.""" start="00:36:32.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""For that, I need at least another 20 minutes.""" start="00:36:36.440" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""But my time is up.""" start="00:36:40.640" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""So, let's consider this as the first""" start="00:36:43.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""in a series of presentations""" start="00:36:46.720" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""where next in this series could be""" start="00:36:48.920" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""the mentioned two vertical slice use cases.""" start="00:36:51.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Perhaps there could be another presentation""" start="00:36:55.480" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""on this topic in EmacsConf 2023.""" start="00:36:59.280" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""This document was produced entirely with""" start="00:37:02.880" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Libre-Halaal Software, and is published using""" start="00:37:06.760" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""Libre-Halaal Internet Services.""" start="00:37:10.800" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""I want to thank all the EmacsConf Organizers""" start="00:37:13.080" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""for their great work,""" start="00:37:17.960" video="mainVideo-mail" id="subtitle"]]
+[[!template text="""and Sacha, Leo, and Amin in particular.""" start="00:37:19.520" video="mainVideo-mail" id="subtitle"]]
+
+
+
+Captioner: mohsen
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20mail%3A%20Revisiting%20the%20anatomy%20of%20Emacs%20mail%20user%20agents)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/mail-before.md b/2022/info/mail-before.md
new file mode 100644
index 00000000..bb7ce309
--- /dev/null
+++ b/2022/info/mail-before.md
@@ -0,0 +1,64 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Mohsen Banan describes how Emacs mail can be part of a comprehensive digital ecosystem. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="mail">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect stroke-width="3" x="454" y="75" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 38-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-mail>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T18:50:00Z" end="2022-12-03T19:30:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~1:50 PM - 2:30 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~12:50 PM - 1:30 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~11:50 AM - 12:30 PM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~10:50 AM - 11:30 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~6:50 PM - 7:30 PM UTC <br />Saturday, Dec 3 2022, ~7:50 PM - 8:30 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~8:50 PM - 9:30 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~12:20 AM - 1:00 AM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~2:50 AM - 3:30 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~3:50 AM - 4:30 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="mail-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="mail-mainVideo" data="""
+00:00.000 Introduction
+01:41.080 Mail and the digital ecosystem
+03:33.600 Platformization and Mail
+05:32.400 Contours of this presentation
+06:19.800 Anatomy of monolithic MUAs
+06:42.840 Existing Elisp mail libraries and modes
+07:22.960 Concept of a split-MUA
+08:22.320 Emacs and the culture of DIY split-MUAs
+09:42.400 A glimpse of the bigger picture
+13:10.880 The full ByStar story
+17:31.320 ByStar DE context, assets, and terminology
+19:20.120 MARMEE parts list
+20:21.760 Blee-Gnus parts list
+20:47.680 Deep integration of BISOS-MARMEE and Blee-Gnus
+22:08.840 qmail and bystar-qmail
+23:56.560 MARMEE: common-agent for split-MUA implementations
+25:10.760 Obtaining, installing, and configuring MARMEE
+26:17.200 Installing MARMEE
+27:20.480 Emacs inside of ByStar
+29:47.760 Emacs common-agent models and interfaces
+31:36.960 Evolution of Gnus with MARMEE
+32:35.280 X-Message-SMTP-Method: qmail
+33:11.320 X-Message-Send-Method
+33:39.320 Shared common-agents configuration and secrets management
+34:39.600 Evolution of message-mode into message-polymode
+35:34.080 Two vertical-slice mail use cases
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.webm">Download --main.webm (88MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.opus">Download --main.opus (22MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/dAg6eAtVYa2oVuSBcMZE9q">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="mail-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="mail-qanda" data="""
+07:25.000 Why Gnus over Notmuch?
+08:59.000 So the idea is more about Emacs as a holistic computing experience with other packages and services rather than about email specifically?
+10:38.000 Early on you expressed misgivings about the western copyright regime, but you're using a GPL license. Is this a conflict?
+15:15.000 Do you know of GNU Guix? How do you think about using it for packaging/configuring Emacs and your various packages?
+16:47.000 Is this being split up in a heavily configured server for email hosting and a thin client package for your local client to integrate with your Emacs packages, maybe with a client thin docker container for other packages like notmuch locally?
+23:23.000 So do you combine tagging facilities of Notmuch into Gnus as well?
+25:38.000 Could you expand on the definition of libre-halaal?
+31:30.000 What is the scope of what you are imagining? Just software?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="mail-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.webm">Download --answers.webm (34MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--answers.opus">Download --answers.opus (12MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/mail-nav.md b/2022/info/mail-nav.md
new file mode 100644
index 00000000..f527ff0e
--- /dev/null
+++ b/2022/info/mail-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/buttons">Linking personal info with Hyperbole implicit buttons</a>
+Next by track: <a href="/2022/talks/realestate">Real estate and Org table formulas</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/maint-after.md b/2022/info/maint-after.md
new file mode 100644
index 00000000..761bfb3d
--- /dev/null
+++ b/2022/info/maint-after.md
@@ -0,0 +1,400 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="maint-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""When we think about the problems of the world""" start="00:00:00.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we see global warming, war, appropriation, poverty,""" start="00:00:06.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and among numerous other problems,""" start="00:00:12.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""also the inability to make a living""" start="00:00:13.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as an open source developer.""" start="00:00:16.200" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""Now this last problem may seem a lot less consequential""" start="00:00:18.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""compared to the other ones,""" start="00:00:22.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""but what if I told you that the solution to this problem""" start="00:00:23.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and the solutions to the others are one and the same?""" start="00:00:26.760" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""And it's because there's a common underlying problem""" start="00:00:30.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""at the heart of all of these problems.""" start="00:00:33.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""I'm going to tell you what that problem is in one sentence.""" start="00:00:36.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""You ready for it? It is ...""" start="00:00:39.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the deviation of market value from _true_ value.""" start="00:00:42.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Let's think about this in the context of""" start="00:00:48.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""existing economic systems such as capitalism and communism.""" start="00:00:50.440" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""And of these, I want to focus on capitalism""" start="00:00:55.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because it is the only nontrivial economic system, really.""" start="00:00:58.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Communism is more sort of a political means""" start="00:01:02.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to achieve economic ends.""" start="00:01:04.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And the other economic systems exist""" start="00:01:07.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""sort of on a spectrum between these two.""" start="00:01:09.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So let's focus on capitalism.""" start="00:01:11.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Capitalism has as its basis of value supply and demand.""" start="00:01:14.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And consequently, there is a great emphasis""" start="00:01:19.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""on this idea of ownership.""" start="00:01:21.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now ownership is an idea that made some kind of sense""" start="00:01:25.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""when you have goods and services""" start="00:01:28.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that are constrained in some way,""" start="00:01:31.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that are essentially finite in supply.""" start="00:01:33.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But when you have things like""" start="00:01:36.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""works of software, art, and music,""" start="00:01:37.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which are essentially infinite in supply,""" start="00:01:41.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the idea of ownership and supply and demand""" start="00:01:43.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""don't make sense anymore.""" start="00:01:46.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And yet we employ the institution of property""" start="00:01:48.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to constrain supply and introduce the idea of supply""" start="00:01:51.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""just so that we can induce a market value""" start="00:01:56.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""in terms of supply and demand""" start="00:01:58.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""in a capitalist economic system. And it's wrongheaded.""" start="00:02:00.320" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""How many of us have written copyright declarations""" start="00:02:05.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""like these on our work.""" start="00:02:10.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""It's a lot of work!""" start="00:02:12.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Especially when we have version control.""" start="00:02:14.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now in this example,""" start="00:02:18.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""almost every line is written by a different person,""" start="00:02:19.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""so who owns the code in this case?""" start="00:02:23.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Who owns the copyright here?""" start="00:02:25.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Is it some of them, is it all of them,""" start="00:02:27.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""do they share it in some way?""" start="00:02:30.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""It doesn't really make sense,""" start="00:02:32.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""especially when the reason we're employing""" start="00:02:34.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""copyright and ownership in this case""" start="00:02:37.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is to approximate the idea of attribution,""" start="00:02:40.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which is what we really care about here.""" start="00:02:44.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And that brings us to the nature of the solution,""" start="00:02:46.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which is to move away from an economic system""" start="00:02:51.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""based on ownership and supply and demand,""" start="00:02:53.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to an economic system based on attribution, instead.""" start="00:02:55.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""That is, moving away from who _owns_ what""" start="00:02:59.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to who _did_ what and how important was it.""" start="00:03:02.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And we can do this by the process of""" start="00:03:07.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Dialectical Inheritance Attribution,""" start="00:03:09.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which just means that we do it in a collective way""" start="00:03:12.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""using common collectively agreed upon standards""" start="00:03:16.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that are applied transparently to all.""" start="00:03:20.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And when we have an economic system""" start="00:03:24.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that is based on attribution""" start="00:03:25.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as the source of value in this way,""" start="00:03:26.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we call it attribution based economics.""" start="00:03:28.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now, once we have that, it gives us fairness,""" start="00:03:34.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""effective empowerment of expertise,""" start="00:03:39.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""freedom through incentives rather than through coercion.""" start="00:03:43.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And privacy as well.""" start="00:03:46.360" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""But I could tell you all of those things""" start="00:03:49.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and some may still say, &quot;Why should I care about this?&quot;""" start="00:03:52.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""There are those who would say""" start="00:03:57.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that fairness is not a good goal,""" start="00:03:58.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and that might makes right,""" start="00:04:00.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and that as Darwin showed us,""" start="00:04:03.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the nature of nature is violence.""" start="00:04:04.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now I know that many of us reject this ideology,""" start="00:04:09.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and we feel in our bones that it is wrong.""" start="00:04:12.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But luckily we don't have to resort to high philosophy""" start="00:04:16.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and gut feeling in order to convince ourselves""" start="00:04:19.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that an attribution-based system is truly better.""" start="00:04:21.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Because in addition to all of""" start="00:04:24.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""those other properties we talked about,""" start="00:04:26.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""an attribution-based economic system is also efficient.""" start="00:04:28.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And I say this from the perspective of having""" start="00:04:33.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""an admiration for the efficiency of capitalism.""" start="00:04:36.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So understand that that is my perspective""" start="00:04:39.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""when I say that this system --""" start="00:04:43.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""an attribution-based economic system --""" start="00:04:45.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is significantly more efficient than capitalism.""" start="00:04:47.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And it achieves that by virtue of eliminating the waste""" start="00:04:51.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that is inherent in adversarial competition,""" start="00:04:55.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""while still preserving market forces!""" start="00:04:58.480" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""In addition to this property""" start="00:05:01.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""there is also this other property""" start="00:05:05.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that I think is truly profound,""" start="00:05:07.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and I want to motivate it by this example of a gyroscope.""" start="00:05:10.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now many of us have had the opportunity to play with""" start="00:05:15.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""a gyroscope at some point in our lives.""" start="00:05:19.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""If you haven't, I encourage you to go out and get one""" start="00:05:21.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and try it out. It also makes a good gift""" start="00:05:23.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""if you're thinking about giving it""" start="00:05:25.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to somebody else this year.""" start="00:05:27.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But if you've played with a gyroscope""" start="00:05:28.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""then you've had the experience, perhaps,""" start="00:05:32.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""of putting it on your hand and moving it around.""" start="00:05:35.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And no matter what you do, it will always maintain its axis.""" start="00:05:37.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Even if you try to push it""" start="00:05:42.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and try to make it deviate from that axis,""" start="00:05:45.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""it will fight you. It will resist you,""" start="00:05:48.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and keep to that axis no matter what.""" start="00:05:50.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And if you've had this experience,""" start="00:05:53.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""then believe it or not,""" start="00:05:56.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""you have some insight into the nature of economic systems.""" start="00:05:58.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Because if we try to get an economic system to do something""" start="00:06:02.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""other than what it wants to do,""" start="00:06:07.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""other than what is its nature,""" start="00:06:09.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""then it will resist us and it will fight that change.""" start="00:06:11.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now, I don't know about you,""" start="00:06:14.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""but I'd prefer to avoid fighting these gyroscopic forces.""" start="00:06:17.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""I'd rather have these forces work with me""" start="00:06:22.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""rather than against me. Now in a capitalist system,""" start="00:06:25.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""there is another problem, which is that""" start="00:06:29.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""not only do you have these gyroscopic forces at work,""" start="00:06:32.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""but these forces aren't even all working together.""" start="00:06:35.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""They're working against each other, in many cases.""" start="00:06:39.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""They represent misaligned interests.""" start="00:06:42.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And indeed, these misaligned interests""" start="00:06:46.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""are the very means by which these forces operate at all.""" start="00:06:50.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So in a way, war is not just""" start="00:06:53.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""an inevitable consequence in this system""" start="00:06:57.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""but is rather the very nature of such a system.""" start="00:06:59.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""In an attribution-based system, on the other hand,""" start="00:07:05.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""by virtue of the source of value""" start="00:07:08.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""being collective attribution,""" start="00:07:11.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we are able to achieve alignment""" start="00:07:13.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""of all of these interests at every scale,""" start="00:07:17.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""so that at every scale of society,""" start="00:07:19.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""from the smallest to the largest scales,""" start="00:07:22.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the interests will be aligned,""" start="00:07:24.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""will be consonant and harmonious.""" start="00:07:26.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""I think this is a very important, profound quality""" start="00:07:28.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that I think is the fundamental problem of economics -""" start="00:07:33.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the fundamental goal of economics to solve.""" start="00:07:38.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And I believe that an attribution-based economic system""" start="00:07:40.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""addresses it and solves it.""" start="00:07:43.840" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""So without further ado, I want to bring it home""" start="00:07:45.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to the prototype that we have in mind""" start="00:07:50.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""for the Emacs community.""" start="00:07:52.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now we want to start in the Emacs community""" start="00:07:53.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because Emacs has a long tradition""" start="00:07:56.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""of exploring better ways of doing things""" start="00:07:58.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and pursuing better alternatives to the status quo.""" start="00:08:02.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now, to give you an overview of the prototype""" start="00:08:05.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that we've implemented for open source projects.""" start="00:08:09.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""The prototype is composed of two broad phases,""" start="00:08:12.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that is, the appraisal phase and the accounting phase.""" start="00:08:15.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Any project is composed of ideas, capital and labor.""" start="00:08:18.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""The appraisal phase is involved in assessing the work done""" start="00:08:21.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""in terms of how much value was created""" start="00:08:26.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and who created the value and how important that value is.""" start="00:08:29.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""The output of this stage is an attributions file.""" start="00:08:31.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And the second phase, of accounting, is about, you know,""" start="00:08:35.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""how do you handle payments that come in""" start="00:08:42.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and how do you pay people out.""" start="00:08:43.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now the first part has more of a social component to it""" start="00:08:45.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and the second part has more of""" start="00:08:48.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""a technological component to it that can be automated.""" start="00:08:50.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So in order to implement this prototype,""" start="00:08:53.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we have two things.""" start="00:08:56.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""We have founding documents that describe the social aspects,""" start="00:08:57.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and an accounting system that automates""" start="00:09:01.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""some of the technological aspects.""" start="00:09:04.040" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""The founding documents, in the noble tradition""" start="00:09:05.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""of the Gayaneshagowa and the US constitution,""" start="00:09:10.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""include a constitution which describes""" start="00:09:14.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the guiding principles of ABE,""" start="00:09:17.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and the two main prongs are forward-looking empowerment""" start="00:09:20.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and backward-looking fairness.""" start="00:09:25.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""This means that we want to empower""" start="00:09:26.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""those individuals and groups""" start="00:09:28.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that are most likely to create value in the future,""" start="00:09:31.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""while also recognizing and fairly compensating""" start="00:09:33.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""those who've created value in the past,""" start="00:09:36.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to set a good example and incentivize others""" start="00:09:38.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to take chances in creating value.""" start="00:09:41.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And it describes high level principles of""" start="00:09:45.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""dialectical inheritance attribution""" start="00:09:50.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as proceeding by means of""" start="00:09:52.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""common, collectively agreed-upon standards""" start="00:09:53.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that are applied to all.""" start="00:09:56.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And the key thing here is these improvements feed back""" start="00:09:56.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to the whole and apply to everyone.""" start="00:09:59.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And this is an important quality""" start="00:10:01.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to ensuring fairness and accuracy.""" start="00:10:03.640" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""There's also a declaration of non-ownership.""" start="00:10:05.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""We saw already that ownership is an overused institution.""" start="00:10:09.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""This just codifies that and allows us to shed""" start="00:10:13.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the baggage of this idea of ownership""" start="00:10:20.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""where it doesn't make any sense.""" start="00:10:22.440" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""A third document is the financial model""" start="00:10:24.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which describes how payments are to be treated,""" start="00:10:28.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and a key idea here is that when you pay money""" start="00:10:31.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to an open source project, you know,""" start="00:10:34.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""today you don't really have an incentive to do so,""" start="00:10:37.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and it essentially is kind of like a donation.""" start="00:10:40.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But in this model, in an attribution-based model,""" start="00:10:42.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""when you pay money to a project,""" start="00:10:46.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""you're creating value in a way.""" start="00:10:48.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""You're contributing value to the project""" start="00:10:50.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and that itself is attributable.""" start="00:10:51.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And the manner in which we'll treat this""" start="00:10:53.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is in terms of the fair market price that, again,""" start="00:10:56.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we agree upon collectively.""" start="00:10:58.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And any payment that exceeds the fair market price""" start="00:11:00.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is going to be treated as investment.""" start="00:11:04.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And the goal here for this financial model""" start="00:11:06.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is for the system to be self-sustaining,""" start="00:11:10.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""so I think there are many open problems here""" start="00:11:11.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and any finance experts or any other experts""" start="00:11:15.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""who are interested in contributing here,""" start="00:11:18.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""your help is needed, certainly.""" start="00:11:21.480" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""There's also an attribution model document,""" start="00:11:23.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which describes some of the theoretical ideas""" start="00:11:26.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that would guide dialectical inheritance attribution,""" start="00:11:29.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and there are many interesting ideas here.""" start="00:11:33.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""One that I'd like to mention is &quot;backpropagation,&quot;""" start="00:11:36.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which is the idea that""" start="00:11:40.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as we're improving the standards over time""" start="00:11:42.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and they're likely to get more accurate and fair over time,""" start="00:11:45.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we'd like these more accurate and fair standards""" start="00:11:48.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to &quot;backpropagate&quot; and calibrate the value assignments""" start="00:11:51.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that were done in the past.""" start="00:11:56.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And this means that some people might have been""" start="00:11:57.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""underpaid in the past""" start="00:12:01.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and we would pay them what they were underpaid,""" start="00:12:02.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""or the balance,""" start="00:12:05.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and some people may have been overpaid.""" start="00:12:06.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Now in that case we're not going to go and say,""" start="00:12:08.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""&quot;hey we overpaid you, give us the money back.&quot;""" start="00:12:11.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Instead the system as a whole is going to bear""" start="00:12:14.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the cost of being wrong,""" start="00:12:18.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and so it's kind of an insurance policy.""" start="00:12:19.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But I think another more interesting quality here is that""" start="00:12:22.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the system in practice wouldn't really""" start="00:12:25.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""absorb any negative impact here""" start="00:12:29.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because there is an incentive""" start="00:12:33.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""for these people who've been overpaid""" start="00:12:34.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to reinvest that money.""" start="00:12:37.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So I think they would want to invest the money""" start="00:12:38.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""in other places that the system has valued""" start="00:12:42.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as being valuable and showing potential.""" start="00:12:45.520" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""The second component of the implementation""" start="00:12:49.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is the accounting system. All accounting is public.""" start="00:12:54.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""All payments into the repo are public""" start="00:12:58.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and all payments out of the project are also public.""" start="00:13:00.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""We can do some things for privacy,""" start="00:13:03.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and again, the basis of this system is dialogue.""" start="00:13:05.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""It's not a fundamentally technologically system.""" start="00:13:08.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""It's a fundamentally dialogue-based system,""" start="00:13:10.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and that, to be honest with you, is everything.""" start="00:13:12.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""It's all systems that we have in place.""" start="00:13:14.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But by embracing that, it means that""" start="00:13:17.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we can do whatever we want to do by discussion,""" start="00:13:21.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and if there's something""" start="00:13:25.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that we cannot achieve in a technological way,""" start="00:13:26.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we'll achieve it in a non-technological way.""" start="00:13:27.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""But anyway, the point is, all accounting is public,""" start="00:13:30.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and text files in the repository""" start="00:13:36.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""form the inputs and outputs of the accounting system""" start="00:13:40.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which is implemented as a GitHub action.""" start="00:13:43.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So typically a source repository will have""" start="00:13:48.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""an ABE folder containing these three inputs:""" start="00:13:51.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""attributions, payments,""" start="00:13:54.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and payouts. And we'll see how that works.""" start="00:13:55.600" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""This is the drym.org Github organization account.""" start="00:13:59.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""This is an example of a repository that uses""" start="00:14:04.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the GitHub action accounting system.""" start="00:14:09.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So there will be a payments folder, a payouts folder,""" start="00:14:12.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as well as an attributions file.""" start="00:14:16.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""The payments: essentially each file""" start="00:14:18.640" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""just represents a payment that's made to the repository.""" start="00:14:23.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Payouts is the same except it's payments""" start="00:14:26.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""made by the admins of the repository to contributors.""" start="00:14:29.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And the attributions file breaks down""" start="00:14:32.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the attribution of the value in the repository""" start="00:14:37.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""by contributor. And then the billing system runs""" start="00:14:40.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""on every relevant commit,""" start="00:14:47.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""which is typically changes to the ABE folder,""" start="00:14:50.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""generates a set of transactions""" start="00:14:53.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that are owed to various people from various payments,""" start="00:14:57.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and then creates an issue with the outstanding balances""" start="00:15:00.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that need to be paid out to contributors,""" start="00:15:05.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and tells you what those balances are.""" start="00:15:07.280" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So for repository or project maintainers,""" start="00:15:09.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""it automates all these accounting details""" start="00:15:11.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and you just have to worry about fulfilling the payments.""" start="00:15:14.880" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""An interesting property of the prototype""" start="00:15:17.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is that boundary incentives expand the boundary,""" start="00:15:23.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and that is that the incentives in the system""" start="00:15:28.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""are so constructed that those on the periphery""" start="00:15:33.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""of the attribution-based economic system""" start="00:15:38.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""have an incentive to join in.""" start="00:15:40.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And we'll see how that works.""" start="00:15:42.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Well, as I mentioned, we're starting this prototype""" start="00:15:45.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""in the Emacs community with the""" start="00:15:51.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Symex repo. Symex is a structural editing package,""" start="00:15:52.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and this prototype will recognize direct contributors""" start="00:15:59.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as well as antecedents and related projects""" start="00:16:05.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""through the process of collective attribution.""" start="00:16:08.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""We all decide how financial contributions to the Symex repo""" start="00:16:09.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""are going to be distributed to the direct contributors""" start="00:16:14.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as well as to antecedents and related projects.""" start="00:16:18.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So the power is yours!""" start="00:16:21.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And that's what I meant when I said""" start="00:16:23.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that the boundary incentives expand the boundary,""" start="00:16:27.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because projects that we agree are owed money""" start="00:16:29.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""from the Symex repo now would have an incentive to join,""" start="00:16:32.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because once they join they would get that money.""" start="00:16:37.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And we'll also be implementing this in the""" start="00:16:39.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Racket community. Racket is a Scheme dialect,""" start="00:16:43.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and Emacs has great support for Racket in Racket Mode""" start="00:16:47.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""so I encourage you to try it.""" start="00:16:50.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And we'll be prototyping it in the Qi repository.""" start="00:16:52.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Qi is a language written in Racket which is, you know,""" start="00:16:56.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""it's for functional programming and things like that.""" start="00:16:59.600" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And once again, we'll recognize direct contributors""" start="00:17:02.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as well as antecedents and we all decide""" start="00:17:06.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and agree on how those are done.""" start="00:17:09.240" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""So how do you adopt this?""" start="00:17:11.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""You can add the github action to a repo""" start="00:17:14.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that you are a maintainer of.""" start="00:17:18.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""You can financially support an ABE project.""" start="00:17:20.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""This is important to do""" start="00:17:23.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because the system won't get started""" start="00:17:25.200" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""without money as an input.""" start="00:17:26.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And it also has network effects, as we saw -""" start="00:17:28.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the more money you contribute,""" start="00:17:31.120" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the more incentive there is""" start="00:17:33.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""for other people to join the system.""" start="00:17:35.240" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And contributions are also attributable,""" start="00:17:36.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as we said earlier.""" start="00:17:39.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Some of them can be treated as investments.""" start="00:17:41.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Any help you can provide with funding""" start="00:17:43.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""would be attributable and very helpful, of course.""" start="00:17:48.000" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And yeah, if you can help us achieve""" start="00:17:50.520" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""the goal of self-sufficiency""" start="00:17:54.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""without relying on capitalist entry points,""" start="00:17:55.840" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that would be very helpful as well.""" start="00:17:59.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""I'd like to acknowledge the help of many individuals""" start="00:18:01.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""for this presentation""" start="00:18:06.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""as well as many of the supporting things""" start="00:18:09.400" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that have gone on behind the scenes for years.""" start="00:18:12.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And in particular for now I want to mention""" start="00:18:14.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""Jair and Ariana who wrote the accounting system""" start="00:18:19.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that we saw earlier, and Salim who encouraged me""" start="00:18:25.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""to take this social approach to the prototype.""" start="00:18:28.320" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And so many more people who have believed and invested""" start="00:18:32.800" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""in the cause of &quot;attribution, not ownership!&quot;""" start="00:18:36.560" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""I want to leave you with this closing thought.""" start="00:18:39.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""The electromagnetic attraction between two objects""" start="00:18:42.760" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is 10^42 stronger (!) than the gravitational attraction""" start="00:18:46.160" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""between these same objects.""" start="00:18:49.920" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And yet, a stone falls to the Earth""" start="00:18:51.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""under the influence of gravity, not magnetism.""" start="00:18:53.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""The reason is that the e/m forces are polarized,""" start="00:18:56.680" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""much like our world, and cancel each other out.""" start="00:19:00.880" video="mainVideo-maint" id="subtitle"]]
+[[!template new="1" text="""Now in this world, we are told""" start="00:19:04.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""that we should look out for ourselves""" start="00:19:07.720" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because no one is going to look out for us.""" start="00:19:09.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""That we should take care of our own""" start="00:19:11.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because we can't rely on others to care.""" start="00:19:14.040" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""An attribution-based economy is nothing like that.""" start="00:19:17.360" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""We care about each other,""" start="00:19:22.480" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""we take care of each other,""" start="00:19:23.960" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""because taking care of one another is valuable,""" start="00:19:25.440" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""and an attribution-based economic system""" start="00:19:29.880" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""is capable of recognizing that value, in financial terms.""" start="00:19:32.560" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""And as a result, we are safe in the embrace of the world.""" start="00:19:39.080" video="mainVideo-maint" id="subtitle"]]
+[[!template text="""So, um, yeah. Let's go!""" start="00:19:43.880" video="mainVideo-maint" id="subtitle"]]
+
+
+
+Captioner: sid
+
+Questions or comments? Please e-mail [sid@drym.org](mailto:sid@drym.org?subject=Comment%20for%20EmacsConf%202022%20maint%3A%20Maintaining%20the%20Maintainers%3A%20Attribution%20as%20an%20Economic%20Model%20for%20Open%20Source)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/maint-before.md b/2022/info/maint-before.md
new file mode 100644
index 00000000..b37e44d3
--- /dev/null
+++ b/2022/info/maint-before.md
@@ -0,0 +1,60 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="maint">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect stroke-width="3" x="549" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 20-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-maint>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T19:50:00Z" end="2022-12-03T20:10:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~2:50 PM - 3:10 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~1:50 PM - 2:10 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~12:50 PM - 1:10 PM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~11:50 AM - 12:10 PM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~7:50 PM - 8:10 PM UTC <br />Saturday, Dec 3 2022, ~8:50 PM - 9:10 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~9:50 PM - 10:10 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~1:20 AM - 1:40 AM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~3:50 AM - 4:10 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~4:50 AM - 5:10 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="maint-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="maint-mainVideo" data="""
+00:00.000 Problems
+00:18.840 Solution?
+00:30.840 A common underlying problem
+00:55.840 Capitalism
+02:05.760 Copyright
+03:49.840 An attribution-based economic system is efficient
+05:01.760 Gyroscopes
+07:45.200 Prototypes
+09:05.920 Founding documents
+10:05.920 Declaration of non-ownership
+10:24.320 The financial model
+11:23.240 The attribution model
+12:49.120 The accounting system
+13:59.920 drym.org Github account
+15:17.600 Expanding the boundary
+17:11.560 Adopting this idea
+18:39.160 Closing thoughts
+19:04.080 Taking care of one another
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.webm">Download --main.webm (64MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.opus">Download --main.opus (11MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/6vrCBs7r9RELh2byQ4CMsj">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="maint-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="maint-qanda" data="""
+00:18.720 Short recap of what the talk was about?
+02:09.280 What's the incentive to pay?
+04:04.014 What do you think of projects like OpenQ?
+04:23.305 Are you aware of SourceCred?
+07:39.889 How is this different from money?
+08:58.080 How would you approach a viable experiment for ABE?
+10:33.999 How do you constrain the cognitive and time burdens of deciding the values of attributed contributions?
+13:29.360 How are the attribution amounts calculated?
+16:29.820 Synchronicity with Bastien's talk last year
+17:28.960 What are your assumptions about human nature?
+21:17.680 What is the URL of the project?
+21:45.002 Check out the prototype, "Old Abe"
+22:29.520 Closing Remarks
+23:50.320 A flicker of light and following your curiosity
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="maint-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.webm">Download --answers.webm (114MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-maint--maintaining-the-maintainers-attribution-as-an-economic-model-for-open-source--sid-kasivajhula--answers.opus">Download --answers.opus (15MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/maint-nav.md b/2022/info/maint-nav.md
new file mode 100644
index 00000000..44197598
--- /dev/null
+++ b/2022/info/maint-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/realestate">Real estate and Org table formulas</a>
+Next by track: <a href="/2022/talks/health">Health data journaling and visualization with Org Mode and gnuplot</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/meetups-after.md b/2022/info/meetups-after.md
new file mode 100644
index 00000000..e05ba4c0
--- /dev/null
+++ b/2022/info/meetups-after.md
@@ -0,0 +1,899 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="meetups-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello everyone, welcome to my talk.""" start="00:00:00.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I hope you all have been""" start="00:00:09.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""enjoying EmacsConf so far, like I am.""" start="00:00:11.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""But you might be wondering,""" start="00:00:14.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;How do I meet fellow Emacs users""" start="00:00:15.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""after the conference?&quot;""" start="00:00:18.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What if I tell you there is a way?""" start="00:00:21.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""The answer is local meetups.""" start="00:00:23.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""These are user groups who arrange events""" start="00:00:26.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""at some frequency, they meet at some frequency.""" start="00:00:29.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That's what we are going to talk about today:""" start="00:00:34.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""attending and organizing Emacs meetups.""" start="00:00:36.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""In other words, enjoying your Emacs journey""" start="00:00:39.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""with more folks!""" start="00:00:41.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I am Bhavin, I am from India,""" start="00:00:43.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and I have been organizing""" start="00:00:45.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Emacs Asia Pacific meetup""" start="00:00:47.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""since last few months [almost 2 years].""" start="00:00:49.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""We will be talking about online meetups""" start="00:00:52.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""most of the time.""" start="00:00:54.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""The beauty of online meetups is,""" start="00:00:57.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you can join any meetups""" start="00:00:59.251" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""if the time permits,""" start="00:01:01.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""if the time zone is same.""" start="00:01:03.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And there is no barrier.""" start="00:01:05.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So let's get started.""" start="00:01:07.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Let's see how a meetup looks like.""" start="00:01:10.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""We will see one of the Emacs APAC meetup's""" start="00:01:14.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""snippet, basically.""" start="00:01:18.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: There is something called org-indent-mode.""" start="00:01:25.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, it's like this org-adapt-indentation""" start="00:01:29.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which is like electric indent.""" start="00:01:33.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Like when you press enter, it will indent.""" start="00:01:34.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There is org-indent-mode, which does not require you""" start="00:01:37.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to actually make the indents physically""" start="00:01:41.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""in the file.""" start="00:01:44.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""It will make things appear indented.""" start="00:01:45.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""This one?""" start="00:01:54.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Yeah.""" start="00:01:55.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Bhavin]: org-adapt-indentation.""" start="00:01:56.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Okay.""" start="00:01:57.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Looks interesting, right?""" start="00:02:03.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, let's get into more details.""" start="00:02:04.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""You might have a question:""" start="00:02:08.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Why I should attend meetups?&quot;""" start="00:02:09.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That's a good question.""" start="00:02:11.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You should always ask &quot;why&quot;.""" start="00:02:12.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""It's an opportunity to learn together.""" start="00:02:14.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You basically meet like-minded people,""" start="00:02:19.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""like-minded Emacs users,""" start="00:02:21.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and you can always have fun, right?""" start="00:02:23.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""You still might have a question:""" start="00:02:27.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;I am a beginner.&quot;""" start="00:02:29.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I would say that's a great avenue for you.""" start="00:02:31.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You get to discover more things.""" start="00:02:34.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can get help if you are facing""" start="00:02:36.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""any issues, any errors.""" start="00:02:38.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And always keep in mind that it's okay""" start="00:02:41.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""if you don't understand everything""" start="00:02:42.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""from the discussions.""" start="00:02:44.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There are going to be times where everything is…,""" start="00:02:45.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""all the topics you are not able to understand,""" start="00:02:49.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which is totally fine.""" start="00:02:51.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;I am an experienced user.&quot;""" start="00:02:56.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I would say that's even better""" start="00:02:58.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""because you can help others""" start="00:03:00.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""during the meetup.""" start="00:03:01.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And usually, in Emacs or in general,""" start="00:03:03.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""there is always something new to learn.""" start="00:03:06.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There are plenty of packages.""" start="00:03:08.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There might be something""" start="00:03:10.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you have never tried.""" start="00:03:11.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And there are always going to be""" start="00:03:12.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""different workflows of using something.""" start="00:03:13.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""So now, how do I become part of a meetup, right?""" start="00:03:16.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;How do I become part of a meetup group?&quot;""" start="00:03:23.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""The first step you might be doing is""" start="00:03:26.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""finding a meetup.""" start="00:03:29.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There is this page,""" start="00:03:30.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""EmacsWiki page called Usergroups,""" start="00:03:32.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""currently maintained""" start="00:03:35.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""by Leo and Sacha.""" start="00:03:37.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, let's see how that page looks like.""" start="00:03:38.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""As you can see, this page tells you""" start="00:03:46.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""about all the upcoming events.""" start="00:03:48.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And it also has a list of all the meetup groups.""" start="00:03:51.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, you can find all the groups there.""" start="00:04:05.485" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Once you find one,""" start="00:04:10.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you need to join them, right?""" start="00:04:11.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""How to join differs from group to group""" start="00:04:13.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""but usually you will find a way to subscribe""" start="00:04:17.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to their mailing list or RSS feed,""" start="00:04:20.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""join their IRC channels.""" start="00:04:23.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They might have accounts on some platforms""" start="00:04:24.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""like Mobilizon or meetup.com.""" start="00:04:27.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can just go there and join,""" start="00:04:29.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that you get notified""" start="00:04:31.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""whenever there is a new event.""" start="00:04:32.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Now, seeing that list,""" start="00:04:36.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you might say, &quot;There are too many events""" start="00:04:39.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""of my interest.&quot;""" start="00:04:42.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Don't worry, there is a solution.""" start="00:04:42.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There is an Emacs calendar,""" start="00:04:47.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you can subscribe to this calendar.""" start="00:04:49.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's see what all events""" start="00:04:51.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""are there in this particular calendar.""" start="00:04:55.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""This month there is Emacs Berlin to start with""" start="00:04:56.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and then there is EmacsConf,""" start="00:05:00.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""then Emacs APAC is also there.""" start="00:05:02.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's see…, there is a companion website""" start="00:05:06.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for this calendar as well.""" start="00:05:15.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's go to the website also.""" start="00:05:17.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You will see all the options, how to import it.""" start="00:05:19.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There is ICS file,""" start="00:05:24.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""there are different time zones,""" start="00:05:26.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Org mode files.""" start="00:05:28.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can just go there and subscribe.""" start="00:05:29.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;How do I make most of it?""" start="00:05:33.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If I am attending a meetup,""" start="00:05:38.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""how do I make most of it?&quot;""" start="00:05:40.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I would say never hesitate""" start="00:05:42.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""from asking questions.""" start="00:05:44.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If there is something new,""" start="00:05:45.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""something you don't understand,""" start="00:05:46.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""just go ahead and ask questions.""" start="00:05:47.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Ask for help if you are stuck somewhere.""" start="00:05:49.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There are going to be new things,""" start="00:05:51.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so make sure you note them down,""" start="00:05:54.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and you can try those later.""" start="00:05:56.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If possible, have a microphone or webcam on,""" start="00:05:58.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that you can connect with others very easily.""" start="00:06:04.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If that's not an option for some reason,""" start="00:06:07.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""it's fine, you can always use chat""" start="00:06:10.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and interact with everyone.""" start="00:06:12.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, don't make that a reason for not attending.""" start="00:06:13.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Go ahead and attend,""" start="00:06:18.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""even if you just have chat as an option""" start="00:06:20.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to interact with others.""" start="00:06:22.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Wait, I still have questions.&quot;""" start="00:06:23.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Definitely.""" start="00:06:27.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If you have more questions,""" start="00:06:28.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""go ahead and post those.""" start="00:06:30.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I will come to them at the end.""" start="00:06:31.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Now we know how to attend,""" start="00:06:34.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""what are the things you need to do""" start="00:06:42.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""if you want to attend.""" start="00:06:44.651" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;What if I want to start my own meetup group?&quot;""" start="00:06:45.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Because there is no regional group,""" start="00:06:48.418" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or there is something very specific""" start="00:06:51.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which you want to start a group about.""" start="00:06:53.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Again, &quot;Why should I start a meetup group?&quot;""" start="00:06:55.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""It is a way, I would say, to give back""" start="00:07:01.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to the community by creating a platform""" start="00:07:05.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for people to interact.""" start="00:07:08.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You give speakers a platform,""" start="00:07:10.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you also give a platform to the attendees.""" start="00:07:15.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And obviously to have fun with others.""" start="00:07:17.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""There are some common questions""" start="00:07:19.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which might come up,""" start="00:07:25.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""something like,""" start="00:07:26.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;How much effort do I need to put?&quot;""" start="00:07:28.051" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Personally, I don't have to put""" start="00:07:29.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""more than two hours a month,""" start="00:07:32.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""that's including the time""" start="00:07:34.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I attend the meetup.""" start="00:07:36.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;What if I'm new to Emacs?&quot;""" start="00:07:37.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That's totally fine.""" start="00:07:42.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You don't have to know Emacs,""" start="00:07:43.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you don't have to be an expert""" start="00:07:45.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to start a meetup group.""" start="00:07:47.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That's totally fine.""" start="00:07:48.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You will have more folks joining in""" start="00:07:49.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""with different experiences.""" start="00:07:51.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That's totally fine to be a beginner""" start="00:07:54.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""in Emacs to start a meetup.""" start="00:07:57.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;How do I do it now?&quot;""" start="00:07:58.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, let's look at some specifics,""" start="00:08:02.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""some questions you might need to answer""" start="00:08:05.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""in order to start your meetup group.""" start="00:08:08.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Format of the meetup.""" start="00:08:10.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What participants will do during the meetup?""" start="00:08:13.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's see one of the options,""" start="00:08:17.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""this is one of my favorites.""" start="00:08:20.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Keep it simple, a bit unstructured""" start="00:08:23.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and have free flowing discussions.""" start="00:08:26.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What does that mean?""" start="00:08:28.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That basically means letting people""" start="00:08:30.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""ask questions, share new things they have found,""" start="00:08:32.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""let them ask doubts, let them ask for help.""" start="00:08:35.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""During this free flowing discussions,""" start="00:08:39.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you can go through Emacs News as well,""" start="00:08:44.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""go through the topics, and you might find""" start="00:08:46.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""something interesting which you can talk about.""" start="00:08:49.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Why I prefer discussions?""" start="00:08:52.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Discussions basically give an opportunity""" start="00:08:57.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to all the participants to participate.""" start="00:09:00.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They get to talk about what they know""" start="00:09:03.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""rather than just having one way talk.""" start="00:09:06.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They can basically participate""" start="00:09:09.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""by putting up their thoughts.""" start="00:09:12.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Everyone gets to learn more""" start="00:09:13.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""as topics change.""" start="00:09:17.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Usually during these free flowing discussions,""" start="00:09:18.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""topics keep changing""" start="00:09:21.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and that's how you get to learn more.""" start="00:09:22.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""This also has less friction for the speakers.""" start="00:09:25.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They won't have a burden that,""" start="00:09:29.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Okay, I have a talk in the meetup""" start="00:09:31.651" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I need to prepare.&quot;""" start="00:09:34.485" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That just increases friction for them""" start="00:09:35.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to participate.""" start="00:09:38.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If you are having a free flowing discussion,""" start="00:09:39.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""it's basically just a matter of saying,""" start="00:09:42.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Hey, maybe I would like to share my screen,""" start="00:09:44.685" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and I'll talk about this particular thing.&quot;""" start="00:09:47.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""What about talks?""" start="00:09:49.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Everyone loves talks, even I do.""" start="00:09:53.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, make sure you are also accommodating talks,""" start="00:09:55.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""allow people to submit talks,""" start="00:09:58.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and have talks plus discussions.""" start="00:10:00.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can also host watch parties.""" start="00:10:03.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can pick up""" start="00:10:07.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""any of the talks from EmacsConf""" start="00:10:09.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for anything which is out there,""" start="00:10:11.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and you can watch it together,""" start="00:10:14.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and you can have discussion""" start="00:10:15.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""about that particular talk.""" start="00:10:17.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""The next question""" start="00:10:18.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you might need to answer""" start="00:10:23.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""is frequency of the meetup.""" start="00:10:24.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""How often the group is going to meet?""" start="00:10:25.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""One option is recurring meetups.""" start="00:10:28.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So something like, you meet every month""" start="00:10:32.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""on a specific day time.""" start="00:10:37.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Another option is one-off meetups.""" start="00:10:39.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can meet whenever you have""" start="00:10:43.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""some specific talk,""" start="00:10:46.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""some specific discussion topic.""" start="00:10:47.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What you can do about the timing is,""" start="00:10:49.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""if you are targeting a specific region,""" start="00:10:52.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""make sure [people from] all the time zones""" start="00:10:54.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""from that region are able to attend.""" start="00:10:56.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Now you have figured out everything""" start="00:10:58.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and you are going to schedule the meetup.""" start="00:11:04.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, &quot;Should I schedule and just wait?&quot;""" start="00:11:06.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""No.""" start="00:11:08.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Go ahead and spread the word about it.""" start="00:11:08.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's see what we can do.""" start="00:11:10.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can post on social media about your event.""" start="00:11:12.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Usually do it a week or two before,""" start="00:11:16.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that people can plan their other things.""" start="00:11:19.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Share it on local GNU/Linux user groups.""" start="00:11:24.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They might have IRC channels, mailing lists,""" start="00:11:27.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so you should share your event there.""" start="00:11:30.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Reddit seems to be a popular place as well.""" start="00:11:32.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Many people follow and are there,""" start="00:11:35.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so you can post about your event there as well.""" start="00:11:37.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""The next option is adding your event""" start="00:11:39.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to Emacs calendar.""" start="00:11:43.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You should get your event added""" start="00:11:45.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to the EmacsWiki and the calendar,""" start="00:11:47.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which we saw in the first part.""" start="00:11:49.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And the instructions are given there.""" start="00:11:51.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, whenever you schedule a meetup,""" start="00:11:53.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you should definitely add your event""" start="00:11:55.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to those places.""" start="00:11:58.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Next thing you should do is…,""" start="00:11:58.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""these are few points""" start="00:12:02.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which you should do during the meetup.""" start="00:12:04.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You should start with the introductions.""" start="00:12:07.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Introductions serve as an icebreaker, usually.""" start="00:12:10.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They make everyone speak about themselves,""" start="00:12:14.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that everyone knows each other""" start="00:12:18.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a bit at least.""" start="00:12:20.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Make sure it is possible for others""" start="00:12:21.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to participate via chat.""" start="00:12:24.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, if there are some messages in the chat,""" start="00:12:27.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""make sure you relay those to others""" start="00:12:30.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""who are talking via audio/video.""" start="00:12:32.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Share your website at the end,""" start="00:12:35.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that people know and they can follow it,""" start="00:12:39.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and they can join the next event.""" start="00:12:41.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""The next is keeping track of time.""" start="00:12:44.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Make sure you keep track of time.""" start="00:12:48.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Have some time, let's say, 1 hour""" start="00:12:50.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or slightly more than that""" start="00:12:52.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and time-bound your event,""" start="00:12:54.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that we respect everyone's time""" start="00:12:56.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and we conclude in time.""" start="00:12:58.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Now your meetup was done,""" start="00:13:00.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""it was good, people attended.""" start="00:13:05.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What's next?""" start="00:13:06.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Publishing the recordings, I would say.""" start="00:13:07.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You should consider publishing the talks""" start="00:13:10.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or discussions both.""" start="00:13:14.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""The reason being people can revisit the things.""" start="00:13:15.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Usually people go back""" start="00:13:20.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and watch the recordings again.""" start="00:13:21.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And those who were not able to attend,""" start="00:13:23.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""they can also participate""" start="00:13:26.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""by watching the recording.""" start="00:13:27.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can do even more.""" start="00:13:28.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can have captions for the videos,""" start="00:13:32.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that people can enjoy the talks""" start="00:13:34.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""way better than just audio video.""" start="00:13:37.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And you can even have written summaries""" start="00:13:40.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""of the discussions,""" start="00:13:43.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""something like with links.""" start="00:13:44.451" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's see some of the examples of summaries.""" start="00:13:45.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""This is one of the summaries""" start="00:13:48.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for Austin meetup""" start="00:13:55.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and this is written by someone""" start="00:13:56.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""who is participating during that meetup.""" start="00:13:59.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can see they have put up their thoughts,""" start="00:14:01.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""what they think about something""" start="00:14:04.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""they got to know in the event.""" start="00:14:05.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Another example we can see is M-x Research.""" start="00:14:08.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can see they have put up""" start="00:14:14.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""all the discussion points.""" start="00:14:16.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They even have action items from the meetup.""" start="00:14:18.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""One more example we can see is Emacs APAC.""" start="00:14:21.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What I have done here is,""" start="00:14:25.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I have mentioned the topic and links,""" start="00:14:28.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""who shared what.""" start="00:14:30.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And that's about post meetup stuff.""" start="00:14:32.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can keep it simple.""" start="00:14:36.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Just start with hosting your video recordings,""" start="00:14:38.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and just start with basic links and details.""" start="00:14:40.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""So, are we ready to start a meetup?""" start="00:14:44.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Definitely.""" start="00:14:50.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's see some of the points""" start="00:14:52.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or checklist, I would say,""" start="00:14:54.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you should do before you start""" start="00:14:56.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a meetup group.""" start="00:14:57.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""What are the next steps?""" start="00:14:58.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Have a co-organizer.""" start="00:14:59.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, have at least one co-organizer or person""" start="00:15:04.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to talk to during the meetup,""" start="00:15:07.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so that even if no one shows up""" start="00:15:09.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you will have someone to talk to""" start="00:15:12.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and you both can discuss""" start="00:15:14.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""about the topic you decided to.""" start="00:15:16.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If your friend or the person""" start="00:15:20.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""you have reached out to""" start="00:15:22.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""are hesitant to become a &quot;co-organizer&quot;,""" start="00:15:23.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""because that feels like responsibility,""" start="00:15:26.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""it's fine.""" start="00:15:28.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can ask them to just come with you""" start="00:15:29.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and have the discussion during the event.""" start="00:15:32.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And like Andrea explained""" start="00:15:36.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""in his talk about 'buddy',""" start="00:15:38.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""buddy is someone who is helping you""" start="00:15:40.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""with your Emacs journey.""" start="00:15:43.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Buddies and their mentees""" start="00:15:45.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""can make their meeting public,""" start="00:15:48.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and that can be a good way to start""" start="00:15:52.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or spin-off a meetup.""" start="00:15:56.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Have a website for your meetup.""" start="00:15:57.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You should definitely have a website""" start="00:16:01.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""where people can go and read""" start="00:16:04.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""about your event or the group.""" start="00:16:05.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Keep it simple.""" start="00:16:08.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Have RSS feed, so that people can subscribe.""" start="00:16:10.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And whenever you have new talks,""" start="00:16:13.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""make sure you add those talks""" start="00:16:15.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to the announcement pages.""" start="00:16:17.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Let's quickly see some of the example websites.""" start="00:16:18.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""The first one here is again""" start="00:16:23.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Emacs Asia-Pacific event.""" start="00:16:32.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can see we have details,""" start="00:16:34.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""what is the timing, how to submit a talk,""" start="00:16:36.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""how to attend.""" start="00:16:41.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Next example is Emacs Berlin.""" start="00:16:42.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, you can see they have mentioned""" start="00:16:45.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""what is the next event,""" start="00:16:47.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""which were the previous events,""" start="00:16:48.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""how to participate, how to stay updated.""" start="00:16:51.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""And similarly, there is M-x Research as well.""" start="00:16:53.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They have mentioned what are the events,""" start="00:16:57.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""what are the upcoming events and all.""" start="00:16:59.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can just get started""" start="00:17:00.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""by taking any of the websites,""" start="00:17:09.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and just modify it to your liking.""" start="00:17:11.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""That's totally fine.""" start="00:17:13.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""The next thing you will need""" start="00:17:14.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""is a video conferencing tool.""" start="00:17:17.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""It should support video, screen share, chat.""" start="00:17:19.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""These are the few of""" start="00:17:23.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""the free software options.""" start="00:17:25.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""One is BigBlueButton""" start="00:17:27.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and another is Jitsi Meet.""" start="00:17:29.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can request for an account""" start="00:17:31.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""on the given instance to EmacsConf organizers""" start="00:17:33.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""on this mailing list,""" start="00:17:36.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or you can stick to any""" start="00:17:38.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""of the Jitsi Meet instances.""" start="00:17:40.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Communication media.""" start="00:17:42.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You should have at least some way""" start="00:17:45.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for people to interact post meetup""" start="00:17:47.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or before the meetup.""" start="00:17:51.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""You can use any of the existing IRC channels, #emacsconf,""" start="00:17:53.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or maybe you can use the existing""" start="00:17:57.386" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""GNU/Linux user groups lists.""" start="00:17:59.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""I would recommend you to read or watch""" start="00:18:01.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Starting an Emacs meetup&quot; by Harry Schwartz.""" start="00:18:07.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""They have mentioned details""" start="00:18:11.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""about in-person meetups,""" start="00:18:13.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""but there are many important points""" start="00:18:14.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to consider in that post""" start="00:18:17.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""as well as in the recording.""" start="00:18:20.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""So, go ahead and definitely watch""" start="00:18:21.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""before you start your meetup.""" start="00:18:23.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If you need any help with""" start="00:18:24.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""BigBlueButton account, hosting,""" start="00:18:29.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or captioning the talk recordings""" start="00:18:32.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for very specific or good talks,""" start="00:18:35.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""don't hesitate to reach out to""" start="00:18:37.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""EmacsConf organizers.""" start="00:18:38.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""There are many volunteers""" start="00:18:40.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""subscribed to that list,""" start="00:18:42.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""so you will definitely find""" start="00:18:43.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""someone to help you.""" start="00:18:45.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""I had one idea.""" start="00:18:50.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If you are one of the organizers,""" start="00:18:50.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""or if you plan to start a meetup,""" start="00:18:53.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I was thinking if""" start="00:18:55.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""we can have a common platform""" start="00:18:57.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for all the organizers""" start="00:18:59.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""to discuss what they are doing,""" start="00:19:00.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""what they are experimenting.""" start="00:19:01.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If you are interested,""" start="00:19:04.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""drop me an email at this email address.""" start="00:19:06.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""If I get somewhere with this idea,""" start="00:19:10.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I will definitely involve everyone""" start="00:19:13.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""who is interested.""" start="00:19:15.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""With that, we come to the end of my talk.""" start="00:19:16.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""I would like to thank Sacha and Leo""" start="00:19:21.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""for their inputs while I was creating this talk,""" start="00:19:23.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""and thank you for joining.""" start="00:19:26.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Now it is time for the questions.""" start="00:19:30.040" video="mainVideo-meetups" id="subtitle"]]
+
+<a name="meetups-mainVideo-transcript-es"></a>
+# Spanish
+
+[[!template new="1" text="""Hola a todos y todas. Bienvenidos y bienvenidas a mi conferencia.""" start="00:00:00.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Espero que todos y todas hayan disfrutado hasta ahora""" start="00:00:09.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de EmacsConf, como lo hago yo.""" start="00:00:11.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Pero podrían preguntarse,""" start="00:00:14.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;¿Cómo me encuentro con usuarios y usuarias de Emacs""" start="00:00:15.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""luego de la conferencia?&quot;""" start="00:00:18.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Qué pasaría si les digo que hay una manera?""" start="00:00:21.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""La respuesta son los encuentros locales.""" start="00:00:23.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Estos son grupos locales que organizan eventos""" start="00:00:26.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Se encuentran con cierta frecuencia.""" start="00:00:29.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Eso es de lo que vamos a hablar hoy:""" start="00:00:34.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""asistir a encuentros de Emacs y también organizarlos.""" start="00:00:36.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""En otras palabras,""" start="00:00:39.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""disfrutar de tu peregrinaje por Emacs con más gente!""" start="00:00:41.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Soy Bhavin. Vengo de India,""" start="00:00:43.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y he organizado""" start="00:00:45.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""el encuentro Emacs Asia Pacific""" start="00:00:47.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""desde hace casi 2 años.""" start="00:00:49.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hablaré acerca de los encuentros en línea""" start="00:00:52.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""la mayoría del tiempo.""" start="00:00:54.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""La belleza de los encuentros en línea es""" start="00:00:57.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que puedes unirte a cualquier encuentro,""" start="00:00:59.251" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""si tu tiempo lo permite,""" start="00:01:01.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""sin importar la zona horaria.""" start="00:01:03.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""... y no existen barreras.""" start="00:01:05.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que comencemos.""" start="00:01:07.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Veamos qué aspecto tienen los encuentros.""" start="00:01:10.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Básicalmente, veremos una parte""" start="00:01:14.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de un encuentro Emacs APAC.""" start="00:01:18.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: Existe algo llamado org-indent-mode.""" start="00:01:25.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: Es como org-adapt-indentation""" start="00:01:29.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: que es como la indentación eléctrica.""" start="00:01:33.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: Cuando presionas enter, [el texto] será indentado.""" start="00:01:34.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: Existe org-indent-mode, que no requiere""" start="00:01:37.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: que insertes las indentaciones físicamente""" start="00:01:41.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: en el archivo.""" start="00:01:44.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""[Ihor]: Hará que las cosas parezcan indentadas.""" start="00:01:45.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Este?""" start="00:01:54.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""""" start="00:01:55.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""org-adapt-indentation""" start="00:01:56.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""De acuerdo.""" start="00:01:57.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Parece interesante, ¿verdad?""" start="00:02:03.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que entremos en detalles.""" start="00:02:04.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Podrías tener una pregunta:""" start="00:02:08.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;¿Por qué debo asistir a encuentros?&quot;""" start="00:02:09.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Esa es una buena pregunta.""" start="00:02:11.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Siempre debieras preguntar &quot;¿por qué&quot;.""" start="00:02:12.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Es una oportunidad de aprender juntos y juntas.""" start="00:02:14.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Tú basicamente te encuentras con gente que piensa igual,""" start="00:02:19.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""usuarios y usuarias de Emacs que piensan igual.""" start="00:02:21.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""... y siempre puedes divertirte, ¿verdad?""" start="00:02:23.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Podrías tener una preocupación:""" start="00:02:27.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Soy un novato o una novata.&quot;""" start="00:02:29.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Yo diría que hay una gran oportunidad para tí.""" start="00:02:31.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes descubrir más cosas.""" start="00:02:34.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes conseguir ayuda, si encuentras""" start="00:02:36.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""dificultades, errores.""" start="00:02:38.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y siempre recuerda que estará bien""" start="00:02:41.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""si no entiendes todo""" start="00:02:42.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""en las conversaciones.""" start="00:02:44.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Habrá momentos cuando todo sea...""" start="00:02:45.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que otros temas no sean comprensibles;""" start="00:02:49.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""lo cual es totalmente comprensible.""" start="00:02:51.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;Soy un usuario experimentado o una usuaria experimentada.&quot;""" start="00:02:56.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Diría que esta situación es aún mejor""" start="00:02:58.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""porque puedes ayudar a otros y otras""" start="00:03:00.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""durante un encuentro.""" start="00:03:01.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y usualmente, en Emacs o en general,""" start="00:03:03.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""siempre hay algo nuevo que aprender.""" start="00:03:06.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hay abundancia de paquetes.""" start="00:03:08.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Podría haber algo""" start="00:03:10.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que nunca haz probado.""" start="00:03:11.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y siempre habrá""" start="00:03:12.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""diferentes flujos de trabajo para usar [un paquete].""" start="00:03:13.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Así que ahora te preguntarás: ¿cómo me vuelvo parte de un encuentro? ¿Verdad?""" start="00:03:16.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;¿Cómo me vuelvo parte del grupo de un encuentro?&quot;""" start="00:03:23.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""El primer paso que podrías emprender""" start="00:03:26.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""es buscar un encuentro.""" start="00:03:29.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Existe una página""" start="00:03:30.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""del EmacsWiki https://www.emacswiki.org/emacs/Usergroups""" start="00:03:32.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""mantenida actualmente""" start="00:03:35.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""por Leo y por Sacha.""" start="00:03:37.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que, veamos cómo se ve esa página.""" start="00:03:38.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Como puedes ver, esta página se refiere""" start="00:03:46.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a todos los eventos que vendrán.""" start="00:03:48.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Además, tiene una lista de todos los grupos de encuentros.""" start="00:03:51.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que, puedes encontrar todos los grupos ahí.""" start="00:04:05.485" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""En cuanto encuentres uno,""" start="00:04:10.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""debes unirte a ellos, ¿verdad?""" start="00:04:11.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Cómo unirte difiere de grupo a grupo""" start="00:04:13.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""pero usualmente encontrarás una forma de suscribirte""" start="00:04:17.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a su lista de correo o a sus noticias RSS,""" start="00:04:20.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""únete a su canal de IRC.""" start="00:04:23.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Podrían tener cuentas en diferentes plataformas""" start="00:04:24.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""como Mobilizon o meetup.com [cuidado de que contengan Javascript privativo].""" start="00:04:27.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes ir allá y unirte,""" start="00:04:29.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que te notifiquen""" start="00:04:31.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cuando hay un evento nuevo.""" start="00:04:32.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Ahora, al ver esa lista""" start="00:04:36.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""puedes decir, &quot;Hay demasiados eventos""" start="00:04:39.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de mi interés.&quot;""" start="00:04:42.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""No te preocupes. Hay una solución.""" start="00:04:42.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Existe un calendario Emacs.""" start="00:04:47.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes suscribirte a este calendario.""" start="00:04:49.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Veamos qué eventos""" start="00:04:51.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""hay en este calendario en particular.""" start="00:04:55.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Este mes hay Emacs Berlin para comenzar""" start="00:04:56.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y luego hay EmacsConf.""" start="00:05:00.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Luego hay Emacs APAC, que también está ahí.""" start="00:05:02.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Veamos ... existe un sitio web acompañante""" start="00:05:06.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para este calendario también.""" start="00:05:15.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Vayamos a ese sitio web.""" start="00:05:17.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Verás todas las opciones, como importarlo a tu software.""" start="00:05:19.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hay un archivo ICS.""" start="00:05:24.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hay diferentes zonas horarias,""" start="00:05:26.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""archivos Org mode.""" start="00:05:28.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes simplemente ir allá y suscribirte.""" start="00:05:29.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;¿Cómo lo aprovecho al máximo?""" start="00:05:33.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si asisto a un encuentro,""" start="00:05:38.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿cómo aprovecho al máximo?&quot;""" start="00:05:40.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Yo diría que nunca dudes""" start="00:05:42.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""en hacer preguntas.""" start="00:05:44.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si hay algo nuevo,""" start="00:05:45.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""algo que no entiendas,""" start="00:05:46.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""solamente haz las preguntas.""" start="00:05:47.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Pide ayuda, si te encuentras atascado con algún problema.""" start="00:05:49.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""También existirán asuntos nuevos.""" start="00:05:51.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que asegúrate de tomar nota""" start="00:05:54.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y podrás intentar probarlos luego.""" start="00:05:56.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si es posible, ten listo un micrófono o cámara web encendidas.""" start="00:05:58.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""De esa manera podrás conectarte con otres de manera rápida.""" start="00:06:04.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si esa no es una opción por alguna razón,""" start="00:06:07.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""está bien. Siempre puedes usar el chat""" start="00:06:10.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""e interactuar con todas y con todos.""" start="00:06:12.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que esa no es una razón para no asistir.""" start="00:06:13.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Anímate y asiste,""" start="00:06:18.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""aunque solamente tengas el chat como única opción""" start="00:06:20.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para interactuar con otras y otros.""" start="00:06:22.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Espera. Aún tengo preguntas.&quot;""" start="00:06:23.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Seguro.""" start="00:06:27.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si tienes más preguntas,""" start="00:06:28.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""plantéalas.""" start="00:06:30.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Llegaré a ellas al final.""" start="00:06:31.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Ahora sabemos cómo asistir,""" start="00:06:34.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cuáles son las cosas que debes hacer""" start="00:06:42.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""si deseas asistir.""" start="00:06:44.651" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;¿Qué pasa si deseo iniciar mi propio grupo de encuentro?&quot;""" start="00:06:45.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""porque no hay un grupo regional""" start="00:06:48.418" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o existe un tema muy específico""" start="00:06:51.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""del que quieres tener un grupo particular.""" start="00:06:53.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""De nuevo, &quot;¿Por qué debería iniciar un grupo de encuentro?&quot;""" start="00:06:55.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Es una manera, diría yo, para tener reciprocidad""" start="00:07:01.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""con la comunidad, mediante la creación de una plataforma""" start="00:07:05.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que la gente interactúe.""" start="00:07:08.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Ofreces a los conferencistas una plataforma.""" start="00:07:10.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""También le ofreces una platforma a los asistentes.""" start="00:07:15.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y, obviamente, para divertirse junto con otros.""" start="00:07:17.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Hay preguntas comunes""" start="00:07:19.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que pueden presentarse.""" start="00:07:25.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Algo como:""" start="00:07:26.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;¿Cuánto esfuerzo se requiere?&quot;""" start="00:07:28.051" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Personalmente, yo no debo poner""" start="00:07:29.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""más de dos horas por mes.""" start="00:07:32.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Eso incluye el tiempo""" start="00:07:34.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para atender al encuentro.""" start="00:07:36.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;¿Qué pasa si soy novato en Emacs?&quot;""" start="00:07:37.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Eso no importa.""" start="00:07:42.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""No necesitas saber Emacs.""" start="00:07:43.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""No necesitas ser un experto""" start="00:07:45.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""par iniciar un groupo de encuentro.""" start="00:07:47.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Está muy bien.""" start="00:07:48.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Tendrás más gente que se una""" start="00:07:49.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""con diferente experiencia.""" start="00:07:51.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Es totalmente aceptable ser un novato""" start="00:07:54.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""en Emacs para iniciar un encuentro.""" start="00:07:57.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""&quot;Ahora, ¿cómo lo hago?&quot;""" start="00:07:58.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que, veamos algunos detalles,""" start="00:08:02.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""algunas preguntas que podrías necesitar contestar""" start="00:08:05.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para iniciar tu grupo de encuentro.""" start="00:08:08.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Formato del encuentro.""" start="00:08:10.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Qué harán los participantes durante el encuentro?""" start="00:08:13.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Veamos una de las opciones.""" start="00:08:17.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Esta es una de mis favoritas.""" start="00:08:20.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Mantenlo sencillo, un poco desestructurado""" start="00:08:23.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y asegúrate de que las conversaciones fluyan libremente.""" start="00:08:26.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Qué sígnifica eso?""" start="00:08:28.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Basicamente significa dejar a las personas""" start="00:08:30.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""preguntar, compartir nuevas cosas que han encontrado.""" start="00:08:32.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Permíteles preguntar sobre sus dudas. Premíteles pedir ayuda.""" start="00:08:35.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Durante estas conversaciones de libre flujo,""" start="00:08:39.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""puedes también cubrir Noticas de Emacs.""" start="00:08:44.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Revisa los temas y podrías encontrar""" start="00:08:46.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""algo interesante de lo que puedas hablar.""" start="00:08:49.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""¿Por qué prefiero las conversaciones?""" start="00:08:52.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Básicamente, las conversaciones brindan una oportunidad""" start="00:08:57.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para todos los asistentes a participar.""" start="00:09:00.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Logran hablar de lo que conocen,""" start="00:09:03.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""en lugar de solamente tener un monólogo.""" start="00:09:06.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Pueden participar, básicamente""" start="00:09:09.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""al exponer sus pensamientos.""" start="00:09:12.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Todos consiguen aprender más""" start="00:09:13.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""mientras cambian los temas.""" start="00:09:17.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Usualmente durante estas conversaciones de libre flujo,""" start="00:09:18.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""los temas siguen cambiando""" start="00:09:21.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y esa es la manera en que consigues aprender más.""" start="00:09:22.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Esto también ofrece menos fricción para les conferencistas.""" start="00:09:25.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""No sentirán el peso de:""" start="00:09:29.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;De acuerdo, tengo que dar una conferencia en este encuentro""" start="00:09:31.651" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que requiero preparar.&quot;""" start="00:09:34.485" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Eso solamente incrementa la fricción para que ellos""" start="00:09:35.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""participen.""" start="00:09:38.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si logras una conversación de libre flujo,""" start="00:09:39.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""solamente es asunto de decir:""" start="00:09:42.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Hey, Quizá quiera compartir mi pantalla""" start="00:09:44.685" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y hablaré de este tema en particular.&quot;""" start="00:09:47.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""¿Qué hay sobre las conferencias?""" start="00:09:49.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Todos adoran las conferencias, incluso yo.""" start="00:09:53.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que asegúrate de acomodar las conferencias también.""" start="00:09:55.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Permite a la gente presentar sus conferencias""" start="00:09:58.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y sostén conferencias y conversaciones.""" start="00:10:00.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""También puedes sostener proyecciones.""" start="00:10:03.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes tomar""" start="00:10:07.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cualquiera de las conferencias de EmacsConf,""" start="00:10:09.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de lo que quiera que se encuentre ahí,""" start="00:10:11.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y puedes mirarla juntos.""" start="00:10:14.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Luego pueden tener una conversación""" start="00:10:15.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""acerca de esa conferencia en particular.""" start="00:10:17.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""La siguiente pregunta""" start="00:10:18.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que podrías necesitar contestar""" start="00:10:23.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""es acerca de la frecuencia de los encuentros.""" start="00:10:24.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Qué tan a menudo se reunirá el grupo?""" start="00:10:25.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Una opción son los encuentros recurrentes.""" start="00:10:28.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que algo como, reunirse cada mes""" start="00:10:32.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""un día específico a cierta hora.""" start="00:10:37.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Otra opción son los encuentros de una sola ocasión.""" start="00:10:39.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes reunirte cuando sea""" start="00:10:43.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que ofrezcas una conferencia en particular,""" start="00:10:46.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""algún tema específico de conversación.""" start="00:10:47.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Lo que harías sobre los usos horarios es,""" start="00:10:49.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""si apuntas a una región específica,""" start="00:10:52.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""asegúrate que todos puedan asistir""" start="00:10:54.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""desde los distintos usos horarios de esa región.""" start="00:10:56.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Ahora haz descifrado todo""" start="00:10:58.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y que vas a agendar el encuentro.""" start="00:11:04.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que &quot;¿Debiría agendar y solamente esperar?&quot;""" start="00:11:06.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""No.""" start="00:11:08.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Difunde la noticia.""" start="00:11:08.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Veamos qué podemos hacer.""" start="00:11:10.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes publicar en redes sociales el evento.""" start="00:11:12.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Usualmente se debe hacer con una o dos semanas de antelación""" start="00:11:16.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que la gente pueda planificar sus otros asuntos.""" start="00:11:19.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Compártelo en los grupos locales de usuarios de GNU con linux.""" start="00:11:24.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Podrían tener canales de IRC, listas de correo.""" start="00:11:27.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que debes compartir [la convocatoria] a tu evento ahí.""" start="00:11:30.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Reddit también parece ser un lugar popular para anunciar.""" start="00:11:32.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hay mucha gente y seguidores que están ahí.""" start="00:11:35.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que puedes anunciar sobre tu evento ahí tambien.""" start="00:11:37.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""La siguiente opción es agregar tu evento""" start="00:11:39.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""al calendario Emacs.""" start="00:11:43.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Debes conseguir que tu evento se añada""" start="00:11:45.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a EmacsWiki y al calendario,""" start="00:11:47.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que vimos en la primera parte [de esta conferencia].""" start="00:11:49.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y las instrucciones se encuentran ahí.""" start="00:11:51.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que, cuando sea que agendes un encuentro,""" start="00:11:53.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""debes definitivamente añadir tu evento""" start="00:11:55.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a aquellos lugares.""" start="00:11:58.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Lo siguiente que debes hacer es ...""" start="00:11:58.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""estos son algunos puntos""" start="00:12:02.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que debes realizar durante el encuentro.""" start="00:12:04.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Debes iniciar con las introducciones.""" start="00:12:07.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Las introducciones sirven para romper el hielo, usualmente.""" start="00:12:10.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hacen que todos hablen acerca de sí mismos""" start="00:12:14.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que todos se conozcan""" start="00:12:18.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""al menos un poco.""" start="00:12:20.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Haz posible que otros""" start="00:12:21.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""participen via chat.""" start="00:12:24.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""De tal manera que, si hay mensajes en el chat,""" start="00:12:27.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""asegúrate de relegarlos""" start="00:12:30.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a quienes están hablando via audio/video.""" start="00:12:32.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Comparte tu sitio web al final""" start="00:12:35.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que las personas lo sepan y lo sigan""" start="00:12:39.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y para que puedan venir al siguiente evento.""" start="00:12:41.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Lo siguiente es controlar el tiempo.""" start="00:12:44.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Asegúrate de controlar el tiempo.""" start="00:12:48.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Reserva un tiempo, puede ser una hora,""" start="00:12:50.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o algo más que eso,""" start="00:12:52.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y fija ese horario para tu evento""" start="00:12:54.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""con el fin de respetar el tiempo de todos""" start="00:12:56.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y que se termine a tiempo.""" start="00:12:58.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Ahora tu encuentro termina,""" start="00:13:00.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""fue bueno y la gente vino.""" start="00:13:05.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Qué sigue?""" start="00:13:06.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Publicar las grabaciones, diría yo.""" start="00:13:07.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Deberías considerar publicar las conferencias""" start="00:13:10.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o las conversaciones, o ambas.""" start="00:13:14.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""La razón es que las personas pueden revisitarlas.""" start="00:13:15.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Usualmente, la gente vuelve""" start="00:13:20.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y mira las grabaciones nuevamente.""" start="00:13:21.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y aquellos que no pudieron asistir,""" start="00:13:23.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""ellos también pueden participar""" start="00:13:26.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""al observar la grabación.""" start="00:13:27.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes hacer aún más.""" start="00:13:28.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes tener subtítulos para los vídeos""" start="00:13:32.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que la gente pueda disfrutar de las conferencias""" start="00:13:34.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de mejor manera que solamente el audio y el vídeo.""" start="00:13:37.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""E inclusive tú puedes tener resúmenes escritos""" start="00:13:40.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de las conversaciones,""" start="00:13:43.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o algo parecido con los hipervínculos.""" start="00:13:44.451" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Veamos algunos de los ejemplos con los resúmenes.""" start="00:13:45.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Este es uno de los resúmenes""" start="00:13:48.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""del encuentro en Austin [Texas, EEUUA]""" start="00:13:55.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y fue escrito por alguien""" start="00:13:56.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""quien participó durante el encuentro.""" start="00:13:59.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes ver que publicó sus pensamientos,""" start="00:14:01.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""lo que pensaban sobre un asunto""" start="00:14:04.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que aprendieron en el evento.""" start="00:14:05.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Otro ejemplo que podemos ver es M-x investigar.""" start="00:14:08.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes ver lo que han publicado ...""" start="00:14:14.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""todos los puntos de la conversación.""" start="00:14:16.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Incluso han recopilado puntos de acción mediante el encuentro.""" start="00:14:18.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Un ejemplo más que podemos ver es Emacs APAC.""" start="00:14:21.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Lo que he hecho es,""" start="00:14:25.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""yo he mencionado el tema y los hipervínculos ...""" start="00:14:28.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""quién compartió qué.""" start="00:14:30.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y eso es lo que hay sobre asuntos para después del evento.""" start="00:14:32.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes mantenerlo sencillo.""" start="00:14:36.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Solamente inicia con alojar las grabaciones de vídeo""" start="00:14:38.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y solamente inicia con los hipervínculos básicas y con los detalles.""" start="00:14:40.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Así que, ¿estamos listos para iniciar un encuentro?""" start="00:14:44.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¡Definitivamente!""" start="00:14:50.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Repasemos algunos de los puntos""" start="00:14:52.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o hagamos una lista, yo diría,""" start="00:14:54.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""sobre lo que debes hacer antes de iniciar""" start="00:14:56.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""un grupo de encuentro.""" start="00:14:57.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""¿Cuáles son los siguientes pasos?""" start="00:14:58.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Consigue un co-organizador.""" start="00:14:59.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Entonces, ten al menos un co-organizador""" start="00:15:04.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o persona con quien hablar durante el encuentro""" start="00:15:07.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que, aunque nadie más venga,""" start="00:15:09.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""tengas con quien hablar""" start="00:15:12.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y ambos pueden conversar""" start="00:15:14.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""sobre el tema que pretendían.""" start="00:15:16.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si tu amigo o la persona""" start="00:15:20.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que conseguiste""" start="00:15:22.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""duda en convertirse en co-organizadora""" start="00:15:23.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""porque siente que es una responsabilidad,""" start="00:15:26.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""está bien.""" start="00:15:28.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes pedirle que solamente te acompañe""" start="00:15:29.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y sostén la conversación durante el evento.""" start="00:15:32.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y, como Andrea explicó""" start="00:15:36.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""en su conferencia sobre los 'compañeros',""" start="00:15:38.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""'compañero' es quien te ayuda""" start="00:15:40.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""en tu travesía de Emacs.""" start="00:15:43.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Compañeros y pupilos""" start="00:15:45.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""pueden hacer de su encuentro uno que sea público""" start="00:15:48.800" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y esa puede ser una buena manera de comenzar""" start="00:15:52.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a poner a rodar un encuentro.""" start="00:15:56.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Ten un sitio web para tu encuentro.""" start="00:15:57.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Definitivamente debes tener un sitio web""" start="00:16:01.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""donde la gente pueda leer""" start="00:16:04.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""sobre tu evento o sobre el grupo.""" start="00:16:05.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Mantenlo simple.""" start="00:16:08.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Levanta noticias de RSS para que las personas puedan suscribirse.""" start="00:16:10.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y cuando tengas nuevas conferencias,""" start="00:16:13.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""asegúrate de añadir esas conferencias""" start="00:16:15.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a las páginas de anuncios.""" start="00:16:17.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Rápidamente, veamos algunos sitios web de ejemplo.""" start="00:16:18.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""El primero es nuevamente""" start="00:16:23.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""el del evento de Emacs Asia-Pacific.""" start="00:16:32.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes ver que mostramos detalles,""" start="00:16:34.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""el horario, cómo proponer una conferencia,""" start="00:16:36.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cómo asistir.""" start="00:16:41.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""El siguiente ejemplo es Emacs Berlin.""" start="00:16:42.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Ahí puedes ver que han mencionado""" start="00:16:45.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cuál es el siguiente evento,""" start="00:16:47.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cuáles fueron los eventos previos,""" start="00:16:48.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cómo participar, cómo mantenerse actualizado.""" start="00:16:51.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Y de igual manera, existe M-x investigar.""" start="00:16:53.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Han mencionado cuáles son los eventos,""" start="00:16:57.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""cuáles son los eventos venideros y todo lo demás.""" start="00:16:59.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes iniciar,""" start="00:17:00.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""simplemente tomando cualquiera de estos sitios web""" start="00:17:09.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y solamente modifícalos a tu gusto.""" start="00:17:11.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Es totalmente aceptable.""" start="00:17:13.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Lo siguiente que requerirás""" start="00:17:14.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""es de una herramienta para videoconferencia.""" start="00:17:17.640" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Debería soportar vídeo, compartir escritorio, chat.""" start="00:17:19.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Estas son algunas""" start="00:17:23.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de las opciones en software libre.""" start="00:17:25.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Una es BigBlueButton""" start="00:17:27.680" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y otra es Jitsi Meet.""" start="00:17:29.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes solicitar una cuenta en la instancia apropiada""" start="00:17:31.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a los organizadores de EmacsConf""" start="00:17:33.040" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""que están en esta lista de correo,""" start="00:17:36.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o puedes mantenerte en cualquiera""" start="00:17:38.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""de las instancias de Jitsi Meet.""" start="00:17:40.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Medios de comunicación.""" start="00:17:42.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Deberías tener al menos una manera""" start="00:17:45.960" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que la gente interactúe después del encuentro""" start="00:17:47.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y antes del encuentro.""" start="00:17:51.120" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Puedes utilizar cualquiera de los canales existentes en IRC,""" start="00:17:53.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""\#emacsconf, o quizá desees""" start="00:17:55.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""usar las listas de grupos de usuarios de GNU con Linux.""" start="00:17:59.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Recomendaría que leas o mires""" start="00:18:01.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""&quot;Starting an Emacs meetup&quot; por Harry Schwartz.""" start="00:18:07.600" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Ha mencionado los detalles""" start="00:18:11.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""sobre encuentros personales""" start="00:18:13.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""pero hay mucho puntos importantes""" start="00:18:14.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a considerar en esa publicación""" start="00:18:17.720" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""tanto como en la grabación.""" start="00:18:20.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que, ve y definitivamente mira [ese vídeo]""" start="00:18:21.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""antes de iniciar tu encuentro.""" start="00:18:23.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si necesitas ayuda""" start="00:18:24.840" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""con la cuenta, el alojamiento""" start="00:18:29.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o para poner subtítulos a las grabaciones de BigBlueButton""" start="00:18:32.520" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para conferencias muy específicas o buenas,""" start="00:18:35.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""no dudes en buscar""" start="00:18:37.160" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""a los organizadores de EmacsConf.""" start="00:18:38.880" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Hay muchos voluntarios""" start="00:18:40.480" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""suscritos a esa lista [de correo].""" start="00:18:42.320" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Así que definitivamente encontrarás""" start="00:18:43.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""alguien quien te ayude.""" start="00:18:45.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template new="1" text="""Tuve una idea.""" start="00:18:50.080" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si tu eres uno de les organizadores""" start="00:18:50.760" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""o si planeas iniciar un encuentro,""" start="00:18:53.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""pensaba en que si tendríamos""" start="00:18:55.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""una plataforma común""" start="00:18:57.360" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""para que todos les organizadores""" start="00:18:59.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""conversen sobre lo que están haciendo,""" start="00:19:00.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""lo que están expermentando.""" start="00:19:01.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si estás interesado, envíame un correo a este correo electrónico""" start="00:19:04.000" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""bhavin192 [arroba] geeksocket [punto] in.""" start="00:19:06.920" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Si logro llegar a algún lado con esta idea,""" start="00:19:10.400" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""definitivamente involucraré a todos""" start="00:19:13.200" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""quienes estén interesados.""" start="00:19:15.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Con eso, llegamos al final de mi conferencia.""" start="00:19:16.280" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Me gustaría agradecer a Sacha y a Leo""" start="00:19:21.240" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""por sus recomendaciones mientras creaba esta conferencia""" start="00:19:23.440" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""y a ustedes por unirse.""" start="00:19:26.560" video="mainVideo-meetups" id="subtitle"]]
+[[!template text="""Ahora es el momento para las preguntas.""" start="00:19:30.040" video="mainVideo-meetups" id="subtitle"]]
+
+
+
+Captioners: bhavin192, translated to Spanish by quiliro
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20meetups%3A%20Attending%20and%20organizing%20Emacs%20meetups)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/meetups-before.md b/2022/info/meetups-before.md
new file mode 100644
index 00000000..9c5b53b5
--- /dev/null
+++ b/2022/info/meetups-before.md
@@ -0,0 +1,63 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Bhavin Gandhi shares how to participate in Emacs meetups and even how to organize your own. Afterwards, he will handle questions over BigBlueButton. Spanish captions are also available for this talk. You can find them on the talk page.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="meetups">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect stroke-width="3" x="376" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 20-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-meetups>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T18:00:00Z" end="2022-12-03T18:20:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~1:00 PM - 1:20 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~12:00 PM - 12:20 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~11:00 AM - 11:20 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~10:00 AM - 10:20 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~6:00 PM - 6:20 PM UTC <br />Saturday, Dec 3 2022, ~7:00 PM - 7:20 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~8:00 PM - 8:20 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~11:30 PM - 11:50 PM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~2:00 AM - 2:20 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~3:00 AM - 3:20 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="meetups-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.vtt" default /><track label="Spanish" kind="captions" srclang="es" src="/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main_es.vtt" />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="meetups-mainVideo" data="""
+00:00.000 Introduction
+01:10.120 Example from Emacs APAC
+02:08.320 "Why should I attend meetups?"
+02:27.400 "I am a beginner"
+02:56.800 "I am an experienced user"
+03:16.160 Finding meetups
+04:10.000 How to join
+04:36.840 Emacs Calendar
+05:33.200 Making the most of a meetup
+06:45.560 "What if I want to start my own meetup group?"
+07:19.680 "How much effort do I need to put?"
+07:37.880 "What if I'm new to Emacs?"
+07:58.480 "How do I do it now?"
+08:52.600 Why I prefer discussions
+09:49.440 What about talks?
+10:18.240 Frequency of the meetup
+10:58.480 "Should I schedule and just wait?"
+11:39.960 Adding your event to the Emacs Calendar
+11:58.920 What to do during the meetup
+13:00.280 After the meetup
+14:44.240 Checklist
+14:59.800 Co-organizers
+15:57.240 Website
+17:14.200 Video conferencing
+17:42.280 Communication
+18:01.720 Other resources
+18:50.080 Connecting with other organizers
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.webm">Download --main.webm (104MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main_es.vtt">Download --main_es.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/nk37ygsa4ijMhV7uY94Lw2">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="meetups-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="meetups-qanda" data="""
+02:05.680 Thoughts on physical meetups
+07:34.841 Hybrid meetings
+10:03.680 How much time does it take you to organize a meetup?
+11:29.280 How do we use the workshops to make content that lasts after the workshop?
+14:25.800 Automation
+15:23.160 Emacs User Group
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="meetups-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.webm">Download --answers.webm (49MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--answers.opus">Download --answers.opus (6.1MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/meetups-nav.md b/2022/info/meetups-nav.md
new file mode 100644
index 00000000..1a89e616
--- /dev/null
+++ b/2022/info/meetups-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/wayland">Emacs should become a Wayland compositor</a>
+Next by track: <a href="/2022/talks/sqlite">Using SQLite as a data source: a framework and an example</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/news-after.md b/2022/info/news-after.md
new file mode 100644
index 00000000..c7118f3d
--- /dev/null
+++ b/2022/info/news-after.md
@@ -0,0 +1,5 @@
+<!-- Automatically generated by emacsconf-generate-after-page -->
+
+
+Questions or comments? Please e-mail [sacha@sachachua.com](mailto:sacha@sachachua.com?subject=Comment%20for%20EmacsConf%202022%20news%3A%20Emacs%20News%20highlights)
+<!-- End of emacsconf-generate-after-page -->
diff --git a/2022/info/news-before.md b/2022/info/news-before.md
new file mode 100644
index 00000000..eeee30e3
--- /dev/null
+++ b/2022/info/news-before.md
@@ -0,0 +1,17 @@
+<!-- Automatically generated by emacsconf-generate-before-page -->
+
+<div class="schedule-in-context schedule-svg-container" data-slug="news">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 10:00-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="94" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:10 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(483,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:30- 2:50 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="517" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(546,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:20- 3:40 Putting Org Mode on the Indieweb</title> <rect x="596" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:00- 4:10 Fanfare for the Common Emacs User</title> <rect x="658" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(671,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 5:00- 5:10 Sunday closing remarks</title> <rect x="752" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(765,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:20 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(687,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:20 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(123,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:45-10:55 justl: Driving recipes within Emacs</title> <rect x="164" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(177,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to" data-slug="tramp"> <title> 11:05-11:35 Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="196" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(241,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:10 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(389,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:35- 1:45 Top 10 reasons why you should be using Eshell</title> <rect x="431" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:10- 2:30 Emacs was async before async was cool</title> <rect x="486" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(515,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:05- 3:25 The Wheels on D-Bus</title> <rect x="572" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(601,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(94,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(188,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(282,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(376,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(470,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(564,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(658,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(752,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 5</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 5-min talk followed by IRC Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-nil">#emacsconf-nil</a>)
+Pad: <https://pad.emacsconf.org/2022-news>
+Status: Talk cancelled
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T23:00:00Z" end="2022-12-04T23:05:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~6:00 PM - 6:05 PM EST (US/Eastern)</div><div class="others">Sunday, Dec 4 2022, ~6:00 PM - 6:05 PM EST (US/Eastern)</div></div><div><a href="/2022/watch/nil/">Find out how to watch and participate</a></div>
+
+
+# Description
+
+
+<!-- End of emacsconf-generate-before-page --> \ No newline at end of file
diff --git a/2022/info/news-nav.md b/2022/info/news-nav.md
new file mode 100644
index 00000000..130fb5b1
--- /dev/null
+++ b/2022/info/news-nav.md
@@ -0,0 +1,2 @@
+Back to the [[talks]]
+Previous: <a href="/2022/talks/fanfare">Fanfare for the Common Emacs User</a>
diff --git a/2022/info/orgsuperlinks-after.md b/2022/info/orgsuperlinks-after.md
new file mode 100644
index 00000000..c218e3d6
--- /dev/null
+++ b/2022/info/orgsuperlinks-after.md
@@ -0,0 +1,184 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="orgsuperlinks-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, my name is Karl Voit""" start="00:00:00.000" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and I'm going to show you a little demo""" start="00:00:05.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""on how I'm working with links""" start="00:00:08.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between arbitrary headings""" start="00:00:10.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and how I define dependencies between tasks""" start="00:00:12.760" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""when I'm working with projects and so forth.""" start="00:00:16.240" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""For that purpose, I've created a repository""" start="00:00:18.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""that contains the files we are going to work with,""" start="00:00:22.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""with the overall setup and so forth.""" start="00:00:27.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So you just have to download this repository""" start="00:00:30.000" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and you're able to replay everything""" start="00:00:32.840" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which you are going to see here.""" start="00:00:36.400" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""If you've downloaded the configuration of the demo,""" start="00:00:38.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""you see those files, and you start the Emacs""" start="00:00:44.360" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""with an empty configuration""" start="00:00:49.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and link demo file, like that.""" start="00:00:52.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So let me just briefly increase the font size.""" start="00:00:59.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Setting up the demo is easy.""" start="00:01:03.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I've done the key visualization,""" start="00:01:05.760" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""the webcam part, and I've started the Emacs""" start="00:01:08.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and increased the font size.""" start="00:01:11.840" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""And the last thing and the most important thing""" start="00:01:13.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""you need to do here""" start="00:01:17.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""is executing the babel block,""" start="00:01:18.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which consists of more or less dirty Elisp code""" start="00:01:20.360" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""that installs the necessary packages, functions,""" start="00:01:23.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and bindings required in this demo.""" start="00:01:27.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""You need to acknowledge the execution""" start="00:01:29.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""with yes and return, and after a couple of seconds,""" start="00:01:32.400" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""everything is downloaded""" start="00:01:36.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and set up nicely for your demo.""" start="00:01:37.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""The first demo is the demo""" start="00:01:42.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""where I'm going to show you""" start="00:01:45.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""how I'm working with links""" start="00:01:46.960" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between arbitrary headings.""" start="00:01:48.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""It consists of two commands,""" start="00:01:50.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""org-super-links-quick-insert-inline-link,""" start="00:01:52.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and the second one is""" start="00:01:55.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""org-super-links-quick-insert-drawer-link.""" start="00:01:56.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So the difference is,""" start="00:01:59.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""the first one is an inline link,""" start="00:02:01.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and the second one only depends""" start="00:02:03.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""on the drawers of the headings.""" start="00:02:07.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So let's show you what I mean.""" start="00:02:09.960" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""If I'm inserting here the inline link""" start="00:02:12.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""to the second one, which I have to choose""" start="00:02:15.240" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""from the result set here,""" start="00:02:18.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""you see that there is this second heading link""" start="00:02:21.200" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""included here in the first heading.""" start="00:02:26.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Let's open up the first and second heading.""" start="00:02:29.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""You see that I can jump this link""" start="00:02:34.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""to the second heading. The first heading""" start="00:02:37.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""as well as the second heading""" start="00:02:40.520" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""get human readable IDs,""" start="00:02:42.000" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which I personally prefer.""" start="00:02:43.880" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""The second one gets""" start="00:02:46.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""a backheading in a link drawer,""" start="00:02:49.320" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which was created automatically.""" start="00:02:51.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So this is a method where I link arbitrary headings,""" start="00:02:53.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and that's the main reason""" start="00:02:57.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""why I personally don't need any""" start="00:02:59.168" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Zettelkasten-based method like Org Roam.""" start="00:03:01.215" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""The next command which I want to show you""" start="00:03:03.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""is the link between those drawers.""" start="00:03:08.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So in order to link the third to the fourth,""" start="00:03:13.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I need to look for the fourth.""" start="00:03:17.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""In this case, you do not see""" start="00:03:20.320" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""any inline link like here above,""" start="00:03:24.200" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""but you see the :PROPERTIES: drawers""" start="00:03:27.400" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and the :LINKS: drawers in both headings.""" start="00:03:31.520" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So there is a forward- and a back-link""" start="00:03:35.400" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between those two headings,""" start="00:03:38.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and if you see a links drawer""" start="00:03:40.200" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""you know that there are""" start="00:03:42.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""linked headings you can follow.""" start="00:03:45.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I do find this method very very handy.""" start="00:03:47.560" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""Of course, this doesn't only work""" start="00:03:51.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""within one single Org mode file.""" start="00:03:53.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""It works between arbitrary Org mode files""" start="00:03:57.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""as long as they are""" start="00:04:01.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""part of your Org Mode agenda list.""" start="00:04:02.634" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So that was the first heading""" start="00:04:05.760" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""with the bi-directional links.""" start="00:04:08.280" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""The second one is a little bit""" start="00:04:09.960" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""more complicated than that""" start="00:04:11.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""because I show you how I'm working with projects.""" start="00:04:13.080" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Usually, I start the project""" start="00:04:17.280" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""by adding a &quot;Why?&quot; statement""" start="00:04:19.534" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""so that I remember why this project""" start="00:04:22.080" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""needs to be done in the first place.""" start="00:04:25.200" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I do a brainstorming on the tasks""" start="00:04:27.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""that need to be done in the project""" start="00:04:32.280" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""as a simple list.""" start="00:04:33.934" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""With this handy command (C-c *),""" start="00:04:36.280" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I'm converting it to a list of Org mode headings.""" start="00:04:39.360" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Now let's add the NEXT keyword,""" start="00:04:43.840" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which is my default to-do keyword,""" start="00:04:47.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""to the first heading.""" start="00:04:49.001" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""You notice that there is a CREATED property""" start="00:04:49.760" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which is not relevant to the demo itself,""" start="00:04:53.320" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""but it's part of my setup.""" start="00:04:56.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I really like those created headings""" start="00:04:57.840" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""because when I add arbitrary headings,""" start="00:05:00.840" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""this CREATED property is added automatically.""" start="00:05:03.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""So now I want to define a dependency""" start="00:05:07.680" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between &quot;Empty garage&quot;""" start="00:05:11.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and &quot;Paint walls and floor.&quot;""" start="00:05:12.968" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I do that by invoking my command here,""" start="00:05:14.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and look for the &quot;Paint walls&quot; heading.""" start="00:05:18.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""In this dialogue, you may add a scheduled date""" start="00:05:22.520" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and/or a deadline date""" start="00:05:28.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and/or a to-do statement. For this demo""" start="00:05:30.234" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I only choose the to-do keyword.""" start="00:05:34.240" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""You notice that there is""" start="00:05:37.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""this TRIGGER property added.""" start="00:05:39.400" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""That's default behavior of org-edna""" start="00:05:41.000" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""which is managing the dependencies, in my case.""" start="00:05:43.280" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""In the other one, there is this BLOCKER property.""" start="00:05:47.200" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""It's very handy to know that those IDs""" start="00:05:51.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""might be used for jumping""" start="00:05:55.360" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between those dependencies again.""" start="00:05:57.880" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Those two headings don't have to be necessarily""" start="00:06:00.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""in the very same Org Mode file.""" start="00:06:03.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""They may be scattered around""" start="00:06:05.560" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""your Org Mode agenda files all over the place.""" start="00:06:07.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So continuing this definition of dependency""" start="00:06:11.000" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between the second and the third one...""" start="00:06:16.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I'm using the search &quot;Bring back stuff&quot;...""" start="00:06:19.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""the search functionality...""" start="00:06:23.000" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I choose the NEXT keyword here, its dependency.""" start="00:06:24.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""The same holds true for the last two.""" start="00:06:28.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""&quot;Is painted&quot;, for example. I'm going to use""" start="00:06:32.480" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""the NEXT keyword again.""" start="00:06:37.400" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""I tend to use the last task of any project""" start="00:06:39.320" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""to close the overall project.""" start="00:06:44.520" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So if I show you this one,""" start="00:06:47.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I'm using the dependency to &quot;Garage&quot; project,""" start="00:06:49.880" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and this time I'm using the DONE keyword.""" start="00:06:57.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""Of course, the properties""" start="00:07:02.200" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""look like that all the time,""" start="00:07:04.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""so there is a trigger from the first task""" start="00:07:07.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""to the second one, and there is a blocker""" start="00:07:11.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""from the second one back to the first one,""" start="00:07:13.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and when I'm actually doing the project,""" start="00:07:17.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I may now mark the first task as DONE,""" start="00:07:21.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and you notice that the second one""" start="00:07:25.520" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""automatically gets a next keyword.""" start="00:07:28.360" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""This happened, of course, for all those tasks.""" start="00:07:31.440" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""The neat thing is when I close the last one,""" start="00:07:34.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""the overall project gets its DONE keyword as well.""" start="00:07:38.920" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So this is how I'm working with""" start="00:07:42.760" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""projects and dependencies.""" start="00:07:46.360" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""Most of the time, task dependencies""" start="00:07:49.120" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""are not even within the same Org Mode subheading,""" start="00:07:53.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""let's say. Also, I'm using dependencies""" start="00:07:58.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""between different Org Mode files.""" start="00:08:01.600" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""This is a very, very cool way of defining""" start="00:08:03.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""what to do next in a project,""" start="00:08:07.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""without looking for tasks""" start="00:08:10.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""that can't be done at that stage.""" start="00:08:12.668" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template new="1" text="""You can have a look at the details of the demo""" start="00:08:15.640" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""by checking out the files in the repository.""" start="00:08:20.240" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""That's it for the demo,""" start="00:08:23.800" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and therefore I thank you for your patience.""" start="00:08:27.080" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""I wish you good luck,""" start="00:08:30.720" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""and I hope that I could show you one or two tricks""" start="00:08:32.160" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""that you can add to your Org Mode setup""" start="00:08:39.520" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""in order to help you with your daily work.""" start="00:08:42.080" video="mainVideo-orgsuperlinks" id="subtitle"]]
+[[!template text="""So bye from me, till next time.""" start="00:08:47.040" video="mainVideo-orgsuperlinks" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [EmacsConf22@Karl-Voit.at](mailto:EmacsConf22@Karl-Voit.at?subject=Comment%20for%20EmacsConf%202022%20orgsuperlinks%3A%20Linking%20headings%20with%20org-super-links%20%28poor-man%27s%20Zettelkasten%29)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/orgsuperlinks-before.md b/2022/info/orgsuperlinks-before.md
new file mode 100644
index 00000000..e39c08d1
--- /dev/null
+++ b/2022/info/orgsuperlinks-before.md
@@ -0,0 +1,51 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Karl Voit shares how he uses org-edna and org-super-links to manage dependencies and links betweentasks in Org Mode. Afterwards, he will handle questions over BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="orgsuperlinks">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect stroke-width="3" x="156" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 9-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-orgsuperlinks>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T15:40:00Z" end="2022-12-04T15:50:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~10:40 AM - 10:50 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~9:40 AM - 9:50 AM CST (US/Central)<br />Sunday, Dec 4 2022, ~8:40 AM - 8:50 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~7:40 AM - 7:50 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~3:40 PM - 3:50 PM UTC <br />Sunday, Dec 4 2022, ~4:40 PM - 4:50 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~5:40 PM - 5:50 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~9:10 PM - 9:20 PM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~11:40 PM - 11:50 PM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~12:40 AM - 12:50 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="orgsuperlinks-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="orgsuperlinks-mainVideo" data="""
+00:00.000 Introduction
+00:18.680 Setting up the demo
+01:42.680 Linking between headings
+03:03.920 Link drawers
+03:51.640 Bi-directional links
+04:09.960 Projects
+05:07.680 Dependencies
+05:51.600 Jumping between dependencies
+06:39.320 Closing the project
+07:49.120 Task dependencies between files
+08:15.640 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.webm">Download --main.webm (38MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/ff1YxBEgR9LxJ51trJwyYk">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="orgsuperlinks-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="orgsuperlinks-qanda" data="""
+02:04.360 Can you filter out blocked tasks?
+03:07.720 Do you ever have any issues having so much meta-level information?
+05:01.160 Bidirectional links
+10:22.491 Does this change how you use TODO keywords NEXT, TODO, BLOCKED?
+11:14.300 Is your PhD published?
+12:32.466 Org Brain
+13:38.841 Do you find that the links are fragile, hard to maintain?
+14:19.383 Would it be of interest to make auto descriptions for links in Org?
+15:24.960 Why not Org UUIDs for IDs?
+16:19.360 Do you use anything for "What links here to this heading?"
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="orgsuperlinks-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.webm">Download --answers.webm (62MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgsuperlinks--linking-headings-with-orgsuperlinks-poormans-zettelkasten--karl-voit--answers.opus">Download --answers.opus (6.8MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/orgsuperlinks-nav.md b/2022/info/orgsuperlinks-nav.md
new file mode 100644
index 00000000..266b6c1c
--- /dev/null
+++ b/2022/info/orgsuperlinks-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/rde">rde Emacs introduction</a>
+Next by track: <a href="/2022/talks/justl">justl: Driving recipes within Emacs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/orgvm-after.md b/2022/info/orgvm-after.md
new file mode 100644
index 00000000..6e56988a
--- /dev/null
+++ b/2022/info/orgvm-after.md
@@ -0,0 +1,746 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="orgvm-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""And so this little application--""" start="00:00:36.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""well, I'll skip that and just kind of""" start="00:00:42.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""jump right into my thesis for those of you""" start="00:00:42.504" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that might be planning to duck out for the RMS talk,""" start="00:00:49.143" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""starting in a little bit.""" start="00:00:53.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So essentially, my thesis here is really that""" start="00:00:55.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the Emacs toolchain can easily be combined""" start="00:00:55.546" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with other skills and used in kind of""" start="00:00:59.379" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""a Unix paradigm of having sort of different tools""" start="00:01:08.794" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to do different steps.""" start="00:01:13.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We might actually use the same tool""" start="00:01:14.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to implement a couple of steps.""" start="00:01:17.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But with that paradigm, each step""" start="00:01:19.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is an individual item that can be sort of""" start="00:01:22.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""dropped in and replaced.""" start="00:01:22.087" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So over the course of the talk,""" start="00:01:26.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""hopefully I'll come back to that thesis.""" start="00:01:26.421" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""But I'll now jump back and start walking through""" start="00:01:31.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""what is orgvm?""" start="00:01:31.087" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this is a very simple proof of concept program.""" start="00:01:37.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We'll just jump over to perhaps""" start="00:01:39.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""a prettier view of the source code for it.""" start="00:01:39.587" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is implemented-- oops.""" start="00:01:45.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There's some cruft, I think, in my local.""" start="00:01:49.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, so this config block at the top...""" start="00:01:53.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we'll be jumping back and forth""" start="00:01:56.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""between the code and the documentation.""" start="00:01:58.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""So the first thing I want to point out""" start="00:02:01.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is that this is written in Node.js,""" start="00:02:04.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but I think you'll find it'd be pretty trivial to implement""" start="00:02:05.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""in any language.""" start="00:02:08.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Certainly, you're more than welcome to use this.""" start="00:02:10.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'd be happy to accept your patches or feature requests""" start="00:02:13.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and things like that.""" start="00:02:17.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Of course, bug reports.""" start="00:02:20.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But I'd also encourage others to roll their own.""" start="00:02:21.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You might well come up with a different version of this""" start="00:02:25.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that's even cooler.""" start="00:02:28.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we can learn from each other.""" start="00:02:29.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If you heard one of my talks before,""" start="00:02:32.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you probably recognize a common theme.""" start="00:02:34.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm a big fan of head-first development""" start="00:02:36.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""as a way to get invested in both""" start="00:02:40.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the tool chain and a culture.""" start="00:02:40.337" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, so let's come back to orgvm.""" start="00:02:44.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""First of all, we'll start with""" start="00:02:49.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the itch I was trying to scratch.""" start="00:02:49.587" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I wanted to be able to quickly use a web browser""" start="00:02:52.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to browse my Org documents.""" start="00:02:58.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's particularly handy when the documents""" start="00:03:00.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""are full of cross links to each other.""" start="00:03:01.421" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That meant I wanted to automatically export,""" start="00:03:05.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""particularly to HTML.""" start="00:03:10.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But it made sense for me to include Markdown, PDF,""" start="00:03:12.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or whatever format I want.""" start="00:03:17.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Because many times, I'm going to look at that file""" start="00:03:18.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and then pop it into an email or upload it somewhere.""" start="00:03:22.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then finally, it should be, therefore,""" start="00:03:29.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""pretty easy to download the document""" start="00:03:33.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""rather than view it, once I'm done.""" start="00:03:33.754" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""So let's just run a quick demo.""" start="00:03:38.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You'll see I'm still a Windows user.""" start="00:03:42.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Yeah, I'm working on it.""" start="00:03:44.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So all right, first thing that we're going to do""" start="00:03:45.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is fire up the program.""" start="00:03:52.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Actually, for simplicity, let's just""" start="00:03:53.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""admit we live in a DOS world.""" start="00:04:00.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And as you can see, there's not much to it""" start="00:04:01.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to get the application running.""" start="00:04:19.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So with that done, then, I can run out to my localhost.""" start="00:04:22.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we'll just start by plugging in the name of an Org file.""" start="00:04:25.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I've got a little Org file that I prepared""" start="00:04:37.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that just kind of provides a proof of concept to this.""" start="00:04:37.587" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And you can see, as imagined, we're automatically""" start="00:04:49.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""turning that Org file...""" start="00:04:53.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's just take a quick look at it.""" start="00:04:54.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And here's that file now.""" start="00:04:56.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You can see, nothing up my sleeve.""" start="00:05:10.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is a very basic Org file""" start="00:05:11.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that I use for testing this program.""" start="00:05:11.962" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Images work.""" start="00:05:16.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We've got some nicely syntax-highlighted code blocks""" start="00:05:17.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""in a couple different languages,""" start="00:05:21.837" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and not really that much going on there.""" start="00:05:25.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""All right, let's come back to the documentation.""" start="00:05:29.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I pretty well covered this, I think.""" start="00:05:33.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But you'll need a relatively recent version of Emacs.""" start="00:05:36.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I haven't taken any pains to make this backward compatible.""" start="00:05:39.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""To be fair, I haven't tested it extensively.""" start="00:05:43.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It may well work on Emacs 26 or older versions.""" start="00:05:46.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm personally running 27.1 and 28,""" start="00:05:50.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""as well as recent builds of 29.""" start="00:05:55.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There's some quick start instructions here,""" start="00:05:57.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which I'm going to take as read.""" start="00:06:02.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You probably saw the key element of this,""" start="00:06:03.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which involves starting the program.""" start="00:06:08.601" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You do-- I will call out Yale.""" start="00:06:11.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If you're trying to play with this yourself,""" start="00:06:13.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""don't forget to run the npm install command.""" start="00:06:15.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That'll bring in express.js,""" start="00:06:20.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which the JavaScript we're about to look at is built on.""" start="00:06:20.087" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""So let's just take a look at the usage patterns real quick.""" start="00:06:24.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""To use this, we're simply giving the document name""" start="00:06:33.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""without the .org extension in whatever file path--""" start="00:06:35.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or I'm sorry, whatever we've configured the server""" start="00:06:42.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to run on, in this case, port 3000.""" start="00:06:46.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I also want to call attention to the fact""" start="00:06:50.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that nothing in this program protects you""" start="00:06:52.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""from damaging yourself.""" start="00:06:55.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This isn't meant as a production capability.""" start="00:06:57.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is something that's used to publish""" start="00:07:00.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""your own note files""" start="00:07:00.587" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and roll them out to yourself.""" start="00:07:04.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That's something I'll definitely look at adding,""" start="00:07:06.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but I want people to be careful of it""" start="00:07:08.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""while this is in an alpha state.""" start="00:07:12.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So the default response is HTML, and we saw that here.""" start="00:07:14.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But we also can modify the response format.""" start="00:07:22.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We're currently supporting HTML, Markdown, and PDF.""" start="00:07:26.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And that's really enough to select a different format.""" start="00:07:29.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That's really nothing more than adding type. Okay.""" start="00:07:34.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Not sure what's going on there.""" start="00:07:48.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Okay, well, there goes my demo.""" start="00:07:50.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Shows me for doing my talk live.""" start="00:07:57.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But this, fortunately, this error message""" start="00:08:03.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is a nice segue to the part of the talk""" start="00:08:06.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that I'd really like to focus on,""" start="00:08:08.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""hopefully bringing me back to that thesis.""" start="00:08:10.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""So as we start to look at code, what we're looking for""" start="00:08:13.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is really this Emacs Lisp that's getting generated here.""" start="00:08:17.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And you'll notice that's the stuff""" start="00:08:21.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I thought was important to produce as diagnostics""" start="00:08:24.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""for the programs running as well.""" start="00:08:27.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So, spoiler, this Elisp is dynamically""" start="00:08:29.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""generated by the program.""" start="00:08:34.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And that's really the core of the way""" start="00:08:35.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""orgvm or my orgvm works.""" start="00:08:38.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this should look pretty similar to the view of the code""" start="00:08:42.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we had a moment ago.""" start="00:08:47.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You can see I've got some bases.""" start="00:08:48.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is all hard-coded into the program,""" start="00:08:51.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""nothing fancy going on here.""" start="00:08:53.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The debug is simply controlling that diagnostic output""" start="00:08:56.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that we looked at.""" start="00:09:00.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There's some other, hopefully fairly self-explanatory""" start="00:09:01.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""programs or properties, where to find Emacs and so forth.""" start="00:09:04.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""And then finally, we come in to the meat of it,""" start="00:09:09.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the variables that are used to control what Elisp""" start="00:09:16.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we can generate dynamically.""" start="00:09:16.337" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So here, we're controlling the extension""" start="00:09:24.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that it should look for Org files.""" start="00:09:27.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Hopefully not too many people out there""" start="00:09:29.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with a weird extension for the Org files,""" start="00:09:31.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but this should support that.""" start="00:09:34.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm afraid that is something I've been known to do.""" start="00:09:37.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Then we define a list of additional export types.""" start="00:09:40.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Here's one that ought to work.""" start="00:09:49.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's take a look at type=org.""" start="00:09:50.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And, aha, it's giving us the file.""" start="00:09:54.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I'm not going to open that up,""" start="00:09:59.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but now we can see that that's definitely working,""" start="00:10:00.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""for certain versions of working.""" start="00:10:02.421" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this list of type parameters is""" start="00:10:09.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""controlling the supported types.""" start="00:10:14.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Hopefully it should be fairly easy to add in different ones.""" start="00:10:15.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The fancy footwork here is just a list""" start="00:10:18.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""of the types that we're going to be using.""" start="00:10:21.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The fancy footwork here involves, first of all,""" start="00:10:23.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""there's the extension and the MIME type.""" start="00:10:29.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That's, as you might guess, used to control""" start="00:10:32.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the response content type.""" start="00:10:32.254" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""We also have this replace variable.""" start="00:10:38.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This prevents-- there's an optimization""" start="00:10:40.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to send an existing PDF or HTML file""" start="00:10:44.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""if that's already there,""" start="00:10:48.837" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but only if the original source Org file""" start="00:10:50.464" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""hasn't been modified since.""" start="00:10:51.004" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This `replace` effectively can turn that off.""" start="00:10:56.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If I remove the `replace: true` attribute,""" start="00:10:59.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""then I'll be prevented from overwriting that.""" start="00:11:03.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""In other words, I'll always send a cached version.""" start="00:11:07.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That might be helpful if, for example,""" start="00:11:10.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you've got hand-tuned PDFs""" start="00:11:13.879" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and you don't want to accidentally overwrite them.""" start="00:11:15.066" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""All right, let's get into the code a little bit more.""" start="00:11:19.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm going to skip past the really good stuff""" start="00:11:23.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and jump into the boring parts""" start="00:11:28.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""so that we have them as context.""" start="00:11:28.296" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Here's the default path.""" start="00:11:34.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And it is going to send me the readme from the project--""" start="00:11:37.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""from the project repo if I don't specify a path.""" start="00:11:41.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then we have a couple of different endpoints""" start="00:11:47.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that we support.""" start="00:11:51.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We'll come back to this first one.""" start="00:11:52.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""For now, let's start with the more normal one,""" start="00:11:55.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which is just giving us a file name.""" start="00:11:55.587" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So we can see we start by figuring out""" start="00:12:01.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""what the physical file name should be called.""" start="00:12:04.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And assuming that that exists--""" start="00:12:08.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""sorry, I've confused myself.""" start="00:12:15.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this is the caching or the optimization""" start="00:12:17.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that I mentioned, sending the existing file.""" start="00:12:23.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This file exists is where the optimization is""" start="00:12:25.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that regenerates the file if the source""" start="00:12:31.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or document for the HTML generator has changed.""" start="00:12:38.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Again, this is a short talk, so I'm not""" start="00:12:45.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""going to go into all the nuances of this JavaScript code.""" start="00:12:46.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's pretty far from an Emacs-related thing.""" start="00:12:49.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So with that said, then, the rest of this program""" start="00:12:52.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is really mostly just handling the different errors:""" start="00:12:56.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""&quot;I didn't understand that type.&quot;""" start="00:12:59.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""&quot;I don't know the document.&quot;""" start="00:13:01.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""&quot;I failed.&quot;""" start="00:13:02.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Otherwise, there's the caching.""" start="00:13:03.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""And here's really where things get interesting,""" start="00:13:06.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""where we've generated some Elisp,""" start="00:13:14.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and then we're calling Emacs with that Elisp.""" start="00:13:19.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If everything works, we'll send the file.""" start="00:13:22.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If it doesn't, we'll send the 500.""" start="00:13:24.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we've already seen the 500, so we know that works.""" start="00:13:27.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, let's get to the interesting part.""" start="00:13:30.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Sorry, one more footnote.""" start="00:13:33.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""There is a capability built in that will""" start="00:13:37.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""allow us to execute an Org block.""" start="00:13:39.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's see if that's working in our local.""" start="00:13:41.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'll remind myself how to do it.""" start="00:13:44.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's run.""" start="00:13:47.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I think it's called test.""" start="00:13:49.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And that's returning a 500.""" start="00:13:53.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm suspecting that's running because I'm running""" start="00:13:56.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""in command instead of bash.""" start="00:13:58.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Oh, yeah, so the failure is happening""" start="00:13:59.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""after I generate the Elisp.""" start="00:14:06.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm pretty confident that is what the actual problem is.""" start="00:14:07.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If we have time, I'll jump back over there""" start="00:14:10.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and relaunch it in mingw bash.""" start="00:14:12.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we can see it actually work.""" start="00:14:19.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But this works pretty well for me on my work laptop.""" start="00:14:21.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I didn't have to make any changes to it.""" start="00:14:24.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I have a fairly high amount of confidence,""" start="00:14:25.860" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""at least in trivial cases, this works pretty well.""" start="00:14:28.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""All right, so what I actually wanted to talk about today--""" start="00:14:32.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and I'm going to be kind of hand-waving around""" start="00:14:37.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""this ES5 class that I've got and kind of the way that works.""" start="00:14:41.731" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Hopefully, this will be pretty familiar to you""" start="00:14:46.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""if you are a JavaScript programmer.""" start="00:14:49.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The interesting stuff comes when we want to build some Lisp.""" start="00:14:53.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Here, you can see that I really don't have""" start="00:15:01.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""a whole lot of code around formatting LISP.""" start="00:15:01.962" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You can see that I've special-cased""" start="00:15:11.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""whether the arguments that were passed""" start="00:15:14.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""happen to be a function.""" start="00:15:19.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If they are, I'm going to call that function.""" start="00:15:20.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then the result will be formatted as Lisp.""" start="00:15:25.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this would be a recursive call here.""" start="00:15:31.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Otherwise, I'm just going to return the arguments.""" start="00:15:35.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Sorry, otherwise, I will slap a pair of parentheses""" start="00:15:40.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""around the result of walking that list if I get...""" start="00:15:48.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""formatting each element of the list of arguments""" start="00:15:57.879" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that this `formatLisp` process calls""" start="00:15:57.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and separating them with spaces.""" start="00:16:02.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So in short form, this program walks through a list.""" start="00:16:04.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If the list it receives is a function,""" start="00:16:10.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""it calls that function.""" start="00:16:14.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Once that's handled or otherwise,""" start="00:16:16.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we simply walk the list, taking the arguments,""" start="00:16:19.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""concatenating them on strings, and finally,""" start="00:16:22.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""wrap the results in parentheses.""" start="00:16:26.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So what I didn't mention there but might be obvious""" start="00:16:28.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is if I have a nested list, the inner list""" start="00:16:31.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""will be subjected to the same treatment.""" start="00:16:36.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this is a recursive sort of algorithm.""" start="00:16:38.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""All right, so now when I go to export,""" start="00:16:43.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""actually, in the interest of time,""" start="00:16:51.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm going to avoid walking through that piece of code""" start="00:16:53.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and let's focus instead on the more interesting part""" start="00:16:55.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""of how that Lisp gets encoded.""" start="00:16:58.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So coming back to the PDF is a good example here,""" start="00:17:02.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""because it's got a special case.""" start="00:17:07.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You can see I've specified this `exportFun`""" start="00:17:10.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or export function.""" start="00:17:10.337" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That's a property none of these other types have.""" start="00:17:15.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And you can see it contains some Elisp telling us""" start="00:17:22.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""how to call the export for it.""" start="00:17:27.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's go see how that's used.""" start="00:17:29.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""At the very end of what I just skipped over,""" start="00:17:32.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the detailed &quot;how the Org export process works,&quot;""" start="00:17:35.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you'll see that I am ending with a step""" start="00:17:40.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to call the export function.""" start="00:17:45.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Here, I look to see whether I have""" start="00:17:48.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""an export function property.""" start="00:17:48.004" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If I do, I call that function.""" start="00:17:55.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And if I don't, I build this list with the default""" start="00:18:00.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""`org-export-to-file` function""" start="00:18:00.921" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""using the filename and an output filename.""" start="00:18:07.072" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this, hopefully, is pretty familiar to anybody""" start="00:18:15.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that's manually messed around""" start="00:18:18.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with calling `org-export-to-file`.""" start="00:18:18.504" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If it isn't, you can pretty well trust me for it.""" start="00:18:23.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There's nothing very special going on.""" start="00:18:25.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This looks rather like...""" start="00:18:28.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Poor example there.""" start="00:18:30.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's go back to our markdown.""" start="00:18:37.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And there, we can see--""" start="00:18:46.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: I'm going to make a quick announcement.""" start="00:18:47.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Can you hear me?""" start="00:18:49.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Yes, go for it.""" start="00:18:50.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: OK, let me just show my face.""" start="00:18:52.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Oh, I'm not showing my face.""" start="00:18:54.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Damn it.""" start="00:18:55.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""OK, I'll make the announcement.""" start="00:18:55.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You won't see my face quite yet.""" start="00:18:57.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We are about to get started.""" start="00:18:58.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Well, we actually just got started on dev""" start="00:19:00.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with the talk by RMS.""" start="00:19:02.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So if you want to hop over to watch the talk by RMS,""" start="00:19:06.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""feel free to do so.""" start="00:19:08.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Otherwise, we will be continuing on Gen with Corwin""" start="00:19:09.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to finish his talk and have a Q&A.""" start="00:19:12.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Corwin, you can feel free to go now.""" start="00:19:12.254" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Okay, bye, everybody.""" start="00:19:16.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And for those sticking around,""" start="00:19:18.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm just going to keep pressing on with this.""" start="00:19:22.796" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""In fact, I'm going to dive back into the part""" start="00:19:25.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that I skipped here, which is the rest of how""" start="00:19:30.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""this export functionality works.""" start="00:19:35.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So just to make sure the dot is tied together,""" start="00:19:37.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the core of how this program works""" start="00:19:41.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is generating some Elisp and then passing it""" start="00:19:44.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to Emacs in batch mode.""" start="00:19:49.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So if that wasn't perfectly clear,""" start="00:19:51.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that's really what's going on with this program.""" start="00:19:53.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The rest of the implementation is just""" start="00:19:57.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""a way to do that or certain features that""" start="00:19:59.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""are supported in that generated Elisp, if you will.""" start="00:20:01.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this is, you could say, the minimum implementation""" start="00:20:08.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I could come up with to create a web server""" start="00:20:11.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""for my local Org documents.""" start="00:20:11.754" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I will also interrupt myself to just pull up""" start="00:20:17.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the Etherpad real quick.""" start="00:20:24.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Actually, if somebody is listening""" start="00:20:28.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and can share a link to that, I closed my browser window""" start="00:20:29.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with my links in it.""" start="00:20:34.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But sure, I'm happy to take questions at any point, Leo,""" start="00:20:36.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""if there are any questions for me.""" start="00:20:44.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Are you hanging out with me,""" start="00:20:48.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""instead of watching RMS? You can go.""" start="00:20:49.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm teasing.""" start="00:20:53.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: No, I mean, we know that some people can""" start="00:20:54.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""have both streams open.""" start="00:20:58.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's fine.""" start="00:21:00.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And right now, it's not the Q&A with RMS.""" start="00:21:01.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's just the presentation.""" start="00:21:03.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So feel free to hang out a little longer""" start="00:21:04.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""if you just want the live stuff.""" start="00:21:07.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Don't worry about it.""" start="00:21:09.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""You're fine.""" start="00:21:09.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Yeah, and forgive me, everybody,""" start="00:21:10.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""if you were hoping for a quick, succinct talk.""" start="00:21:13.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I happen to know I was going to be opposite RMS,""" start="00:21:16.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""so I awarded myself the liberty of rambling.""" start="00:21:18.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So if you do have a question, something that I alluded to""" start="00:21:23.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and haven't come back to yet, you should, by all means,""" start="00:21:26.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""prompt me.""" start="00:21:29.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Corwin, I might do--""" start="00:21:30.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm just giving you a little heads up.""" start="00:21:33.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I might need to go help at some point of dev.""" start="00:21:35.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So if I need to do so, I will let you know right now""" start="00:21:38.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""inside the BBB room,""" start="00:21:43.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and you'll be on your own to manage the chat.""" start="00:21:44.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And you can just talk backstage to us""" start="00:21:46.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to manage what we do with the stream, OK?""" start="00:21:47.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Yep, that should be no problem at all.""" start="00:21:50.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I've got my pad up now.""" start="00:21:52.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Thank you, ??.""" start="00:21:53.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I'm sorry about butchering your name there.""" start="00:21:55.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And yep, I've got my chat open.""" start="00:21:58.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I think I'm pretty well set to self-manage.""" start="00:22:03.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Oh, I don't have a camera on.""" start="00:22:06.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So you can't see me giving you the thumbs up.""" start="00:22:07.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Okay, good.""" start="00:22:09.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""All right, so let's just walk through,""" start="00:22:09.860" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""because it's sort of an interesting code.""" start="00:22:16.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's just take a look real quick""" start="00:22:18.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""at how we generated our Elisp here,""" start="00:22:20.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""because it is--""" start="00:22:24.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""there we go.""" start="00:22:26.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It is a little bit interesting.""" start="00:22:27.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So here is the method.""" start="00:22:29.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I didn't get into detail on this.""" start="00:22:32.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But there's an ES5 class that represents""" start="00:22:34.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""an Org mode document.""" start="00:22:34.087" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It has the static debug property that,""" start="00:22:38.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""as you might imagine,""" start="00:22:38.921" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""can be overridden by that debug setting""" start="00:22:42.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we looked at in the defaults.""" start="00:22:45.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We also have a static variable that--""" start="00:22:48.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""a static property that does nothing more than getting""" start="00:22:51.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the path to Emacs out of those defaults.""" start="00:22:57.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Similarly, we have a class method""" start="00:23:00.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to spawn out an Emacs, as I mentioned, in batch mode,""" start="00:23:02.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""eval-ing some arbitrary Lisp that's passed in.""" start="00:23:09.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, so the type--""" start="00:23:12.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""this is where things start to get interesting.""" start="00:23:20.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this is an implementation detail,""" start="00:23:23.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but-- that it's written as a static method.""" start="00:23:26.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But essentially, what's going on here""" start="00:23:30.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is looking up from that type list""" start="00:23:32.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to try to find a type that's passed in,""" start="00:23:34.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and that's returning one of these blocks.""" start="00:23:37.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's say I requested HTML, which would be the default.""" start="00:23:41.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Then I'm going to get this set of properties back.""" start="00:23:44.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right.""" start="00:23:50.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Essentially, this program generates a program""" start="00:23:51.260" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or a little block of executable elisp.""" start="00:24:04.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""However, in some cases, where if the `load-path` has""" start="00:24:10.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""been customized in that type block,""" start="00:24:15.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or I think that's the only case I supported.""" start="00:24:20.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There was another complexity I removed.""" start="00:24:25.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So in that case, then I can simply""" start="00:24:28.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""replace that program with a let.""" start="00:24:32.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Either way, I'm going to have everything I generate""" start="00:24:33.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""be encapsulated in a single block.""" start="00:24:41.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The-- then I'm calling that formatLisp process""" start="00:24:45.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that we talked about, appending to that--""" start="00:24:49.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or inserting into, you could say, the outer scope.""" start="00:24:52.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we start by finding the file.""" start="00:25:01.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We then load any libraries that might be needed.""" start="00:25:05.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""In some cases, the type might not""" start="00:25:11.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""have any external libraries.""" start="00:25:13.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So we just-- so that's a no-op.""" start="00:25:15.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then finally, we're going to execute""" start="00:25:18.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that logic I mentioned before about selecting""" start="00:25:24.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""either the default org-export-to-file,""" start="00:25:27.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or else whatever Elisp we've staged for exporting""" start="00:25:30.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that particular file type.""" start="00:25:36.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And again, in the case of PDF, there's a special function""" start="00:25:38.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that's used to trigger that export.""" start="00:25:43.113" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Or you may be aware that that's a little more complicated.""" start="00:25:46.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There's intermediate forms there.""" start="00:25:49.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right.""" start="00:25:50.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So just reminding myself if there's anything else""" start="00:25:56.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I have to cover on background.""" start="00:26:01.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I think that pretty well covers the basics.""" start="00:26:03.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""All right, let's look at that source block execute.""" start="00:26:07.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is the other use of the format list function.""" start="00:26:09.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So here, rather than looking at the type""" start="00:26:14.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and passing that through our Org export method,""" start="00:26:16.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and then that type is used to get the list""" start="00:26:24.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that we want to create.""" start="00:26:29.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""In the case of source block execute,""" start="00:26:30.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we're kind of rolling it a lot more by hand.""" start="00:26:37.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So this gives us a good chance to sort of unwind""" start="00:26:40.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""how that list looks when it's staged as JavaScript data.""" start="00:26:43.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So here again, I wrap everything in a `progn`.""" start="00:26:49.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I start by preventing an interactive prompt""" start="00:26:52.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""for the Babel execution.""" start="00:26:58.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then we load languages.""" start="00:27:01.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This relates to another piece of our configuration""" start="00:27:04.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""where we've specified a set of languages""" start="00:27:12.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that it's OK to execute.""" start="00:27:17.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So if that type isn't in this list,""" start="00:27:19.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""then we won't be able to execute it in line""" start="00:27:24.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""through our trivial little web server.""" start="00:27:28.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right.""" start="00:27:32.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""With that done, then, loading the selected language,""" start="00:27:33.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we then once again open the file.""" start="00:27:40.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And we're-- whoops.""" start="00:27:43.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let-bind a return value, which is""" start="00:27:46.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""calculated by using Org source block execute [`org-sbe`]""" start="00:27:51.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""on the name of the block that's given.""" start="00:27:55.167" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then we use a temp buffer to write that out""" start="00:27:58.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to a temporary file.""" start="00:28:05.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is actually a little clumsy,""" start="00:28:06.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""but I haven't put the effort in to have this written out""" start="00:28:08.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to the standard output cleanly instead of using a temp file.""" start="00:28:12.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So under-- this is another example of where it may not""" start="00:28:17.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""be production-- well, it definitely""" start="00:28:20.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is not production-worthy code in that under heavy load,""" start="00:28:22.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""this would certainly break with collisions""" start="00:28:27.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""on the Babel file,""" start="00:28:30.167" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the name of the Babel file.""" start="00:28:32.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""In any case, once we've staged up our Elisp, which is--""" start="00:28:34.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""this is basically variable interpolation,""" start="00:28:37.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""then we just call Emacs on that.""" start="00:28:42.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And if we look down to where that's called,""" start="00:28:47.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you can see that the Org Babel filename calculated here.""" start="00:28:49.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Is there a problem?""" start="00:29:12.795" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: No, I'm fine.""" start="00:29:15.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm just lost in my code.""" start="00:29:15.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: OK, cool.""" start="00:29:18.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Uh-oh means, oh, I need to intervene.""" start="00:29:19.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""What is going on?""" start="00:29:21.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Carry on, please.""" start="00:29:22.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: No, I'm fine, Leo.""" start="00:29:23.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Thank you.""" start="00:29:24.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, so then--""" start="00:29:25.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""so you can see we get--""" start="00:29:27.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we send the Babel file here,""" start="00:29:28.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which is calculated manually.""" start="00:29:35.538" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""A bit sloppy there, since I have essentially the same--""" start="00:29:41.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I have two different places where""" start="00:29:45.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm calculating the Org doc file in two different ways.""" start="00:29:47.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Have I encouraged you to write your own yet?""" start="00:29:52.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Or send patches.""" start="00:29:54.720" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, so that's pretty much the nuts and bolts""" start="00:29:56.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""of this program.""" start="00:30:01.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's go back to just seeing if we can't make it run.""" start="00:30:02.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right.""" start="00:30:22.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, well, I apologize for not""" start="00:30:22.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""having taken the time to stage my demo this morning.""" start="00:30:45.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm going to try to make it better for you.""" start="00:30:49.560" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But apparently, it's going to be non-trivial""" start="00:30:52.680" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to make the program work.""" start="00:30:59.920" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's just-- before I completely give up,""" start="00:31:04.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""let's go ahead and try our Babel execute.""" start="00:31:07.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And that, too, is failing.""" start="00:31:13.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So there's something unhappy in my local world.""" start="00:31:14.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There it goes.""" start="00:31:18.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But in any case, let's go ahead and just take a look at""" start="00:31:19.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that.""" start="00:31:26.600" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's see.""" start="00:31:28.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Control Enter.""" start="00:31:30.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's take a look at that generated .el""" start="00:31:36.628" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and compare it to-- whoa--""" start="00:31:40.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and compare it to--""" start="00:31:42.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm just going to format this manually,""" start="00:31:44.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""because I've forgotten my key bindings to auto-format it.""" start="00:31:52.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""There we go.""" start="00:31:56.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right.""" start="00:32:02.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So now we can see, as promised, there's really""" start="00:32:07.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""nothing going on here other than the interpolation""" start="00:32:13.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""of the variables in.""" start="00:32:16.200" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We're inserting-- we're using an insert and write file""" start="00:32:18.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""method, which is, again, rather sloppy,""" start="00:32:24.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to generate the text file.""" start="00:32:27.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right.""" start="00:32:32.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let's come back to our documentation""" start="00:32:32.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and see if we can put a bow on the project.""" start="00:32:34.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""So I hope I've convinced you that this was actually""" start="00:32:39.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""rather easy to do.""" start="00:32:43.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""The entirety of my index.js file is 262 lines,""" start="00:32:45.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and that includes a good 40 of whitespace and configuration.""" start="00:32:52.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It has only one dependency, the Express,""" start="00:33:03.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which really builds the web server.""" start="00:33:06.506" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Any language you'd rather implement this in""" start="00:33:08.240" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""will have a similar capability for building""" start="00:33:11.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""some type of trivial web server.""" start="00:33:14.120" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I think you may find--""" start="00:33:16.280" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I certainly found that a large portion of the code base""" start="00:33:18.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is really making the errors meaningful,""" start="00:33:22.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""in that, in some cases, sending an appropriate HTTP status""" start="00:33:28.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""based on what happened.""" start="00:33:32.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""In other cases-- let's see if""" start="00:33:34.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I've got an explicit `throw` left in here--""" start="00:33:38.003" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""in other cases, just trapping different types""" start="00:33:42.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""of failure conditions.""" start="00:33:45.840" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm going to look at my pad, and I do see a question here.""" start="00:33:47.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So let me jump in here.""" start="00:33:54.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""[Leo]: Corwin, just to make sure, are you switching to Q&A?""" start="00:33:58.880" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Are you finished with your presentation?""" start="00:34:00.640" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Well, as I said, I'm happy to take Q&A throughout.""" start="00:34:02.380" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But yes, let's say yes to that.""" start="00:34:05.260" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Okay, so Corwin, what I'm going to need to do now--""" start="00:34:08.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you are in charge of the room.""" start="00:34:10.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""We are going to open up the room so""" start="00:34:12.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that if people have questions watching right now on Gen,""" start="00:34:14.060" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""feel free to come in.""" start="00:34:17.220" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And there was something else I needed to say.""" start="00:34:18.700" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Yes, Corwin, if there's any problem,""" start="00:34:22.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""whisper to us on Mumble.""" start="00:34:24.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So you might want to unmute Mumble""" start="00:34:25.700" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and be able to listen to us over there.""" start="00:34:27.500" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: I can't do that, Leo.""" start="00:34:29.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If I unmute, Mumble is going to bleed through.""" start="00:34:32.480" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Okay, sure.""" start="00:34:36.440" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Well, if you have any problem,""" start="00:34:36.960" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""type in #emacsconf-org channel,""" start="00:34:39.417" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and we'll be with you, OK?""" start="00:34:41.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Or I'll PM somebody.""" start="00:34:42.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But I don't anticipate having any problems.""" start="00:34:43.520" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'll put something in -org when I run out of steam here.""" start="00:34:45.760" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""How's that?""" start="00:34:49.040" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Amazing, cool.""" start="00:34:50.400" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I will have to leave the room, though.""" start="00:34:51.160" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm leaving the recording going so that we have your Q&A.""" start="00:34:53.320" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And whenever you're available--""" start="00:34:56.800" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: I'll shut off the recording when I close the room.""" start="00:34:58.080" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Leo]: Okay, great.""" start="00:35:02.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Good luck, Corwin.""" start="00:35:02.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""[Corwin]: Thank you.""" start="00:35:04.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, and if you're still with me, well, thanks.""" start="00:35:06.500" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I appreciate that.""" start="00:35:09.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I did offer to be opposite RMS.""" start="00:35:13.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I'm in no way offended if people do want to jump over,""" start="00:35:16.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""especially as that starts to shift over to Q&A.""" start="00:35:20.060" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm taking Leo's leaving as a pretty good indication""" start="00:35:23.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that that's happening now-ish.""" start="00:35:26.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I totally understand""" start="00:35:28.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""if folks are more excited to do that.""" start="00:35:31.386" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Meanwhile, let me just jump over to the question""" start="00:35:35.020" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that I received.""" start="00:35:37.940" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'll show the pad here so that I save myself""" start="00:35:38.660" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""reading the question out.""" start="00:35:46.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But I'll paraphrase it.""" start="00:35:47.860" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""Why am I not running the web server in Emacs?""" start="00:35:48.940" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That would be a great way to do it.""" start="00:35:52.660" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I chose to build it in Node.js""" start="00:35:54.380" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""because that was trivially easy for me.""" start="00:35:56.341" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""And then finally, am I using org-info-js?""" start="00:36:22.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""No, I learned about this essentially at this conference.""" start="00:36:24.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So that's something I'll be learning more about.""" start="00:36:27.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And it could well influence this project.""" start="00:36:30.660" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, and thanks for the questions.""" start="00:36:34.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, I'm going to slow my roll just a little bit here""" start="00:36:59.020" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""because I think I kind of have all the time in the world.""" start="00:37:02.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I will be wrapping up within about 15 or 20 minutes""" start="00:37:06.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""at the latest just to avoid stressing out""" start="00:37:11.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""my fellow organizers, especially Leo and Sacha""" start="00:37:15.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that have the bulk of the heavy lifting this year,""" start="00:37:18.828" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and Amin, and really, thanks all to everybody.""" start="00:37:22.260" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""God, the nicest part of doing my own talk""" start="00:37:26.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is that I get to say that.""" start="00:37:29.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's just so much fun to contribute to EmacsConf.""" start="00:37:31.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""And if you're at all interested, there's""" start="00:37:35.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""plenty of completely backstage, behind the curtain role.""" start="00:37:38.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Behind the curtain roles doesn't mean""" start="00:37:43.100" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you have to be somebody that likes""" start="00:37:45.340" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""talking or being on webcam.""" start="00:37:47.866" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Sorry that my camera isn't working this year.""" start="00:37:50.060" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I spent quite a while fussing with that""" start="00:37:52.300" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and lost all my time to get my prerec working.""" start="00:37:53.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, so trying to think where I can take us""" start="00:37:56.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""without my demo working.""" start="00:38:10.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I was really hoping to show the Org Babel piece.""" start="00:38:11.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That's really fun.""" start="00:38:14.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""So let me just mention briefly how I'm using this at work.""" start="00:38:15.580" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So at work, I'll have some type of Org document.""" start="00:38:20.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And usually, it's a project.""" start="00:38:25.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So the title of the document is My Project.""" start="00:38:27.700" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then I'll have a requirements section.""" start="00:38:32.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I'll have a meeting notes section.""" start="00:38:37.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""That's probably the key thing.""" start="00:38:43.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then as the project goes on, I'll start having--""" start="00:38:44.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm a solutions architect.""" start="00:38:49.540" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So my job is formalizing design in large part.""" start="00:38:50.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So then I'll have a design documents section.""" start="00:38:55.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And this is where I'll be doing a lot of my work.""" start="00:39:01.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I'll start out saying--""" start="00:39:05.020" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And maybe Bob is a subject matter expert""" start="00:39:26.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""whose buy-in I need to have on how we're going""" start="00:39:29.340" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to do the high-level design.""" start="00:39:32.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Maybe a lead engineer or a dev manager""" start="00:39:34.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""or something like that.""" start="00:39:37.297" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, as my work goes on,""" start="00:39:39.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""then this will start getting into more detail.""" start="00:39:42.654" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And things of this nature.""" start="00:40:16.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""As things get further and further,""" start="00:40:18.660" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'll actually have documentation""" start="00:40:20.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that I'm adding in here.""" start="00:40:21.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Oh, I see.""" start="00:40:22.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's a big mess.""" start="00:40:28.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, well, we'll just reuse this.""" start="00:40:29.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I can insert those all in line.""" start="00:40:32.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And now for the fun part,""" start="00:40:40.380" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""let's see if the most trivial case""" start="00:40:42.158" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""is working here.""" start="00:40:44.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""No.""" start="00:40:49.940" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, completely broken.""" start="00:40:51.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Let me drag.""" start="00:40:52.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, well, apologies again for the poor quality""" start="00:40:57.260" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""of my demo today.""" start="00:41:05.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And let me just look real quick at my Etherpad once more.""" start="00:41:06.260" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And I'll glance at BBB to see if there's anybody""" start="00:41:13.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""jumping in with questions.""" start="00:41:16.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And then I'll go back to IRC and look for questions there.""" start="00:41:18.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""OK, and I don't see any additional questions on the pad.""" start="00:41:23.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I'm just going to scan IRC real quick.""" start="00:41:33.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I suspect that the TreeSitter comment isn't for me.""" start="00:41:35.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""All right, and I'm not seeing a lot of questions there.""" start="00:41:44.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So I'm just going to vamp for just a minute or two.""" start="00:41:56.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""As I mentioned, I'm a conference volunteer.""" start="00:42:04.340" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This is my third year volunteering""" start="00:42:07.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with the conference.""" start="00:42:09.700" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And probably if you take one thing away from my talk,""" start="00:42:11.940" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""it should be I really like volunteering""" start="00:42:15.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""for the conference.""" start="00:42:17.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It's fun.""" start="00:42:18.500" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It makes me feel sort of close to the pulse.""" start="00:42:19.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And it gives me a chance to just interact with people""" start="00:42:23.500" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that have very different perspectives on Emacs,""" start="00:42:27.297" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""which is something that I really value a lot.""" start="00:42:30.107" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Emacs, like anything else sort of in the internet world,""" start="00:42:32.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""has a real echo chamber factor.""" start="00:42:40.220" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If you do or don't like use-package,""" start="00:42:42.940" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you probably interact with a lot of people""" start="00:42:46.505" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that feel the same way about that.""" start="00:42:49.136" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And so I really recommend volunteering for EmacsConf""" start="00:42:53.500" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""as a way to sort of mix it up and get""" start="00:42:57.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to know people that may not use Emacs""" start="00:43:01.340" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the same way that you do.""" start="00:43:03.859" video="mainVideo-orgvm" id="subtitle"]]
+[[!template new="1" text="""Or perhaps more on topic, though,""" start="00:43:08.380" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the log line for this talk is it's really quite easy""" start="00:43:10.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to build a program that uses Emacs in a pipeline capability.""" start="00:43:14.300" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I think there's a ton of opportunity in this space.""" start="00:43:20.980" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""This particular example is just a trivial web server""" start="00:43:23.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""written using Node.js.""" start="00:43:27.700" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""But as was pointed out, we could have used elnode""" start="00:43:30.780" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""as a web server""" start="00:43:31.546" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and done the entire thing within Emacs Lisp.""" start="00:43:40.060" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Or really, almost any technology""" start="00:43:44.060" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""would get us this capability.""" start="00:43:48.766" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""From an implementation standpoint,""" start="00:43:52.900" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I had a lot of fun building""" start="00:43:54.660" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""this trivial little Elisp parser,""" start="00:43:56.848" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""and I'm rather pleased with the fact""" start="00:43:59.580" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""that the entirety of that--""" start="00:44:03.220" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""the entire algorithm for turning JavaScript or JSON data,""" start="00:44:07.340" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""we could say, into Elisp is really a one-liner,""" start="00:44:14.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""albeit a nasty one-liner. That was pretty cool""" start="00:44:20.420" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""to discover how simple that was.""" start="00:44:25.820" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So in my mind, that opens up a lot of possibility.""" start="00:44:28.180" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""If it's this easy in JavaScript,""" start="00:44:31.220" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""I wouldn't expect it to be hard,""" start="00:44:32.890" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""any more difficult in your favorite language.""" start="00:44:34.709" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""Glance one more time to see if there""" start="00:44:36.860" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""happen to be any other questions.""" start="00:44:41.140" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""And not seeing any, I'm going to go ahead and start""" start="00:44:42.940" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""wrapping up my chat now.""" start="00:44:47.300" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""It will take me a couple of minutes to do that.""" start="00:44:49.500" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""So if you do have any other questions that you""" start="00:44:51.620" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""want to drop into the pad or any comments,""" start="00:44:54.580" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""you're more than welcome to hit me with those""" start="00:44:56.460" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""as I coordinate closing this chat, this talk,""" start="00:44:59.740" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""with the organizer team.""" start="00:45:03.820" video="mainVideo-orgvm" id="subtitle"]]
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20orgvm%3A%20orgvm%3A%20a%20simple%20HTTP%20server%20for%20org)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/orgvm-before.md b/2022/info/orgvm-before.md
new file mode 100644
index 00000000..46c4c612
--- /dev/null
+++ b/2022/info/orgvm-before.md
@@ -0,0 +1,46 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="orgvm">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect stroke-width="3" x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 47-min talk followed by included in main video Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen">#emacsconf-gen</a>)
+Etherpad: <https://pad.emacsconf.org/2022-orgvm>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T16:10:00Z" end="2022-12-04T16:20:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~11:10 AM - 11:20 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~10:10 AM - 10:20 AM CST (US/Central)<br />Sunday, Dec 4 2022, ~9:10 AM - 9:20 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~8:10 AM - 8:20 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~4:10 PM - 4:20 PM UTC <br />Sunday, Dec 4 2022, ~5:10 PM - 5:20 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~6:10 PM - 6:20 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~9:40 PM - 9:50 PM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~12:10 AM - 12:20 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~1:10 AM - 1:20 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+<div class="vid"><video controls preload="none" id="orgvm-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="orgvm-mainVideo" data="""
+00:36.000 Introduction
+01:31.080 What is orgvm?
+02:01.880 Nodejs
+02:49.560 The itch I was trying to scratch
+03:38.320 Demo
+05:29.760 Needs a relatively recent version of Emacs
+06:24.920 Usage patterns
+08:13.520 Emacs Lisp
+09:09.160 Variables
+10:38.720 Replace
+11:19.120 Getting into the code some more
+13:06.480 Generating Elisp
+13:37.320 Org blocks
+14:32.400 Building some Lisp
+16:43.000 How Elisp gets encoded
+19:25.040 How the export works
+22:09.860 Walking through the code
+26:07.440 Executing the source block
+32:39.760 Conclusion
+33:58.880 Questions and answers
+35:48.940 Why am I not running the web server in Emacs?
+36:22.140 Is this using org-info-js?
+37:35.460 EmacsConf
+38:15.580 How I'm using this at work
+42:04.340 Volunteering for EmacsConf
+43:08.380 It's easy to build a program that uses Emacs in the pipeline
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.webm">Download --main.webm (159MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/9Ybxov8eVA763kRvHuM6zY">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/orgvm-nav.md b/2022/info/orgvm-nav.md
new file mode 100644
index 00000000..a6936218
--- /dev/null
+++ b/2022/info/orgvm-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/justl">justl: Driving recipes within Emacs</a>
+Next by track: <a href="/2022/talks/rms">What I'd like to see in Emacs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/orgyear-after.md b/2022/info/orgyear-after.md
new file mode 100644
index 00000000..b1e57ef7
--- /dev/null
+++ b/2022/info/orgyear-after.md
@@ -0,0 +1,406 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="orgyear-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello. If you're listening to this talk,""" start="00:00:00.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""then you should be at least a bit interested""" start="00:00:04.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in Org mode, which is fantastic""" start="00:00:06.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""because there have been quite a few""" start="00:00:09.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""interesting developments over the past year or so.""" start="00:00:11.253" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I'm Timothy, as you may have gathered from the last talk,""" start="00:00:14.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and I'm also quite involved with the Org project,""" start="00:00:19.400" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""so I'd like to go through a few of those developments""" start="00:00:21.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""over the past year or so and give you a few hints as well""" start="00:00:24.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as to what potentially lies around the corner with Org mode.""" start="00:00:27.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""The starters, slightly on the more boring side""" start="00:00:32.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but rather significant change to the project,""" start="00:00:35.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""occurred with the housekeeping or organisation.""" start="00:00:37.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""The codebase for the Org project has actually shifted over""" start="00:00:40.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""from a self-hosted Gogs instance over to Savannah,""" start="00:00:43.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which means it's now living right alongside""" start="00:00:46.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the Emacs codebase.""" start="00:00:49.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""This has been accompanied by the creation""" start="00:00:51.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of a whole bunch of Org-related repos under""" start="00:00:53.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Bastien's (Org's maintainer) personal sourceHut account.""" start="00:00:58.220" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""We've got the source of the website, the Org wiki Worg,""" start="00:01:03.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as well as Org contrib.""" start="00:01:06.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Another recent addition to this list of Org-related repos""" start="00:01:08.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is the new Org mode tests--continuous integration.""" start="00:01:13.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now, this is rather important, because while we do recommend""" start="00:01:17.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that all contributors actually run make tests""" start="00:01:22.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""before submitting patches to the Org project,""" start="00:01:25.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""this doesn't always happen.""" start="00:01:29.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""It can also actually be a bit harder than you expect""" start="00:01:31.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to run the tests because there are a lot""" start="00:01:34.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of trans-dependencies you get with Org;""" start="00:01:35.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""for instance, with all of the various Babel libraries""" start="00:01:37.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which actually require other packages""" start="00:01:40.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or programming language to be installed on the system.""" start="00:01:42.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Having a single self-contained test system""" start="00:01:46.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to actually make sure that Org can be regularly""" start="00:01:50.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and thoroughly tested should be a great help for actually""" start="00:01:53.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""ensuring the quality of the contributions.""" start="00:01:57.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""The funding structure for Org has also undergone a bit""" start="00:02:04.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of a shift. Historically, we've just directed everybody""" start="00:02:07.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""who's interested in financially supporting the Org project""" start="00:02:10.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to the maintainer Bastien's personal GitHub sponsors""" start="00:02:14.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and LibrePay accounts. Now, early this year,""" start="00:02:18.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Bastion has created the Librepay Org mode team account,""" start="00:02:22.400" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which means that you can actually now""" start="00:02:27.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""support the Org project as opposed to""" start="00:02:29.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the person leading the Org project.""" start="00:02:33.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Currently, this just distributes donations between Bastien,""" start="00:02:34.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Ihor, and myself. However, the idea is that""" start="00:02:39.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as the active contributors for the Org project""" start="00:02:42.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""come and go over time, the list of people on this team""" start="00:02:45.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""can be changed as seems sensible. The hope here is that""" start="00:02:50.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""it will simplify both how easy it is""" start="00:02:57.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to actually financially support the Org project""" start="00:03:00.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as well as how easily people contributing""" start="00:03:02.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to the Org project can be supported.""" start="00:03:04.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""If you're interested in supporting the Org project,""" start="00:03:09.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""there's never been a better time than now""" start="00:03:13.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to have a look at this""" start="00:03:15.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and let anybody who might also might be interested know.""" start="00:03:16.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Hopefully, this leads to a healthier funding structure""" start="00:03:23.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that will scale better into the long term""" start="00:03:25.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and thus better support the work that happens with Org.""" start="00:03:28.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Now, the project itself has of course also seen quite a bit""" start="00:03:32.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of development over the past year.""" start="00:03:37.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""We've had about 800 comments from 80 contributors.""" start="00:03:38.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Within these comments, there's been a lot of polishing""" start="00:03:44.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""quality-of-life improvements,""" start="00:03:46.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and also quite a few new features.""" start="00:03:48.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now, I haven't got nearly enough time""" start="00:03:50.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to go through this exhaustively,""" start="00:03:52.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""so we're just going to go through a quick highlight reel.""" start="00:03:54.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""There's a collection of export improvements""" start="00:03:58.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""from things which affect all export backends,""" start="00:04:00.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""like including remote content""" start="00:04:04.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and adding new things like DOI links""" start="00:04:07.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and support for encrypted Org files,""" start="00:04:09.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as well as a whole lot of export-backend-specific changes.""" start="00:04:11.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""For example, quite a few backends--""" start="00:04:14.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I've mentioned the LaTeX one here,""" start="00:04:17.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but also others such as Texinfo--have now got""" start="00:04:18.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""rich support for various types of attributes and objects.""" start="00:04:23.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""The HTML backend has had a few things boosted up and well,""" start="00:04:26.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""if you want to see the full list,""" start="00:04:31.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""just take a look at the release notes.""" start="00:04:33.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""We've also seen a similar collection of improvements""" start="00:04:36.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""with the Babel backends. Once again, this is scattered--""" start="00:04:39.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or well, it can be split into two sets of changes.""" start="00:04:43.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""There's some which affect all of Babel, essentially.""" start="00:04:46.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""For instance, the new syntax of parsing""" start="00:04:49.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the raw content of code blocks, or the changes with Noweb.""" start="00:04:52.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""For example, :noweb-prefix is a new option that can be used.""" start="00:04:56.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And then there's also a collection""" start="00:05:01.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of backend-specific changes. So ASCII graphics with PlantUML""" start="00:05:03.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or enhanced return capabilities with the ob-python library.""" start="00:05:07.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""And then of course, as before, a whole collection""" start="00:05:12.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of more changes which you can find in the release notes.""" start="00:05:17.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Last but by no means least,""" start="00:05:19.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""there have been quite a few changes within the rest of Org.""" start="00:05:22.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So this is, once again, far too many things to list,""" start="00:05:26.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but it's things like improved refiling,""" start="00:05:30.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""capture templates, image preview sizing,""" start="00:05:33.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""clocktable settings, agenda tweaks,""" start="00:05:36.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and well, a whole lot more.""" start="00:05:38.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Yes, basically, the essence of what's here""" start="00:05:41.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is a lot of little changes""" start="00:05:45.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which just address particular use cases in ways""" start="00:05:48.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that I don't think anybody's going to be seeing""" start="00:05:50.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the impact of all of them,""" start="00:05:55.053" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but I think most people should at least""" start="00:05:55.787" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""find one or two things""" start="00:05:57.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which actually improve their own usage.""" start="00:06:00.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Now these are the sort of assorted""" start="00:06:04.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""relatively minor improvements,""" start="00:06:06.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but there are also some major ones.""" start="00:06:07.400" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And one in particular, citations.""" start="00:06:09.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So I think this has been, at this point,""" start="00:06:12.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""over a decade in the making,""" start="00:06:15.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but Org finally has first-class support for citations.""" start="00:06:17.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And I have to say, it is marvellous.""" start="00:06:21.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""You'd hope so, after the labour. I think it is.""" start="00:06:23.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""It can be said that it's actually worth the wait.""" start="00:06:27.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I think out of the various options you've got now,""" start="00:06:30.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""(for example, the way that Pandoc""" start="00:06:31.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and Markdown otherwise[??] do it)""" start="00:06:34.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Org has a fantastically succinct and flexible""" start="00:06:35.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""syntax for citations, which scales really well for all sorts""" start="00:06:40.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of different use cases.""" start="00:06:45.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Additionally, on the backend side of things,""" start="00:06:47.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we've now got a generalised way for handling citations""" start="00:06:51.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which has been quite helpful for the--I think""" start="00:06:55.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I could say rather rapid development""" start="00:06:57.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of multiple citation backends for Org.""" start="00:07:00.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And I think it's just fantastic, really, seeing""" start="00:07:03.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""how quickly Org has gone""" start="00:07:07.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""from having no support for citations""" start="00:07:09.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""at the start of this year""" start="00:07:12.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to what can be described as""" start="00:07:13.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""a wonderfully rich and flexible support""" start="00:07:17.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""with, well, multiple backends for citations.""" start="00:07:20.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I think that's something that we can really be proud of.""" start="00:07:23.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And it's been a fantastic contribution""" start="00:07:27.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""for everybody involved in this process.""" start="00:07:30.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Okay, so we've had features.""" start="00:07:31.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""There have also been a whole lot of""" start="00:07:36.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""quality of life improvements.""" start="00:07:38.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Once again, many more than I can reasonably mention here.""" start="00:07:39.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So I'm just going to flick it through""" start="00:07:43.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""a few of them. A few big ones though,""" start="00:07:46.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Ihor is responsible for three lovely developments with Org,""" start="00:07:48.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""one of which is Org fold. So this is a generalisation""" start="00:07:52.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of the way that content is folded in Org.""" start="00:07:55.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And I think quite a few of you will actually underestimate""" start="00:07:57.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""how much can be folded in Org.""" start="00:08:00.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""It's not just a matter of headlines.""" start="00:08:01.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""It's headlines, code blocks, lists, environments,""" start="00:08:03.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""all sorts of things can actually be folded in Org.""" start="00:08:07.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And the introduction of Org fold is important""" start="00:08:10.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""for two reasons. One is that it has allowed for""" start="00:08:14.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""text-property-based folding,""" start="00:08:18.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which in Emacs versions less than 29""" start="00:08:21.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""has a huge difference in performance,""" start="00:08:24.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is particularly apparent with larger files.""" start="00:08:27.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""The second significant thing about this is that""" start="00:08:29.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""it now actually provides a more general way""" start="00:08:32.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to actually describe changes to the folding structure.""" start="00:08:36.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So before there was direct modification of""" start="00:08:39.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""messing with overlays scattered around the Org code base.""" start="00:08:42.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now we have a much more well organised system""" start="00:08:45.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""where we use Org fold to say what is and isn't folded""" start="00:08:49.400" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and to manage the state of all of that,""" start="00:08:53.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is, I think, just from a sort of design,""" start="00:08:54.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""sort of project design approach, a much better system.""" start="00:08:59.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""We've also got the Org element cache by Ihor.""" start="00:09:02.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""This is actually something which was discussed""" start="00:09:06.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""quite a while ago, but has somewhat stalled""" start="00:09:09.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""due to the difficulty of cache invalidation.""" start="00:09:12.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Ihor has sunk a tremendous amount of effort into this""" start="00:09:14.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and has improved it to the point""" start="00:09:17.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""where we've now actually been able to""" start="00:09:19.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""enable this by default. So what this basically does is""" start="00:09:21.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""it records lots of information""" start="00:09:25.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""about the structure of the Org document""" start="00:09:28.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and allows for, well, with the appropriate modifications""" start="00:09:30.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that Ihor has also made throughout the Org element library""" start="00:09:34.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to use this information to speed up various operations""" start="00:09:37.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""based on the Org document syntax tree.""" start="00:09:41.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And so this has been quite--""" start="00:09:44.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the improvements have been scattered all over the place,""" start="00:09:48.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but for a good example for libraries""" start="00:09:49.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or anybody who's wanting to quickly map over Org elements""" start="00:09:52.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is `org-element-cache-map', which now provides""" start="00:09:57.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""a much, much faster way to map over""" start="00:10:00.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""all of the Org elements in a document.""" start="00:10:04.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""This also ties into the third major feature from Ihor""" start="00:10:07.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which I'd like to mention, which is Org persist.""" start="00:10:10.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So this provides a method of persisting values""" start="00:10:13.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""across Emacs sessions, basically saving them""" start="00:10:17.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to a file somewhere and loading them.""" start="00:10:20.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now this works for Elisp values and it also works for files,""" start="00:10:21.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which we made use of with the improved capabilities""" start="00:10:25.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""for remote files and exports.""" start="00:10:29.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""This has also been used with the `org-element-cache' data.""" start="00:10:32.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So now, if you've got a massive Org file""" start="00:10:35.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and you open it once, that data can be saved to""" start="00:10:37.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""with the Org element cache to Org persist,""" start="00:10:41.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and the next time you load this file""" start="00:10:44.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in another Emacs session,""" start="00:10:46.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we can just start with the cached data""" start="00:10:47.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""instead of having to construct everything from scratch,""" start="00:10:50.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is quite nice. Once again, a change which""" start="00:10:53.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""much like the other ones,""" start="00:10:56.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we will see more of an impact in larger files,""" start="00:10:57.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but a very welcome one everywhere.""" start="00:11:00.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Now with remote files, there's also been the beginnings""" start="00:11:02.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of a bit of an effort with Org""" start="00:11:06.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to improve the approach we have to safety.""" start="00:11:09.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So in this case previously,""" start="00:11:13.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Org would unconditionally download""" start="00:11:15.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""all the remotes of files that's all referenced.""" start="00:11:17.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And now, it's actually going to maintain a list of""" start="00:11:19.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""sort of safe resources and prompt you""" start="00:11:23.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""when it's surprised by something,""" start="00:11:25.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to work out whether it should""" start="00:11:26.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""just download this one resource,""" start="00:11:29.887" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""mark the whole domain as safe, and a few other options.""" start="00:11:31.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""We're also going to probably see""" start="00:11:35.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""a similar approach extend to, for instance,""" start="00:11:36.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""bits of Babel execution in the future.""" start="00:11:39.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Okay bug fixes. It will be remiss of me not to mention that""" start="00:11:40.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""along with all of the features""" start="00:11:45.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and quality of life improvements,""" start="00:11:46.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""there has been a huge pile of bug fixes.""" start="00:11:49.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I think the best way to actually get a look at this""" start="00:11:51.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""would be to look at the release notes""" start="00:11:57.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or maybe even the actual commit log,""" start="00:11:59.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but you could also just take my word and say that""" start="00:12:00.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""there have been a whole load of them""" start="00:12:04.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""over the past year. So just yes, the code base, I think,""" start="00:12:05.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is just gradually getting into better and better shape.""" start="00:12:11.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Asynchronous session evaluation is I think possibly""" start="00:12:15.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the final quality-of-life improvement""" start="00:12:18.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I want to mention. This came early in the year,""" start="00:12:19.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""just with ob-python, and it's been delayed""" start="00:12:22.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""because in order to actually make it work,""" start="00:12:24.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""they've required some fundamental changes to the way""" start="00:12:26.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that ob-comint works.""" start="00:12:29.400" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now that's been implemented,""" start="00:12:31.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we've since seen support extended to ob-R,""" start="00:12:33.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and hopefully, we'll see more languages join this list""" start="00:12:36.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in the not-too-distant future.""" start="00:12:38.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Now I guess one bonus which I tacked on just for fun is""" start="00:12:42.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""it's now more convenient than ever""" start="00:12:45.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to actually specify the permissions for tangled files.""" start="00:12:47.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Previously you had to give a list expression""" start="00:12:52.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which should be evaluated.""" start="00:12:55.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now you can give it directly in octal form""" start="00:12:55.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""instead of being a list expression""" start="00:12:58.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that produces an integer representation""" start="00:12:59.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of the octal permissions.""" start="00:13:01.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Or you can use ls style: rwx and dashes.""" start="00:13:03.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Or even just chmod. I want to be able to execute this""" start="00:13:08.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as a user, which will basically modify""" start="00:13:13.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the default permission to add that capability.""" start="00:13:16.387" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Alrighty. So that's the Org project itself,""" start="00:13:18.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but there's also a whole ecosystem.""" start="00:13:22.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So what have we got here?""" start="00:13:24.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Well a whole bunch of Zettelkasten""" start="00:13:27.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or personal-knowledge-base-type projects.""" start="00:13:30.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""One of which is logseq, so that's an online open source""" start="00:13:32.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Zettelkasten which supports both Markdown""" start="00:13:36.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and also Org mode as a first-class format.""" start="00:13:39.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Then of course we have Org Roam, which provides""" start="00:13:41.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""a Zettelkasten built directly on top of Org within Emacs.""" start="00:13:45.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Both of these are seen considerably interesting""" start="00:13:48.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""over the past year.""" start="00:13:51.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Moving on to visuals, minad has produced""" start="00:13:52.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""another lovely minad package in the form of org-modern""" start="00:13:56.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which just spruces up the visuals of all documents""" start="00:14:00.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and seems to have been quite well received recently""" start="00:14:04.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""since its release.""" start="00:14:09.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""Building on top of the citations from earlier,""" start="00:14:10.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Andras Simonyi has produced""" start="00:14:13.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the wonderful citeproc-org library,""" start="00:14:14.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which, if you're not familiar,""" start="00:14:16.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""allows the capabilities of the citation style language""" start="00:14:20.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which has now become something""" start="00:14:25.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is quite widely supported""" start="00:14:26.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to be used for Org citation exports.""" start="00:14:28.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""This means that you've got access to I think at this point""" start="00:14:31.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is it thousands or tens of thousands""" start="00:14:33.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of different bibliography and citation formats""" start="00:14:35.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is obviously a huge boon to org citations.""" start="00:14:39.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Lastly, just to be slightly critical,""" start="00:14:42.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I'm actually going to mention the Neovim Org mode project,""" start="00:14:46.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""because I think this really shows the interest""" start="00:14:49.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in Org as the format, beyond just Emacs.""" start="00:14:52.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I think I haven't gone into it much here,""" start="00:14:55.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but there's been quite a lot of development""" start="00:14:58.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""with external tools making use of the Org format.""" start="00:15:00.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Clearly, we've done quite a few things right,""" start="00:15:04.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and so I think it's interesting to see the interest""" start="00:15:07.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that exists outside of Emacs,""" start="00:15:11.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""even without all the lovely tooling we've built,""" start="00:15:13.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""just out of appreciation of the formatting, its potential.""" start="00:15:15.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Speaking of the format, though,""" start="00:15:18.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we've also seen three new parsers on the scene this year.""" start="00:15:21.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""We've got one in Julia, Haskell""" start="00:15:24.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and another one for Tree sitter.""" start="00:15:27.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""The last one, I think, is currently the least capable,""" start="00:15:28.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but also potentially the most interesting""" start="00:15:31.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in terms of what possibilities it allows for.""" start="00:15:32.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Okay. So that's a quick speed run through""" start="00:15:36.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""some of the developments over the past year.""" start="00:15:42.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""What's coming next? So there's been""" start="00:15:44.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""quite a lot of work done with the Org syntax document.""" start="00:15:47.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""In fact, I've completely written it,""" start="00:15:51.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and we've now taken it up to spec""" start="00:15:54.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to actually accurately describe the way""" start="00:15:57.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that the Org format is, as of Org 9.6.""" start="00:15:59.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now, I think this is quite an important document""" start="00:16:03.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""for the growth in parsing tools""" start="00:16:08.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to help actually ensure""" start="00:16:09.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that the way that external tools process Org""" start="00:16:11.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is actually in sync with the way that Org mode does.""" start="00:16:16.440" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I think it's worth doing everything we can, really,""" start="00:16:20.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to avoid the sort of implementation drift""" start="00:16:22.560" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that we've seen with Markdown.""" start="00:16:24.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I don't want anything near that.""" start="00:16:27.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""This is also quite good for the Org format itself because,""" start="00:16:29.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in the process of going through this sort of effort,""" start="00:16:32.487" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""it brings attention to irregularities in the syntax""" start="00:16:34.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which you might want to resolve, and as well as""" start="00:16:38.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""helping the robustness of org mode itself.""" start="00:16:41.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So ultimately, this is to everybody's benefit, really.""" start="00:16:43.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""It's also my personal hope that this might actually""" start="00:16:46.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""get to the point where we consider submitting this""" start="00:16:51.800" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as a text format to the Internet Engineering Task Force""" start="00:16:54.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""as a new text format. So that would be quite nice.""" start="00:16:59.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""The Org project itself has a layer on top""" start="00:17:06.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of the mailing list called Woof developed by Bastien,""" start="00:17:09.640" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and that's about to have another major release.""" start="00:17:13.680" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So what this is going to do is improve the ease of which""" start="00:17:16.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we can actually monitor what's going on""" start="00:17:21.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""with the mailing list. So this is when people have patches,""" start="00:17:23.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""bug reports, or other types of things""" start="00:17:27.080" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""raised on the mailing list.""" start="00:17:29.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""It's a nice way to collect the status of those""" start="00:17:30.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and put them all in one place.""" start="00:17:34.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So improvements to this improve the ease of which""" start="00:17:35.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""the Org mode project can be managed,""" start="00:17:37.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is always quite nice to see.""" start="00:17:40.400" video="mainVideo-orgyear" id="subtitle"]]
+[[!template new="1" text="""There's also been--jumping back to the export""" start="00:17:41.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which is mentioned right at the start of this presentation--""" start="00:17:46.320" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""we've got the introduction of engraved faces""" start="00:17:48.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to LaTeX export. Now what's quite interesting about this""" start="00:17:51.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""is that it's actually used as Emacs' native font lock""" start="00:17:54.480" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and allows for processing that in a generalized way""" start="00:17:57.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""to different output formats. So at the moment,""" start="00:18:01.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""this is just integrated with ox-latex,""" start="00:18:03.840" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""but it contains the functionality needed for HTML and ASCII,""" start="00:18:06.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and it could also be extended to other formats like ODT.""" start="00:18:11.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""So we could potentially have full syntax highlighting""" start="00:18:13.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""based on Emacs exported to, well,""" start="00:18:18.280" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""really all of the Org mode backends,""" start="00:18:20.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""except, I suppose, the plain text ones like Markdown.""" start="00:18:24.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And I think from both the capabilities perspective--""" start="00:18:27.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""because I think, really, font lock in Emacs""" start="00:18:29.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""from Emacs major modes""" start="00:18:33.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""tends to blow basically everything else vaguely used""" start="00:18:34.200" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""out of the water, whether it be listings, minted""" start="00:18:37.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""or other efforts--and also from a consistency point of view,""" start="00:18:39.240" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""this could be quite a nice development.""" start="00:18:45.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Alrighty. Now this talk is &quot;This Year in Org,&quot;""" start="00:18:49.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and I think you all may have guessed""" start="00:18:51.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""this is very much tied into my work with This Month in Org""" start="00:18:52.600" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""which started, I think, a bit over a year ago.""" start="00:18:57.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""And so, as you're all avid readers,""" start="00:19:00.120" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""I'm sure you've noticed""" start="00:19:04.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""that there haven't been as many posts as of late.""" start="00:19:05.920" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Now this isn't because my interest in This Month in Org""" start="00:19:08.520" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""has been diminishing. Simply, it's the consequence""" start="00:19:11.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of an evaporation of my free time.""" start="00:19:15.880" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""However, This Month in Org is still going to stick around.""" start="00:19:18.760" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""The only change really is that the title is going to be--""" start="00:19:22.360" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""probably continue to be""" start="00:19:26.160" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""a bit more aspirational than descriptive""" start="00:19:28.000" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""in the near future. We'll see how this goes.""" start="00:19:30.040" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""Well, thanks for listening to this overview""" start="00:19:32.960" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""of the state of Org at the moment,""" start="00:19:36.720" video="mainVideo-orgyear" id="subtitle"]]
+[[!template text="""and hopefully, I'll see you next year.""" start="00:19:38.600" video="mainVideo-orgyear" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20orgyear%3A%20This%20Year%20in%20Org)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/orgyear-before.md b/2022/info/orgyear-before.md
new file mode 100644
index 00000000..2c6ed2bc
--- /dev/null
+++ b/2022/info/orgyear-before.md
@@ -0,0 +1,29 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><video controls preload="none" id="orgyear-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-orgyear--this-year-in-org--timothy--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-orgyear--this-year-in-org--timothy--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="orgyear-mainVideo" data="""
+00:00.000 Introduction
+00:32.080 Project housekeeping
+01:08.800 Continuous integration
+02:04.680 Funding contributors
+03:32.560 New features
+03:58.640 An assortment of export improvements
+04:36.520 A collection of babel improvements
+05:12.280 A multitude of general org-mode improvements
+06:04.160 Citations
+07:31.600 Quality of life improvements
+07:48.320 Org fold
+09:02.480 Org element cache
+10:07.360 Org persist
+11:02.720 More careful resource downloading
+11:40.200 Bug fixes
+12:15.800 Asynchronous session evaluation
+12:42.800 Nicer tangle mode syntax
+13:18.280 A flourishing ecosystem
+13:52.600 Org-modern
+14:10.120 citeproc-org
+15:44.040 Continuing work on the Org format
+17:06.320 Mailing list management
+17:41.920 Further engraving
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgyear--this-year-in-org--timothy--main.webm">Download --main.webm (28MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgyear--this-year-in-org--timothy--main.opus">Download --main.opus (13MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgyear--this-year-in-org--timothy--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgyear--this-year-in-org--timothy--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgyear--this-year-in-org--timothy--main.pdf">Download --main.pdf</a></li><li><a href="https://toobnix.org/w/qed3SGg4ZMo8fLuzwXoeNP">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/orgyear-nav.md b/2022/info/orgyear-nav.md
new file mode 100644
index 00000000..7419bb9f
--- /dev/null
+++ b/2022/info/orgyear-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/survey">Results of the 2022 Emacs Survey</a>
+Next by track: <a href="/2022/talks/rolodex">Build a Zettelkasten with the Hyperbole Rolodex</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/python-after.md b/2022/info/python-after.md
new file mode 100644
index 00000000..b388d9d2
--- /dev/null
+++ b/2022/info/python-after.md
@@ -0,0 +1,298 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="python-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Hi! My name is Eduardo Ochs. I'm the author""" start="00:00:00.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of an Emacs package called eev...""" start="00:00:04.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and eev is about taking executable notes""" start="00:00:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of everything that you do, and this""" start="00:00:10.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""presentation is about how I use this...""" start="00:00:13.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""how I finally found a way to take""" start="00:00:16.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""executable notes of what the python docs""" start="00:00:18.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""say.""" start="00:00:22.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Let me explain that in another way. I've""" start="00:00:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""try to Learn Python many times, but""" start="00:00:28.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""hm, my brain is wired in a weird way, so""" start="00:00:31.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it didn't work... and finally a few""" start="00:00:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""months ago I found a way of studying""" start="00:00:37.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Python that finally clicked for me.""" start="00:00:40.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""The idea is that... well, it's here in""" start="00:00:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the title - is a way to create short""" start="00:00:47.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""hyperlinks to the""" start="00:00:50.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""documentation of python.""" start="00:00:52.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Here's an example.""" start="00:00:54.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""This file contains some some chunks""" start="00:00:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of code from the Python tutorial and""" start="00:01:00.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""some links to the places in which""" start="00:01:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I found these chunks of code.""" start="00:01:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""for example, if I run this link here""" start="00:01:07.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it opens a certain page of the Python""" start="00:01:12.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""tutorial in my browser - note that it""" start="00:01:14.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""opens the local copy of the""" start="00:01:18.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""documentation -""" start="00:01:19.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and if I""" start="00:01:22.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""run this link here it opens the source""" start="00:01:25.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""in .rst""" start="00:01:29.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of the same page. So the first link opens""" start="00:01:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the HTML and this one opens the""" start="00:01:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""RST. This is useful because in the""" start="00:01:37.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""beginning""" start="00:01:39.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I was copying these chunks of code in""" start="00:01:40.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the obvious way - I would simply""" start="00:01:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""visit the the documentation in HTML and""" start="00:01:46.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I would mark""" start="00:01:50.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""a chunk... a snippet of code here and I""" start="00:01:51.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""would copy it to my notes.""" start="00:01:54.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""And then after a while I""" start="00:01:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""realized that it was much easier to""" start="00:02:01.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""simply go to the RST sources and to copy""" start="00:02:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the chunks of code from there... and""" start="00:02:07.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""note that these links look quite similar.""" start="00:02:10.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""There's one difference here, that is""" start="00:02:14.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this `r` that is prepended to the name""" start="00:02:17.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of the function... the `r` means""" start="00:02:20.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""&quot;open the RST&quot;...""" start="00:02:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and if I use the suffix `w` it means""" start="00:02:26.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""use the documentation on the web instead""" start="00:02:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of using the local copy.""" start="00:02:32.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So this one""" start="00:02:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""opens a local copy""" start="00:02:36.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and this one""" start="00:02:38.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""takes a while""" start="00:02:42.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and opens the""" start="00:02:46.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the page of the documentation in the""" start="00:02:49.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""site of Python blah blah...""" start="00:02:52.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and this thing here is""" start="00:02:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""executable in the usual eev sense, that""" start="00:02:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""we ca... if we type f8 several times here""" start="00:03:02.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the f8s on the lines that start""" start="00:03:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""with red stars create a target buffer""" start="00:03:08.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here... and in this case it creates a""" start="00:03:12.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""target buffer running Python, and if I""" start="00:03:14.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""type f8 on these other lines these are""" start="00:03:17.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the lines are sent""" start="00:03:20.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to that REPL.""" start="00:03:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""But anyway, let me go back.""" start="00:03:25.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Most of the things that I'm going to""" start="00:03:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""present here are in the tutorial of this...""" start="00:03:32.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""package...""" start="00:03:35.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""we can go to the source code""" start="00:03:37.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here in the eev directory - it's a file""" start="00:03:41.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""called eev-rstdoc.el but the best""" start="00:03:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""docs are in the tutorial, here...""" start="00:03:50.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and the tutorial also has some""" start="00:03:53.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""executable""" start="00:03:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""chunks... some snippets of python""" start="00:03:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""code that are executable, but they""" start="00:04:02.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""don't have those nice colors... so""" start="00:04:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""apologies for that.""" start="00:04:07.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""We need to run this thing here to make""" start="00:04:11.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""everything work.""" start="00:04:13.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""This thing will define some functions""" start="00:04:15.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""with funny names that I will""" start="00:04:17.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""explain later.""" start="00:04:19.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Let me explain something new.""" start="00:04:26.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""let's compare all these""" start="00:04:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""links here. They take this argument""" start="00:04:35.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here and they expand the the argument in""" start="00:04:38.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""a certain way. For example this string is""" start="00:04:41.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""expanded to this long URL here... note that""" start="00:04:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it got a prefix here,""" start="00:04:49.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that's quite long... it got the .html here,""" start="00:04:52.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and then the hash and the anchor here...""" start="00:04:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and each one of the functions in the""" start="00:04:59.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""pydoc family expands this""" start="00:05:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""argument in a different way.""" start="00:05:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""The one that that opens the doc in the""" start="00:05:09.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""web uses another prefix -""" start="00:05:12.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this one - and the one that opens the rst""" start="00:05:16.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""file ignores the part after the hash""" start="00:05:20.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""for technical reasons... I was never""" start="00:05:24.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""able to to find a good way to convert""" start="00:05:28.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this hash into a string to search for,""" start="00:05:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""so to make something that goes to""" start="00:05:33.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the right section in the link to the rst""" start="00:05:35.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""doc I have to convert by hand, and by""" start="00:05:38.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""trial and error, this thing here into a""" start="00:05:42.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""pointer to that section, like""" start="00:05:46.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this one...""" start="00:05:48.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""in which the &quot;_numeric-types:&quot;""" start="00:05:50.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""is here.""" start="00:05:55.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So all these links here are based on""" start="00:05:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""expansion, and this is easy to""" start="00:06:02.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""understand...""" start="00:06:04.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""but suppose that I want to""" start="00:06:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""create a link like this, or suppose that""" start="00:06:08.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I'm browsing the docs here""" start="00:06:11.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and I just I follow some some links...""" start="00:06:16.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""let me do something random here...""" start="00:06:21.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""suppose that I decide that this""" start="00:06:31.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""section is very interesting. How can I""" start="00:06:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""create a link to that? I can""" start="00:06:35.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""use this pilcrow symbol and the""" start="00:06:39.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""&quot;Copy link address&quot;,""" start="00:06:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and copy the link to""" start="00:06:45.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""my notes...""" start="00:06:49.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and then the Python family...""" start="00:06:51.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""well, we saw the the functions in the""" start="00:06:55.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Python family have a certain way - have""" start="00:06:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""several ways of expanding these""" start="00:07:00.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""short arguments... and they also have a""" start="00:07:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""certain way of""" start="00:07:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""shortening URLs like this one. If I type""" start="00:07:07.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""`M-x pdk` the message is this one.""" start="00:07:11.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""`pdk` is a mnemonic for""" start="00:07:12.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""&quot;Python doc kill&quot;, and this""" start="00:07:17.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""&quot;kill&quot; means &quot;copy to the kill ring&quot;""" start="00:07:20.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""so if I type `M-x pdk` here it""" start="00:07:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""considers that this thing is a link""" start="00:07:27.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to the python Docs, and it""" start="00:07:31.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""shortens this link in a certain way, and""" start="00:07:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it kills a short link.""" start="00:07:36.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I can insert the short link with C-y""" start="00:07:42.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""(yank)""" start="00:07:45.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and then I can test this link to be sure""" start="00:07:46.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that it points to where I want, and""" start="00:07:49.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""then I can delete this thing, and ta-da,""" start="00:07:52.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""now I have a short link, and of course I""" start="00:07:55.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""can modify this link by adding a suffix""" start="00:07:57.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here...""" start="00:08:00.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and in this case here""" start="00:08:02.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I will have to change the identifier""" start="00:08:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to something else...""" start="00:08:09.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""but I'm not going to do that now.""" start="00:08:12.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""This module of eev comes with three""" start="00:08:18.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""families predefined. One is a family that""" start="00:08:20.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""points to the the documentation of""" start="00:08:24.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Python itself, another one points the""" start="00:08:26.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""documentation of SymPy, that is a program""" start="00:08:28.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""for symbolic computation, like for doing""" start="00:08:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""mathematics equations...""" start="00:08:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and the other one points to the""" start="00:08:37.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""documentation of MatPlotLib.""" start="00:08:40.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""How do these families work?""" start="00:08:43.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Each family has to be defined in two""" start="00:08:47.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""parts.""" start="00:08:51.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Remember that""" start="00:08:53.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""eev has lots of functions""" start="00:08:55.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""like this one... this one""" start="00:08:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""is the most basic, and it is explained""" start="00:09:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here, in this section of the main""" start="00:09:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""tutorial. This section explains that""" start="00:09:08.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""a sexp like this one produces lots of""" start="00:09:13.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""functions - produces a family of""" start="00:09:16.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""functions - and it does that by producing""" start="00:09:19.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""a certain chunk of code and then""" start="00:09:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""executing this chunk of code... and if we""" start="00:09:25.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""add a certain prefix here... `find-` and we""" start="00:09:28.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""execute this we can... instead of executing""" start="00:09:31.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that chunk of code we can see what is""" start="00:09:35.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that chunk of code. In the case of `code-c-d`""" start="00:09:37.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it is this. It is a `setq`, several""" start="00:09:39.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""`defun`s, and some comments here, with""" start="00:09:43.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""links to the documentation.""" start="00:09:47.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""In the case of rstdoc it's the same.""" start="00:09:49.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""We have this function here that defines""" start="00:09:52.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the function in the python family...""" start="00:09:54.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and we can run this to understand what""" start="00:09:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this `code-rstdoc` does.""" start="00:09:59.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""It creates this temporary buffer here...""" start="00:10:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""with lots of `defun`s, a `code-c-d` here,""" start="00:10:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and lots of comments here... and the""" start="00:10:09.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""comments include some tests. For example""" start="00:10:10.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""we can use these functions here to test""" start="00:10:13.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""how the expansion works.""" start="00:10:16.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""And""" start="00:10:21.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""note that in this buffer here we don't""" start="00:10:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have the paths that that this family""" start="00:10:26.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""uses. We don't have for example""" start="00:10:28.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the URL that points to the site of""" start="00:10:31.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Python, to the directory that contains""" start="00:10:33.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the reference manual, or whatever... all""" start="00:10:36.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""these things are in another part of the""" start="00:10:40.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""definition of that family - that is a""" start="00:10:42.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""variable.""" start="00:10:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""If we execute this we go to the""" start="00:10:45.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""source code of eev-rstdoc,""" start="00:10:48.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to the parts in which""" start="00:10:50.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this variable is defined...""" start="00:10:54.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and""" start="00:10:57.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""for each family we have a variable like""" start="00:10:59.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this,""" start="00:11:01.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""whose value is a property""" start="00:11:02.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""list with several fields...""" start="00:11:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""these first fields are very easy to""" start="00:11:07.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""understand - they are used in the""" start="00:11:09.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""expansion... this one too. And these""" start="00:11:10.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""two fields are used in the shrinking -""" start="00:11:16.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""in the shortening - and""" start="00:11:19.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this field here""" start="00:11:21.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""tells what is the name of the""" start="00:11:25.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""killing function""" start="00:11:28.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""so the fields of this thing here are""" start="00:11:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""used""" start="00:11:33.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to generate...""" start="00:11:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""some fields are used to generate the""" start="00:11:36.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""code that appears here, and some fields""" start="00:11:39.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""are simply""" start="00:11:41.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""read by functions like this one, that""" start="00:11:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""consults the variable.""" start="00:11:47.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Now the natural question is: how can we""" start="00:11:51.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""define new families? Or: how can we change""" start="00:11:53.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""a family like this one to point to""" start="00:11:57.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""another version of Python?""" start="00:11:59.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""There are some template-based functions""" start="00:12:03.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""for doing that. They are explained in""" start="00:12:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this section of the tutorial...""" start="00:12:09.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""where is that?...""" start="00:12:10.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""oh God, it's far away...""" start="00:12:14.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here.""" start="00:12:17.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Suppose that we have a package foo, that""" start="00:12:20.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""we want to create a family that points""" start="00:12:23.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to the docs""" start="00:12:25.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of that package foo... so, we""" start="00:12:27.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""can execute this thing here, and it""" start="00:12:31.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""generates this""" start="00:12:32.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this thing from a template.""" start="00:12:34.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""If we just want to modify a current""" start="00:12:37.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""definition we can run something like""" start="00:12:40.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this - note that the family `:py`""" start="00:12:42.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""already exists, and instead of using""" start="00:12:44.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""placeholders in some of these""" start="00:12:47.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""URLs it will use the current values of""" start="00:12:51.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the fields...""" start="00:12:53.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""so we can also use this modify""" start="00:12:55.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""existing families.""" start="00:12:59.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Well these are the technical details.""" start="00:13:01.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Now the natural question is: why do I""" start="00:13:05.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""want this? This doesn't""" start="00:13:08.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""any sense to me! Why should I""" start="00:13:12.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""try this?""" start="00:13:14.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""And the best answer: is for most people""" start="00:13:15.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this way of using""" start="00:13:18.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""executable notes do not make any sense""" start="00:13:21.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""at all at first sight...""" start="00:13:24.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""so what I'm trying to do is: I'm trying""" start="00:13:27.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to write to these tutorials with""" start="00:13:30.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""many examples that are very easy to run,""" start="00:13:33.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and that examine data structures,""" start="00:13:35.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and functions, and test things,""" start="00:13:38.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and so on... so my main argument""" start="00:13:40.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""for convincing people to""" start="00:13:46.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""test this is: this is trivial to test -""" start="00:13:48.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""simply install eev and run this thing""" start="00:13:52.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""here, and run the examples, and probably""" start="00:13:54.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""you're going to find that this""" start="00:13:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""tutorial is fun to follow.""" start="00:13:58.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So that's it! =)""" start="00:14:01.000" video="mainVideo-python" id="subtitle"]]
+
+
+
+Captioner: eduardo
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20python%3A%20Short%20hyperlinks%20to%20Python%20docs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/python-before.md b/2022/info/python-before.md
new file mode 100644
index 00000000..b666a3b6
--- /dev/null
+++ b/2022/info/python-before.md
@@ -0,0 +1,18 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="python">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect stroke-width="3" x="705" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 15-min talk followed by IRC Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">#emacsconf-dev</a>)
+Etherpad: <https://pad.emacsconf.org/2022-python>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: Q&A finished, IRC and pad will be archived on this page
+
+
+
+
+<div class="vid"><video controls preload="none" id="python-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.webm">Download --main.webm (48MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-python--short-hyperlinks-to-python-docs--eduardo-ochs--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/rK5n3EhFisCJPQsCueZdmn">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/python-nav.md b/2022/info/python-nav.md
new file mode 100644
index 00000000..6dd8f920
--- /dev/null
+++ b/2022/info/python-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/fanfare">Fanfare for the Common Emacs User</a>
+Next by track: <a href="/2022/talks/sun-close">Sunday closing remarks</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/rde-after.md b/2022/info/rde-after.md
new file mode 100644
index 00000000..c3d6852f
--- /dev/null
+++ b/2022/info/rde-after.md
@@ -0,0 +1,391 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="rde-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello and welcome everyone at EmacsConf 2022.""" start="00:00:00.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I'm Andrew Tropin, and today""" start="00:00:11.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""we will talk about my Emacs setup.""" start="00:00:13.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I will tell you the story behind it.""" start="00:00:16.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We will discuss what rde and rde Emacs are,""" start="00:00:19.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and we'll make a small Emacs configuration.""" start="00:00:23.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""My original motivation was to have""" start="00:00:28.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a ready for work development environment""" start="00:00:30.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which is reliable and guaranteed to work""" start="00:00:34.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""every time I need it,""" start="00:00:36.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""preferably performant and consistent.""" start="00:00:37.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I say development environment,""" start="00:00:42.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but it actually applies to""" start="00:00:44.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""many other working environment,""" start="00:00:45.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""especially text-heavy.""" start="00:00:47.600" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""An easy and obvious solution is to""" start="00:00:52.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""pick one of existing configuration frameworks""" start="00:00:54.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""like Spacemacs, Doom Emacs, Prelude,""" start="00:00:57.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or something else,""" start="00:01:00.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and to get a pre-configured Emacs""" start="00:01:02.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""in a minute with all bells and whistles.""" start="00:01:05.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But the problem is: only Emacs.""" start="00:01:09.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""In reality, your working environment consists""" start="00:01:12.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""not only from elisp packages,""" start="00:01:16.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but also from system packages""" start="00:01:18.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and their configurations, project libraries,""" start="00:01:21.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""compilers, building tools, etc.,""" start="00:01:23.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and thus you already have at least""" start="00:01:27.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""three, or more likely, five things""" start="00:01:31.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""for managing your environment:""" start="00:01:34.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""configuration, Emacs configuration framework,""" start="00:01:37.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Emacs package manager, system package manager,""" start="00:01:39.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""system/dot files configuration manager,""" start="00:01:42.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""project/language package manager""" start="00:01:46.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and maybe something else.""" start="00:01:49.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Even having our Emacs configuration""" start="00:01:51.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and package manager covered by framework""" start="00:01:56.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""we still have a lot of things""" start="00:01:59.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which we have to interact with,""" start="00:02:02.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""keep in sync, and more importantly,""" start="00:02:04.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""each of them can break.""" start="00:02:08.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But by &quot;works every time,&quot; I mean""" start="00:02:12.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""even if I updated my system packages,""" start="00:02:17.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""configurations, I migrated to a different machine,""" start="00:02:19.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""someone on my team updated project dependencies,""" start="00:02:23.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can get back to work in a matter of seconds,""" start="00:02:29.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or maybe in some cases, minutes.""" start="00:02:31.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""If I have multiple tools""" start="00:02:39.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""for managing my environment""" start="00:02:40.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and even one of them is broken,""" start="00:02:43.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the whole setup is broken.""" start="00:02:45.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Also, if one of them doesn't support""" start="00:02:48.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""deterministic rollback,""" start="00:02:51.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can't guarantee the reliability""" start="00:02:53.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""of my working environment.""" start="00:02:58.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can't be sure that I will be able to""" start="00:02:59.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""rescue or revive it.""" start="00:03:01.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""The less points of failure we have,""" start="00:03:02.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the easier to stay sane.""" start="00:03:06.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Imagine some late breakage notice""" start="00:03:09.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""when you did update a few hours or days ago""" start="00:03:13.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and found it later, and you have""" start="00:03:17.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a few different tools involved.""" start="00:03:20.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It will be really hard to find the cause""" start="00:03:25.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and to make everything work again.""" start="00:03:28.280" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""Is it possible to have one tool""" start="00:03:34.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to cover all the needs I described above?""" start="00:03:37.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Yes, almost. With this tool,""" start="00:03:44.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you can get a reliable setup.""" start="00:03:48.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Now, I talk about functional package managers.""" start="00:03:50.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Functional package managers allow us to""" start="00:03:57.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""manage systems, users, Emacs, project/""" start="00:04:00.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""language packages, and their configurations.""" start="00:04:03.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But more importantly, it allows to do it""" start="00:04:07.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""in a declarative and reproducible manner.""" start="00:04:10.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""That means you just define what you need,""" start="00:04:13.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and those tools build it for you.""" start="00:04:16.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""No matter what was before, you get what you asked for.""" start="00:04:19.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It doesn't matter what time of day,""" start="00:04:24.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""what you did before, what other packages""" start="00:04:26.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you have installed previously.""" start="00:04:29.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You just ask for something, and you get it.""" start="00:04:31.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Two years ago, I did a talk at EmacsConf 2020""" start="00:04:34.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""where I demonstrated a prototype of""" start="00:04:41.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Emacs configuration managed by Nix.""" start="00:04:43.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Originally, I wanted to base my work on""" start="00:04:47.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""an already existing Emacs configuration framework.""" start="00:04:50.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But later, I decided that it will be easier""" start="00:04:56.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and a little more flexible""" start="00:05:01.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to start from ground up.""" start="00:05:02.440" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""After the first prototype in Nix,""" start="00:05:04.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I decided to switch to Guix. To make it short,""" start="00:05:06.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Guix is another functional package manager,""" start="00:05:12.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but more freedom- and reproducibility-oriented,""" start="00:05:14.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and written in only one language (Guile Scheme)""" start="00:05:21.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""instead of few custom-made Nix DSL, Bash, and C++.""" start="00:05:24.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""So now I can write Lisp code, while this code""" start="00:05:29.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""writes another Lisp code. Very neat indeed.""" start="00:05:34.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Unfortunately, at the moment, there was no tool""" start="00:05:37.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to manage user configurations,""" start="00:05:42.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""also known as dotfiles, with Guix.""" start="00:05:45.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""So I wrote one. And now it's a part of GNU Guix""" start="00:05:48.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and called Guix Home.""" start="00:05:52.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""What do we get from this one tool?""" start="00:05:54.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We can use one language to describe the whole system,""" start="00:05:58.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the home environment, the project environment,""" start="00:06:05.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and everything else.""" start="00:06:09.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We don't need to worry about""" start="00:06:10.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to keep different tools in sync""" start="00:06:13.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and to integrate them between each other.""" start="00:06:17.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Also, using one language to describe""" start="00:06:19.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the whole configuration makes it possible""" start="00:06:23.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to share values between different parts of the system.""" start="00:06:25.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""For example, color scheme, fonts, and much more.""" start="00:06:28.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""To sum up the first part of the talk:""" start="00:06:32.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I want a working environment which is ready for work,""" start="00:06:39.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""configured in minutes to almost what I want.""" start="00:06:43.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""That means it should have some batteries included.""" start="00:06:47.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It should be reliable.""" start="00:06:50.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I want to get back to work in seconds""" start="00:06:52.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""even if I broke something""" start="00:06:54.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or someone else broke something.""" start="00:06:56.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""For example, using rollbacks.""" start="00:06:58.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It would be nice if it will be performant.""" start="00:07:03.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It's a little subjective thing,""" start="00:07:07.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but it's nice when things are snappy.""" start="00:07:08.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And it's cool when things are consistent.""" start="00:07:12.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Different interfaces have""" start="00:07:16.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the same way of interactions with them.""" start="00:07:17.800" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""Let's get to the next part,""" start="00:07:20.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and let's discuss what rde is.""" start="00:07:25.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Originally it was my dotfiles repo,""" start="00:07:29.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but it grew into something bigger.""" start="00:07:33.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Now, it's a set of tools on top of""" start="00:07:35.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""GNU Guix, Guix System, and Guix Home.""" start="00:07:39.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can treat it as a GNU/Linux distribution,""" start="00:07:41.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""system and home environment manager""" start="00:07:45.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or configuration framework,""" start="00:07:48.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""project environment manager""" start="00:07:50.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""(like virtualenv, but on steroids),""" start="00:07:52.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and Emacs distribution.""" start="00:07:55.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Usually, you just pick a few features,""" start="00:07:58.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""parameterize them and ask the tool""" start="00:08:02.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to create an operating system for you,""" start="00:08:05.655" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a home environment, project environment,""" start="00:08:08.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or Emacs configuration.""" start="00:08:10.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""That's it. That's simple.""" start="00:08:11.560" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""And what rde Emacs is and how it tastes...""" start="00:08:15.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It's like an ice cream, vanilla-flavored.""" start="00:08:22.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""No fancy macros for configuration, just plain Elisp.""" start="00:08:26.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can find in almost every""" start="00:08:30.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""personal Emacs configuration,""" start="00:08:34.955" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""built-in or vanilla-flavored packages""" start="00:08:36.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""are in priority over external""" start="00:08:42.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or very fancy packages.""" start="00:08:45.589" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""There is practical reason for this.""" start="00:08:46.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Maybe sometimes you don't get the things""" start="00:08:52.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you're used to in other text editors,""" start="00:08:55.455" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or maybe even in other Emacs frameworks,""" start="00:08:57.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but we want to keep the final result consistent,""" start="00:09:01.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""so you can apply the same interaction patterns""" start="00:09:05.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""in different situations and extend your expectations""" start="00:09:08.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""from one tool to another,""" start="00:09:13.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""from one package to another.""" start="00:09:15.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""For example, we encourage people""" start="00:09:16.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to use the minibuffer completion""" start="00:09:19.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""with orderless and vertico for many tasks:""" start="00:09:22.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""code navigation, file navigation,""" start="00:09:26.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""looking through your emails,""" start="00:09:30.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or just for jumping around.""" start="00:09:32.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's see.""" start="00:09:35.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""First, create a new Emacs instance""" start="00:09:36.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and open a repository with my configuration.""" start="00:09:39.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can see the source code.""" start="00:09:45.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's open another file which contains""" start="00:09:54.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Emacs-related features.""" start="00:09:58.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can see I use imenu,""" start="00:09:59.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and I can filter the list using minibuffer.""" start="00:10:02.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Now let's open the Magit interface,""" start="00:10:08.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and now I want to navigate through""" start="00:10:16.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""this long list of things here.""" start="00:10:18.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Some of them staged. Some of them are recent commits.""" start="00:10:22.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Some of them are untracked at all.""" start="00:10:25.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can open imenu: the same interface,""" start="00:10:28.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but for now, I can navigate around""" start="00:10:31.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the Magit sections and files which are present here.""" start="00:10:34.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""If I want to navigate project files,""" start="00:10:41.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I use almost the same interface.""" start="00:10:45.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can use the same patterns to filter out""" start="00:10:47.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""files in my project or items in magit-imenu.""" start="00:10:51.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Very similar and very consistent.""" start="00:11:00.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Also, we try to have hotkeys consistent""" start="00:11:07.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""across different packages and parts of Emacs.""" start="00:11:11.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We usually don't provide alternatives on what to use.""" start="00:11:16.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We provide only one package for one task.""" start="00:11:21.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But of course this is""" start="00:11:25.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a configuration framework after all.""" start="00:11:28.155" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can declare your own features,""" start="00:11:29.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""implement them yourself,""" start="00:11:32.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and use whatever you want.""" start="00:11:35.789" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""Let's get to some real-world examples.""" start="00:11:37.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It's always easy to show""" start="00:11:45.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""how things get appended,""" start="00:11:48.222" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""how things get installed,""" start="00:11:50.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but usually people don't show""" start="00:11:51.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""how they remove things,""" start="00:11:55.289" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""because it's usually painful.""" start="00:11:56.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But in our case, it's not.""" start="00:11:58.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's take my configuration,""" start="00:12:02.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""let's find feature-emacs-vertico.""" start="00:12:10.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Vertico's just used to show""" start="00:12:12.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""this fancy completion UI""" start="00:12:19.822" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""that you can see here.""" start="00:12:25.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""If I disable this feature""" start="00:12:27.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and rebuild my home environment,""" start="00:12:30.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Emacs will lack this feature.""" start="00:12:43.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It may take some time. It was quite fast,""" start="00:12:46.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I didn't expect it.""" start="00:12:55.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I have Emacs. As you can see here,""" start="00:13:00.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""now it doesn't have this completion UI anymore.""" start="00:13:02.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I just commented it out,""" start="00:13:06.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""rebuilt my home environment,""" start="00:13:09.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and this thing disappeared from Emacs.""" start="00:13:13.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But what if I broke something?""" start="00:13:15.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I just call guix home roll-back command""" start="00:13:19.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and launch Emacs again, and you see""" start="00:13:28.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""now we have vertico back.""" start="00:13:31.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Very good.""" start="00:13:32.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Reliability is one of the most important qualities""" start="00:13:36.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""of working environment.""" start="00:13:41.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We can always get back to""" start="00:13:43.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the working state of our environment""" start="00:13:46.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and be sure that we do the things we want.""" start="00:13:48.440" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""Now let's see another example.""" start="00:13:52.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Here I have a mastodon,""" start="00:13:57.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a post which contains a gemini link.""" start="00:13:59.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can click it, and you see it opens emacsclient,""" start="00:14:03.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""it renders this gemini capsule,""" start="00:14:11.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and we can read all the posts of this guy.""" start="00:14:14.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Very cool.""" start="00:14:17.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But what if I go back to my configuration,""" start="00:14:21.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""we'll find a feature related to elpher,""" start="00:14:26.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""the application which handles gemini links,""" start="00:14:32.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""we'll comment it out,""" start="00:14:36.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and we'll rebuild my home environment.""" start="00:14:38.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""What I expect here is that""" start="00:14:41.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""when I will be clicking the link,""" start="00:14:47.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""emacsclient won't pop up anymore.""" start="00:14:48.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Cool.""" start="00:15:02.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We rebuilt it and let's click the link.""" start="00:15:02.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Now you see, it just opens another tab""" start="00:15:06.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which doesn't do anything useful.""" start="00:15:08.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Cool.""" start="00:15:10.760" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""Why it is important?""" start="00:15:14.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It is important because every time""" start="00:15:15.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you install something and you want to remove it,""" start="00:15:19.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""some parts depending on it can be broken.""" start="00:15:24.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And also important in the other way around.""" start="00:15:29.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Sometimes you want to install something,""" start="00:15:31.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and it requires a few steps.""" start="00:15:34.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""For example, if you want to have""" start="00:15:36.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a docker.el in your Emacs,""" start="00:15:40.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you need not only docker.el itself""" start="00:15:43.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and configuration for it,""" start="00:15:49.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you also need to add your user to the docker group.""" start="00:15:51.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But before it, you need to create this group,""" start="00:15:55.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and you also need to""" start="00:15:59.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""define a system service and run it.""" start="00:16:00.455" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Also you need to install docker package,""" start="00:16:02.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""docker-cli package, and containerd package.""" start="00:16:05.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can forget every of this small step,""" start="00:16:11.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but if it in your declarative configuration""" start="00:16:15.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""in one place, and you just ask""" start="00:16:20.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to enable this feature, each of those steps""" start="00:16:23.589" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""will be performed automatically.""" start="00:16:27.822" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""If you don't need docker anymore,""" start="00:16:30.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you just disable the feature,""" start="00:16:33.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and all the effect of all those steps""" start="00:16:34.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""will be removed from your system.""" start="00:16:38.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I won't be showing it because it probably will""" start="00:16:42.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""take more time for reconfiguring,""" start="00:16:46.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but you can experiment with it on your own.""" start="00:16:48.920" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""Let's do another interesting thing.""" start="00:16:54.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's construct a small""" start="00:17:00.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Emacs configuration from scratch.""" start="00:17:05.922" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Who's this?""" start="00:17:07.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I will open a file which contains only""" start="00:17:10.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""emacs-portable feature and feature-user-info.""" start="00:17:14.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Now I will build an environment,""" start="00:17:18.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and inside this environment,""" start="00:17:21.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I will launch a new Emacs instance.""" start="00:17:24.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""As you see, it's very different""" start="00:17:26.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""from what you saw previously.""" start="00:17:28.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And it's almost barebones.""" start="00:17:30.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It doesn't contain anything""" start="00:17:32.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""except user-mail-address""" start="00:17:39.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which is set to my mail address,""" start="00:17:41.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and user-full-name.""" start="00:17:45.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""How it works:""" start="00:17:46.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""In feature-user-info, I define a few values.""" start="00:17:50.760" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Those values are obtained by Emacs""" start="00:17:54.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""feature-emacs-portable""" start="00:18:01.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and set inside Emacs configuration.""" start="00:18:03.280" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""But let's enable a few more features.""" start="00:18:07.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I will do it in one go""" start="00:18:12.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""because we already saw how it works overall.""" start="00:18:15.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's build another Emacs with Emacs configuration.""" start="00:18:22.120" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""The interesting thing about this Emacs instance""" start="00:18:30.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""is that it doesn't contain anything""" start="00:18:39.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""that I have in my usual Emacs.""" start="00:18:44.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""For example, I don't have much here.""" start="00:18:46.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I don't have make installed, and so on.""" start="00:18:49.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""But we have feature-loader-portable package""" start="00:18:55.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which just requires a few configure packages.""" start="00:19:06.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's move it to a separate workspace.""" start="00:19:09.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""First of all, configure-rde-emacs-portable""" start="00:19:13.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which just sets a few variables.""" start="00:19:21.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""rde configure-keycast which just shows""" start="00:19:23.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""something on the modeline""" start="00:19:27.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which demonstrates the last hotkey pressed""" start="00:19:31.200" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and the command which was invoked.""" start="00:19:34.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We can enable which-key,""" start="00:19:40.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and now when I type a prefix,""" start="00:19:41.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can see all the possible continuations""" start="00:19:45.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""for this prefix.""" start="00:19:48.600" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I can enable vertico,""" start="00:19:49.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and you can see, now we have nice completion UI.""" start="00:19:51.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We can enable completion-related improvements""" start="00:19:58.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and now I have not only UI itself, but also""" start="00:20:03.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""some notes here near each command,""" start="00:20:07.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and ability to use regular expressions""" start="00:20:15.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""or some orderless matching.""" start="00:20:17.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""We can enable eshell,""" start="00:20:21.480" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and now I have a hotkey for invoking Emacs shell.""" start="00:20:26.400" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I don't have hotkey for vterm yet,""" start="00:20:31.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but I can enable it,""" start="00:20:35.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and now I have a terminal inside my Emacs.""" start="00:20:37.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""As you can see my usual shell is Zsh,""" start="00:20:40.800" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but here I have a plain bash.""" start="00:20:43.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's enable feature-git,""" start="00:20:46.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and now I will be able to open my project.""" start="00:20:52.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And inside this project,""" start="00:21:04.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""I will be able to open Magit""" start="00:21:11.489" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and navigate around using imenu.""" start="00:21:14.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's do few more things.""" start="00:21:19.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's enable Org Roam""" start="00:21:26.160" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""so I will be able to open my EmacsConf notes.""" start="00:21:29.640" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's enable configure-emacs.""" start="00:21:43.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""As you can see, the way it displayed updated.""" start="00:21:48.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Let's enable configure-appearance,""" start="00:21:53.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and you see the appearance of Emacs changed radically.""" start="00:21:59.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And also, let's change the faces.""" start="00:22:03.880" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And now you see almost my setup""" start="00:22:06.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""that you saw previously,""" start="00:22:13.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but we build it from small tiny pieces.""" start="00:22:14.800" video="mainVideo-rde" id="subtitle"]]
+[[!template new="1" text="""A little summary:""" start="00:22:19.000" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""rde is the one tool that you can use""" start="00:22:27.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""to manage the whole computing experience.""" start="00:22:32.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""It consists of composable components,""" start="00:22:34.440" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and actually, it provides""" start="00:22:38.080" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""a reliable configuration framework.""" start="00:22:41.720" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You always have a rollback.""" start="00:22:43.240" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You always can switch to a generation""" start="00:22:46.360" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""you used a week ago.""" start="00:22:49.320" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""And of course, it's reproducible and declarative""" start="00:22:50.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which is also very cool.""" start="00:22:57.520" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""rde Emacs is a part of rde""" start="00:22:58.680" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""but it can be used separately.""" start="00:23:05.789" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""You can think of it as an Emacs distribution""" start="00:23:06.920" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""which is vanilla-flavored, consistent,""" start="00:23:11.280" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""well-integrated, and self-contained.""" start="00:23:14.040" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""That's it for today.""" start="00:23:15.960" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Don't hesitate to contact me""" start="00:23:19.560" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""via email or any other way.""" start="00:23:22.055" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""Thank you everyone for your attention""" start="00:23:23.840" video="mainVideo-rde" id="subtitle"]]
+[[!template text="""and see you in a bit.""" start="00:23:28.155" video="mainVideo-rde" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20rde%3A%20rde%20Emacs%20introduction)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/rde-before.md b/2022/info/rde-before.md
new file mode 100644
index 00000000..c920f706
--- /dev/null
+++ b/2022/info/rde-before.md
@@ -0,0 +1,52 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Andrew Tropin will demonstrate how to use rde Emacs for reproducible configuration, including how to enable or remove features. Afterwards, he will handle questions over BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="rde">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect stroke-width="3" x="94" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 24-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-rde>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T15:00:00Z" end="2022-12-04T15:25:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~10:00 AM - 10:25 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~9:00 AM - 9:25 AM CST (US/Central)<br />Sunday, Dec 4 2022, ~8:00 AM - 8:25 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~7:00 AM - 7:25 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~3:00 PM - 3:25 PM UTC <br />Sunday, Dec 4 2022, ~4:00 PM - 4:25 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~5:00 PM - 5:25 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~8:30 PM - 8:55 PM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~11:00 PM - 11:25 PM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~12:00 AM - 12:25 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="rde-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="rde-mainVideo" data="""
+00:00.000 Introduction
+00:52.040 The challenge
+03:34.840 Functional package managers
+05:04.920 Guix Home
+07:20.360 rde
+08:15.520 Vanilla-flavoured
+11:37.440 Removing features
+13:52.520 Another example
+15:14.080 Multiple steps
+16:54.400 A small Emacs configuration
+18:07.480 Enabling features
+22:19.000 Summary
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.webm">Download --main.webm (278MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.org">Download --main.org</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/iPos3hVhMrPsnyJskzSkY9">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="rde-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="rde-qanda" data="""
+00:29.720 Do you use this to have multiple configs running side by side for live comparison?
+02:16.760 Are you using Guix System, or Guix on top of another distro? If System, any tips?
+03:25.560 One of the issues I've had managing Emacs packages with Guix is a conflict between the Guix package ethos (read-only) and the Emacs package ethos (hackable in real-time). Any suggestions to resolve this?
+05:40.800 What is next for rde?
+08:08.100 Do you use Emacs without this? If so, for what purposes, and how does it feel compared to rde?
+11:07.220 Are there any plans to push things from rde to guix's main channel?
+13:34.220 How difficult is it to add support for new Emacs packages to Guix?
+15:36.340 Do your reckon RDE is currently opinionated? Or is it a one size fits all framework?
+18:19.020 How to get into RDE? Is there already documentation/getting started guide?
+20:35.420 Can you mix RDE with custom emacs init file?
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="rde-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.webm">Download --answers.webm (42MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--answers.opus">Download --answers.opus (7.7MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/rde-nav.md b/2022/info/rde-nav.md
new file mode 100644
index 00000000..be6581c9
--- /dev/null
+++ b/2022/info/rde-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/rolodex">Build a Zettelkasten with the Hyperbole Rolodex</a>
+Next by track: <a href="/2022/talks/orgsuperlinks">Linking headings with org-super-links (poor-man's Zettelkasten)</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/realestate-after.md b/2022/info/realestate-after.md
new file mode 100644
index 00000000..be27e4fd
--- /dev/null
+++ b/2022/info/realestate-after.md
@@ -0,0 +1,593 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="realestate-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hey, I'm Gopar and this is the""" start="00:00:00.000" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Real Estate and Org Mode Table Formulas talk.""" start="00:00:05.454" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Not very creative, but it is what it is.""" start="00:00:07.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Now I just want to say that everything I talk about here""" start="00:00:09.880" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""is in the Org Mode in the Emacs manual.""" start="00:00:13.052" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I posted a link to the web version,""" start="00:00:15.903" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but it should be inside of Emacs as well.""" start="00:00:17.910" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""Now before I start, I want to showcase the end goal.""" start="00:00:20.480" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""That way you know if you guys want to""" start="00:00:25.097" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""actually see the talk or not.""" start="00:00:26.807" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So I always think that's pretty cool to see""" start="00:00:28.740" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""what you're actually going to build""" start="00:00:30.492" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""before you start building it.""" start="00:00:31.518" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Alright. So let me start off with the goal,""" start="00:00:32.680" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the end goal. Here we have a simple table formula""" start="00:00:34.286" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and we have some constants, some values inside the list--""" start="00:00:38.763" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""inside the table, I'm sorry,""" start="00:00:42.614" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and some other stuff that we will get to,""" start="00:00:44.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but for now... I don't want to spoil too much.""" start="00:00:47.673" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I just want to give you a demo""" start="00:00:49.280" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""of how it actually works.""" start="00:00:50.328" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""We have a few values. Let me first go over the constants.""" start="00:00:51.800" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We have PMI, which stands for""" start="00:00:56.095" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""private mortgage insurance,""" start="00:00:57.582" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so it's insurance that you'll have to pay""" start="00:00:57.591" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""depending on how much money you put into the deal.""" start="00:01:00.537" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The property tax, which is self-explanatory,""" start="00:01:03.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the tax that you owe for owning the property,""" start="00:01:06.068" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then home insurance,""" start="00:01:09.317" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and the interest rate at the loan that you get.""" start="00:01:11.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, here we have a few columns.""" start="00:01:13.440" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The first one is called House,""" start="00:01:15.667" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which I usually just put a description of the house""" start="00:01:17.412" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""with the link of the posting,""" start="00:01:20.624" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the price of the house,""" start="00:01:21.127" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the percentage down payment (this I play around with""" start="00:01:22.494" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to see how much the deal will be structured),""" start="00:01:26.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the down payment (which is calculated from""" start="00:01:27.474" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the previous two columns),""" start="00:01:30.529" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the monthly mortgage (which is calculated as well),""" start="00:01:31.755" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then the tenant income (which is what I suppose""" start="00:01:34.145" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""would be an example of the tenant income""" start="00:01:37.996" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that I can potentially make off the property,""" start="00:01:41.006" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the 1% rule and the ROI.""" start="00:01:42.753" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I'll quickly go over the last two columns.""" start="00:01:45.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So first is the 1% rule.""" start="00:01:47.708" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The 1% rule is essentially""" start="00:01:49.300" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a &quot;rule,&quot; in quotes, that says that""" start="00:01:50.880" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""if a property matches this specific formula,""" start="00:01:53.589" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it is a good deal to look into.""" start="00:01:56.278" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So for example, the first two pass,""" start="00:01:58.320" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and the last one does not pass.""" start="00:02:00.890" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The last one, at a quick glance,""" start="00:02:02.677" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we can just ignore it and say,""" start="00:02:04.105" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;hey, that's not going to fly,&quot;""" start="00:02:05.472" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we'll just ignore it.""" start="00:02:06.477" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I won't go too much into details.""" start="00:02:08.000" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""That's just a brief summary.""" start="00:02:09.891" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So now the ROI is the return on investment.""" start="00:02:11.520" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So it says &quot;how much of a return am I getting""" start="00:02:14.149" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""on the amount that I invested?&quot;""" start="00:02:17.600" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's say you put in $12,000,""" start="00:02:18.960" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and at the end of the year, you cashflow $6,000.""" start="00:02:21.168" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So if you calculate the ROI off of that,""" start="00:02:23.456" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you get a 50% return on investment.""" start="00:02:26.127" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""In two years, you'll make your money back,""" start="00:02:28.477" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is pretty good.""" start="00:02:30.086" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Then all the rest of the years,""" start="00:02:31.734" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you'll just slowly be reaping in all that,""" start="00:02:32.719" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""all the excess cash flow.""" start="00:02:34.348" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""But yeah, that's it in a nutshell.""" start="00:02:36.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So let me demo it real quick.""" start="00:02:40.040" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So for example, I'm going to change the down payment,""" start="00:02:42.270" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but I want you to pay attention""" start="00:02:44.259" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to this column [down payment]""" start="00:02:45.745" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and the monthly mortgage column.""" start="00:02:48.214" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So right here [down payment] is $25,000,""" start="00:02:49.840" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and here [monthly mortgage] is around $1,200,""" start="00:02:51.727" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a little under $1,300.""" start="00:02:53.473" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So what happens if I say, you know,""" start="00:02:55.180" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""what I'm going to change the down payment""" start="00:02:57.350" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to 5% instead, because I just""" start="00:02:58.796" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""don't want to put 10.""" start="00:03:00.949" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's just put say 5.""" start="00:03:02.560" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Then I tab out of here, and voila -""" start="00:03:04.126" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you see it updated to half of $25,000.""" start="00:03:06.275" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So now it's $12,000,""" start="00:03:08.523" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and this [monthly mortgage] went up""" start="00:03:09.947" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""over actually $1,300,""" start="00:03:10.690" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then this [1% rule] hasn't changed at all""" start="00:03:12.234" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and the ROI is there.""" start="00:03:14.784" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So one thing that I should mention is""" start="00:03:17.680" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""everything that I'm putting here""" start="00:03:19.148" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""is just example numbers,""" start="00:03:20.194" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""should not be taken into literal real estate advice.""" start="00:03:21.280" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I just want to put that out there.""" start="00:03:25.635" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""These are just examples to show you""" start="00:03:26.860" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""how you can potentially make it on your own,""" start="00:03:28.368" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""do the formulas on your own.""" start="00:03:30.520" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""Alright, so another cool thing that I did was""" start="00:03:32.240" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""if there is no tenant income and I tab,""" start="00:03:35.651" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it says &quot;Enter Tenant Income&quot;.""" start="00:03:37.738" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So if I don't put anything,""" start="00:03:40.049" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it will automatically tell me, hey,""" start="00:03:41.033" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I can't calculate without the tenant income.""" start="00:03:42.400" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I can also do this right here [ROI field],""" start="00:03:44.920" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""say the same thing, Enter Tenant Income,""" start="00:03:46.608" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but I just didn't put it for whatever reason, but""" start="00:03:48.476" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""after this video, you should be easily able to""" start="00:03:50.564" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""put it without much struggle.""" start="00:03:53.813" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Alright, so if that's something you're interested in,""" start="00:03:57.400" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""then keep watching.""" start="00:04:00.131" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So let's go over the basics first.""" start="00:04:02.240" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, how do we create a table?""" start="00:04:05.240" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, we can do M-x org-table-create.""" start="00:04:07.400" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If we run that it, will prompt us in a minibuffer.""" start="00:04:10.369" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It says table size, columns times row.""" start="00:04:14.302" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Usually it's rows times columns,""" start="00:04:16.893" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but it is what it is.""" start="00:04:18.178" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's just leave""" start="00:04:19.602" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the default of 5 times 2, and voila, we get this.""" start="00:04:20.466" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Beautiful. Awesome.""" start="00:04:24.960" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So the other way is using the magical C-c C-c""" start="00:04:26.400" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""in Org Mode, which basically is context-aware""" start="00:04:29.511" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and does anything, does the right thing like,""" start="00:04:32.402" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""almost 100% of the time, which is pretty amazing.""" start="00:04:36.054" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Alright, let's just say I write a pipe, some words,""" start="00:04:38.600" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then another pipe, Gopar, and then""" start="00:04:42.432" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""another pipe. Let's just say we're trying to""" start="00:04:44.680" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""write it out via text, because in Org mode""" start="00:04:47.269" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""everything has text.""" start="00:04:50.600" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There's nothing fancy about it.""" start="00:04:51.547" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If I do C-c C-c, Org mode should automatically be""" start="00:04:53.380" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""context-aware that this area is a table.""" start="00:04:57.673" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, C-c C-c, boom. So if I press enter, another column.""" start="00:04:59.840" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If I press tab, it should automatically move me.""" start="00:05:04.295" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So yeah, so that's pretty much it.""" start="00:05:06.964" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""That's how you get started into the column.""" start="00:05:09.392" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, I'm assuming most of the people here already know that.""" start="00:05:11.920" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This is just the primary basic review.""" start="00:05:15.592" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So, let's first go...""" start="00:05:17.960" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's go dive right into our first formula.""" start="00:05:19.808" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So I copied some values over here,""" start="00:05:22.820" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just to save time, and the columns.""" start="00:05:24.767" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, let's go ahead and say that""" start="00:05:27.697" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we have single family house,""" start="00:05:29.164" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and the price is a hundred thousand.""" start="00:05:30.750" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And, Let's say that I want the price,""" start="00:05:33.019" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the down payment that I want to put is 10%.""" start="00:05:34.164" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Right. Alright. 10%. Now if I tab""" start="00:05:36.432" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or go to the next column, nothing happens.""" start="00:05:40.528" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Why is that? Well, it's because""" start="00:05:42.394" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""(you probably guessed it)""" start="00:05:43.880" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we haven't written or tied any table formulas.""" start="00:05:44.985" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So we're saying, alright, enough talk.""" start="00:05:47.756" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""How do we do that?""" start="00:05:49.564" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, the answer is very simple.""" start="00:05:50.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We do a pound sign (#), if I can find it.""" start="00:05:52.094" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""\#+ and then we do TBL for table""" start="00:05:54.984" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then FM for formula.""" start="00:05:58.713" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, table formula, and the column.""" start="00:06:01.120" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So this, you're already halfway""" start="00:06:03.429" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to writing your first table formula.""" start="00:06:04.935" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's say we want to automatically,""" start="00:06:07.064" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's just, for exercise,""" start="00:06:09.172" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we want to put the down payment,""" start="00:06:10.979" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just put some type of value in there,""" start="00:06:13.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just to make sure that it's working.""" start="00:06:14.616" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So the way Org Mode refers to columns is,""" start="00:06:16.383" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we start with the dollar sign ($) and then""" start="00:06:20.993" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we put the number that the column is.""" start="00:06:24.141" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Indexes start with one, not a zero.""" start="00:06:26.869" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""As most of us watching are programmers,""" start="00:06:29.114" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we're probably used to starting with zero,""" start="00:06:31.624" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but it starts with one.""" start="00:06:33.793" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So one, two, three, four, five.""" start="00:06:34.960" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So down payment is the fifth column,""" start="00:06:38.331" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we say five, and then we say equal to,""" start="00:06:39.655" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""let's say Gopar.""" start="00:06:42.304" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Then we do C-c C-c to evaluate it,""" start="00:06:44.289" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and the table is automatically updated.""" start="00:06:47.938" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Look at that.""" start="00:06:50.546" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So when you do just this, dollar sign ($) 5,""" start="00:06:50.957" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it updates every single column.""" start="00:06:55.863" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There is a way to specify that this cell only and""" start="00:06:57.806" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""this cell only but this is out of scope and it's""" start="00:07:00.680" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""not that hard it's just not in this video.""" start="00:07:03.324" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I would recommend, I commend you, or, actually""" start="00:07:05.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I recommend that you go check out the manual for that.""" start="00:07:08.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""All right so, let's say we want to do some basic""" start="00:07:13.000" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""arithmetic we want to do some list values""" start="00:07:17.724" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""instead of just putting in text.""" start="00:07:19.324" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So how do we do that?""" start="00:07:20.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, we have to pull the expression that we want""" start="00:07:21.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to put in.""" start="00:07:24.557" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, for example, if we want to add we'll do 20 plus""" start="00:07:25.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""20 and if we do C-c C-C to evaluate it, it should""" start="00:07:27.959" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""update every single column, the entire column,""" start="00:07:31.457" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the fifth column I mean and, tada, it does.""" start="00:07:34.324" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Cool! So now let's say we want to do a little bit""" start="00:07:38.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""more advanced.""" start="00:07:41.899" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's say we want to add the previous column to""" start="00:07:42.656" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""this column, so how do we refer to this one?""" start="00:07:45.007" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, 1-2-3-4 is the fourth column, so we would""" start="00:07:47.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just simply do $4 and this should automatically""" start="00:07:50.990" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""be referring to this column (% DP).""" start="00:07:55.931" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So we'll do 10 + 20, it's going to be 30 over here,""" start="00:07:58.157" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and let's do C-C C-c.""" start="00:08:02.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Ooh, error, what happened?""" start="00:08:04.274" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Oh my god, oh my god.""" start="00:08:07.124" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, this seems scary but no worries.""" start="00:08:08.974" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""This is where debugging comes in pretty handy,""" start="00:08:11.720" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is actually our next section as you can see.""" start="00:08:14.078" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, what happens if we do, if we go into the""" start="00:08:16.940" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""debugging section, what is the first step?""" start="00:08:19.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, the first step is to try out, is to enable""" start="00:08:21.440" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""formula debugger.""" start="00:08:24.890" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, if you do C-c {, it will turn on a minor mode""" start="00:08:26.516" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that whenever you evaluate a table formula,""" start="00:08:31.394" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the debugger will be enabled,""" start="00:08:35.510" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""will automatically kick in.""" start="00:08:38.291" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And if you want to disable the debugger,""" start="00:08:39.457" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you just run the command again, and it will turn off.""" start="00:08:41.074" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, let's go ahead and run it. C-c {.""" start="00:08:43.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""As you can see in the mini buffer, it says,""" start="00:08:46.608" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;formula debugging has been turned on&quot;. Awesome!""" start="00:08:48.791" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So if we go back to our table""" start="00:08:51.541" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and we try to run this, and see what's going on, we see...""" start="00:08:53.158" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Oh, first off, before we look""" start="00:08:58.500" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""at the buffer that just opened,""" start="00:09:00.441" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""look at the mini buffer,""" start="00:09:01.391" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it says &quot;Debugging Formula. Continue to next?&quot;""" start="00:09:02.491" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So if you have multiple or a series of formulas,""" start="00:09:05.074" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it will say, &quot;hey, do you want to debug this one""" start="00:09:07.974" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or the next one?&quot;""" start="00:09:09.691" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So this is just saying, &quot;hey, do you want to go""" start="00:09:10.474" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""into the next formula?&quot;""" start="00:09:12.058" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And since there's no next formula,""" start="00:09:13.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""debugger will just exit out""" start="00:09:14.991" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and leave you with the other buffer to see.""" start="00:09:16.058" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""For now, we'll just click no.""" start="00:09:18.299" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Right now, it doesn't matter if you click yes or no""" start="00:09:20.049" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because there's only one formula,""" start="00:09:22.591" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but we'll just click no, and let's go ahead and""" start="00:09:23.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""pay attention to the new buffer.""" start="00:09:26.172" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, over here it might seem a little confusing,""" start="00:09:27.757" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but don't worry, we're just going to ignore most of this.""" start="00:09:29.808" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The first thing that we're going to pay""" start="00:09:32.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""attention is to the original.""" start="00:09:33.990" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So it says, okay, this is the original, so we have""" start="00:09:35.557" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a quote expression, which is just trying to add the""" start="00:09:38.167" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""fourth column.""" start="00:09:41.324" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And if we go over here""" start="00:09:41.840" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""once everything is finalized,""" start="00:09:42.841" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it says &quot;hey, we're trying to add this 10,""" start="00:09:44.208" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but it's actually a string 10, and added to 20.""" start="00:09:47.207" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So of course it's going to be an error, so now we""" start="00:09:50.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""know what the error is.""" start="00:09:52.425" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So you're saying all right cool, awesome, now how""" start="00:09:54.099" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""do we transform that string into a number?""" start="00:09:56.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, Org Mode formulas have these flags""" start="00:09:58.940" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that you can use, and essentially a flag looks like this.""" start="00:10:02.608" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It's a semicolon (;) followed by some letter""" start="00:10:05.774" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or some identifier""" start="00:10:10.258" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that will let Org mode know that hey,""" start="00:10:13.370" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""this should be turned into a number""" start="00:10:16.590" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or this should be turned into whatever.""" start="00:10:18.291" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There's different ones for alpha literal""" start="00:10:20.307" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and for a bunch of...""" start="00:10:22.725" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I think there's even &quot;i&quot; for &quot;integer&quot;,""" start="00:10:23.963" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so it depends what you want.""" start="00:10:25.474" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So for now we're just going to put &quot;number&quot;""" start="00:10:26.919" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because it's a real number.""" start="00:10:28.203" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If we do this and the debugger is still on,""" start="00:10:29.590" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""(remember because it automatically""" start="00:10:33.707" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""stays on until we turn it off),""" start="00:10:35.374" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""if we reevaluate the the formula,""" start="00:10:36.474" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we should be able to see it.""" start="00:10:41.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""But first, before I do that, let's check step two.""" start="00:10:43.724" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I'll now rerun formulas with C-c * and table,""" start="00:10:47.479" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which calls org-table-recalculate.""" start="00:10:52.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""To do this, you actually have to be inside the table.""" start="00:10:54.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Otherwise, Org mode will try to do some other stuff""" start="00:10:58.607" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because it is context-aware, so depending on""" start="00:11:02.454" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the context it might do something else.""" start="00:11:04.425" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So if we do C-c *...""" start="00:11:06.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""As you can see the debugger has kicked in,""" start="00:11:09.224" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""says, &quot;Do you want to continue to next?&quot;""" start="00:11:12.824" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's press yes (y), and it has been applied.""" start="00:11:14.202" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So as you can see, it only updated one column--""" start="00:11:17.680" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I'm sorry, one row--and the thing is,""" start="00:11:21.071" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""when you run this, the recalculate, it will only""" start="00:11:23.077" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""run for the current row that you're in.""" start="00:11:28.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If you want to run for the entire table,""" start="00:11:30.461" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you're going to do C-u C-c *.""" start="00:11:32.885" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Before I do that, let me turn off the debugger""" start="00:11:36.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""since we no longer are in need of it.""" start="00:11:38.507" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So C-c {, and debugging has been turned off.""" start="00:11:40.907" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Now let me do C-u C-c * and as you can see""" start="00:11:45.077" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the other rows also calculated, updated as well.""" start="00:11:50.808" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Beautiful!""" start="00:11:54.420" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So as I mentioned, feel free to look / browse the""" start="00:11:55.024" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""documentation for more flags""" start="00:11:58.607" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because each flag has its own special meaning""" start="00:12:00.108" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and will do different things, which is pretty cool.""" start="00:12:02.641" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""All right, cool.""" start="00:12:07.140" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We're done with debugging and we fixed it.""" start="00:12:08.224" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So there, now we know how to create formulas""" start="00:12:10.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and how to debug them whenever they break,""" start="00:12:12.076" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is awesome.""" start="00:12:14.307" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""All right, but remember how I said that you can""" start="00:12:15.140" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""only debug... Whenever you run recalculate,""" start="00:12:18.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It will only run the first formula?""" start="00:12:23.660" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, let's say you want to have multiple formulas?""" start="00:12:25.440" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This is completely valid, except the bad thing is""" start="00:12:28.539" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that you have to do C-c C-c C-c on each each one,""" start="00:12:30.907" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because C-u C-c * won't recalculate everything.""" start="00:12:34.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It won't.""" start="00:12:39.557" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Sadly, it doesn't do it.""" start="00:12:40.450" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There is a way that you can do it,""" start="00:12:41.657" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is hacking together some elisp.""" start="00:12:44.289" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""You can probably find it""" start="00:12:46.460" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or you can probably make it yourself""" start="00:12:47.475" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""if you look around, but that's out of scope for this.""" start="00:12:48.807" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So now, how do we... We can write all the formulas""" start="00:12:51.207" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we want in one single line.""" start="00:12:57.100" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There's a way to to distinguish""" start="00:12:59.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""when one ends and one begins""" start="00:13:01.741" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and that is the double colon (::).""" start="00:13:03.341" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So right there, and a new formula will begin.""" start="00:13:04.807" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So for example,""" start="00:13:07.707" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""let's say for the seventh column we say &quot;gopar&quot;.""" start="00:13:08.474" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If I do C-c C-c, it'll run every single thing""" start="00:13:12.324" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so that... &quot;gopar&quot;. Tada!""" start="00:13:17.507" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There, awesome.""" start="00:13:19.326" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""But this is going to get very annoying if you're""" start="00:13:20.724" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""simply trying to edit formulas like this, right?""" start="00:13:22.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So that's where the nicer debugging,""" start="00:13:25.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""nicer editing section comes in.""" start="00:13:27.033" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, yes, just like as mentioned, table calls""" start="00:13:28.890" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""only the first formula.""" start="00:13:32.300" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So what's the step onto this nicer editing section?""" start="00:13:33.607" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Try out &quot;C-c ,&quot; or `org-edit-special`.""" start="00:13:36.449" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's go back to the table formula and call it...""" start="00:13:40.524" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""oh my god, look at that,""" start="00:13:44.657" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a new buffer just for editing,""" start="00:13:47.690" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and each formula is in its own line to make""" start="00:13:49.990" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it easier, which is beautiful!""" start="00:13:52.699" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, let's just say I want to do another calculation.""" start="00:13:54.724" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's do eight times eight, which should be 64,""" start="00:13:58.815" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and we have no need of putting this flag""" start="00:14:02.707" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because the flag only affects it on the input coming in.""" start="00:14:04.741" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I should have mentioned that earlier.""" start="00:14:07.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Only input coming in.""" start="00:14:09.174" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There is ways to affect the output,""" start="00:14:10.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which we'll also cover in this topic later on,""" start="00:14:13.274" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but for now, you can either leave the end flag""" start="00:14:16.574" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or leave it out. It will still work fine.""" start="00:14:19.231" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's just leave it out for now.""" start="00:14:21.991" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's just do C-c C-c to make sure""" start="00:14:23.508" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that everything is working. 64. Beautiful.""" start="00:14:26.625" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So there you have it. You can have multiple formulas""" start="00:14:30.790" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just stacked up into one line,""" start="00:14:33.166" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and whenever you need to edit it,""" start="00:14:34.878" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just go into that into that line""" start="00:14:36.391" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and &quot;C-c ,&quot;, and tada!""" start="00:14:38.357" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""You have this ready, good to go, and for editing.""" start="00:14:41.124" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Oh and if you want to exit out,""" start="00:14:44.450" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""also just do &quot;C-c ,&quot; again and you're back.""" start="00:14:45.825" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I did not mention that. Sweet!""" start="00:14:49.040" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So now we know how to have""" start="00:14:51.990" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a better editing experience. Sweet!""" start="00:14:54.775" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So now comes the formatting section which I talked about.""" start="00:14:57.106" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So what's the first step?""" start="00:15:00.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well for formatting, Org mode uses""" start="00:15:01.974" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the printf function from C.""" start="00:15:05.508" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So those who are familiar with C,""" start="00:15:08.674" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you'll feel right at home because the way you format it""" start="00:15:10.375" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""is exactly the same way.""" start="00:15:12.923" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So for example, this will print off""" start="00:15:14.040" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a floating number with two decimal points.""" start="00:15:16.558" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""As you can see here, this is how you will use it.""" start="00:15:18.973" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It will be after the semicolon and it will be &quot;%.2f&quot;.""" start="00:15:21.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's go ahead and test that out.""" start="00:15:26.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Actually, let's go ahead to our latest function--""" start="00:15:28.158" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I mean, to our latest formula.""" start="00:15:30.690" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's go ahead to the nicer buffer""" start="00:15:32.440" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and let's do, Ctrl... Let's enter the semicolon,""" start="00:15:33.841" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then let's put the percent sign, we do 2f.""" start="00:15:39.208" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Actually, let's make it five""" start="00:15:45.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just to differentiate from the formula, and let's see.""" start="00:15:49.175" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let's run it, and tada!""" start="00:15:52.690" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So yeah, as you can see, five decimal points.""" start="00:15:57.274" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and if we want zero decimal points, we can also""" start="00:16:00.180" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just move point zero, and tada!""" start="00:16:01.957" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Just like that.""" start="00:16:05.057" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We can also just leave it as is how it was before,""" start="00:16:06.224" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because before, we didn't even actually need it,""" start="00:16:08.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but yeah, just an example.""" start="00:16:10.875" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And just a reminder, there are""" start="00:16:13.114" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""plenty more ways of formatting,""" start="00:16:15.091" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""just look at the documentation.""" start="00:16:17.358" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There will be more. Basically every single thing""" start="00:16:19.740" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that you need, just use the documentation as reference.""" start="00:16:21.725" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Cool! So now we know how to debug,""" start="00:16:25.674" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""how to write formulas""" start="00:16:28.341" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and how to get a better, nicer editing buffer""" start="00:16:29.775" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""for the formula so we don't have to do it all""" start="00:16:32.825" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""in a single line.""" start="00:16:35.125" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So, what about conditional prompts, like I was""" start="00:16:36.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""showing in the first table in the end goal?""" start="00:16:38.757" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well that's actually pretty simple because we already""" start="00:16:43.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""know how to do this.""" start="00:16:47.300" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Yes, if you think about it for a second, if we are""" start="00:16:48.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""able to pull lisp s-expressions, then we are able to""" start="00:16:51.233" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""basically do it already. Here's an example.""" start="00:16:54.321" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We're saying if the second column is empty, is zero--""" start="00:16:56.390" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so actually, this should be with the N flag""" start="00:17:01.907" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because we will transform empty values as zero,""" start="00:17:04.620" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and that's how Org mode will read those.""" start="00:17:07.040" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It's saying if the second flag is zero,""" start="00:17:08.820" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""then I want you to put &quot;Enter the values.&quot;""" start="00:17:12.425" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And if it's not empty, we're going to put""" start="00:17:17.052" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;Values entered.&quot; We're going to recognize.""" start="00:17:20.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's go ahead and actually do this.""" start="00:17:22.290" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's grab this, and let's type it in.""" start="00:17:24.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's go ahead. &quot;Enter the values,&quot; because it""" start="00:17:29.090" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""doesn't have any.""" start="00:17:36.557" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's go ahead and say &quot;Hello EmacsConf&quot;""" start="00:17:37.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and let's go ahead and run it again.""" start="00:17:42.441" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Since there are values,""" start="00:17:47.324" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it's going to overwrite what's here and put value entered.""" start="00:17:48.458" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's go ahead.""" start="00:17:51.674" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Tada, so there you go.""" start="00:17:53.498" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So that is pretty much how you do conditional props,""" start="00:17:55.790" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is pretty straightforward""" start="00:18:00.624" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""once you think about it""" start="00:18:01.941" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because if you are able to insert Lisp expressions,""" start="00:18:02.725" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""then you are able to just do that check""" start="00:18:05.441" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and do the conditional check yourself.""" start="00:18:08.241" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, custom formulas.""" start="00:18:11.174" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""Yeah, you'll see what I mean.""" start="00:18:13.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We want to be able to put our own custom functions,""" start="00:18:15.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and you probably have an idea how to do this already.""" start="00:18:20.024" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Yes, we also know how to do this already.""" start="00:18:23.990" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Before I continue, I'm going to say that I already""" start="00:18:27.060" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""have some formulas that I use""" start="00:18:30.457" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which are not part of this talk""" start="00:18:31.941" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because they're just functions that calculate some stuff.""" start="00:18:33.375" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So for example, they calculate the monthly mortgage,""" start="00:18:37.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the monthly PMI, property tax, homeowners insurance,""" start="00:18:40.090" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so a bunch of other stuff.""" start="00:18:43.357" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I have these functions already and they are a bit off,""" start="00:18:44.857" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but for this example, they're doing everything.""" start="00:18:49.829" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""It's close enough, so don't worry too much.""" start="00:18:52.312" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Just an example, you can have your own function""" start="00:18:54.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""that does something else like calculate""" start="00:18:56.924" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a REI B rental or something like that.""" start="00:18:59.313" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So you can do whatever you want.""" start="00:19:01.640" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""As long as you can call via Lisp,""" start="00:19:03.220" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""you can call it in Org mode, in the table formulas.""" start="00:19:04.824" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's exit out of there.""" start="00:19:07.900" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Now that we know how to do everything,""" start="00:19:11.437" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""let me go back to the original table and go from there.""" start="00:19:13.808" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Let me close all these out actually.""" start="00:19:21.024" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Now let's go back and revisit this table,""" start="00:19:26.624" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""since we'll be much, much more familiar""" start="00:19:29.624" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""except for one thing, which I will explain.""" start="00:19:31.620" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So we have the constants right there""" start="00:19:35.518" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and we have the house prices""" start="00:19:38.041" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and we have everything just like I mentioned before.""" start="00:19:39.691" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The main part that we want to look at""" start="00:19:42.500" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""is the table formula.""" start="00:19:44.123" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So let's open up our special editing buffer,""" start="00:19:45.124" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;C-c ,&quot;,""" start="00:19:47.574" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and as you can see, I have some right here.""" start="00:19:49.774" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, the fifth column I'm saying,""" start="00:19:52.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;Hey, we're gonna call this function""" start="00:19:53.624" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""rei-calculate-down-payment, and I'm gonna""" start="00:19:55.924" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""pass in the third column and fourth column""" start="00:19:58.657" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and I'm going to pass in t.&quot; (true)""" start="00:20:00.758" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I believe this is just to normalize,""" start="00:20:02.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to convert to the proper decimal place,""" start="00:20:07.174" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so let's not worry too much about that.""" start="00:20:12.157" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Then for the sixth column, we're going to say""" start="00:20:14.179" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;I calculate the monthly mortgage.&quot;""" start="00:20:16.790" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We're going to pass in the third column""" start="00:20:18.145" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""the INTEREST_RATE, which we have""" start="00:20:20.224" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""defined over here in the constants.""" start="00:20:21.439" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The 30, I believe this is for 30 years,""" start="00:20:22.980" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""PMI, the PROPERTY_TAX and HOME_INSURANCE,""" start="00:20:26.374" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then the fourth column.""" start="00:20:29.423" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Then everything is going to be accepted as numbers,""" start="00:20:30.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and we're going to have two decimals""" start="00:20:33.924" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""at the end of the place.""" start="00:20:35.174" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, what else?""" start="00:20:36.274" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Over here is where we have our conditionals.""" start="00:20:37.607" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We're saying, &quot;hey, if the seventh column is 0,""" start="00:20:40.174" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""press 'Enter Tenant Income'.&quot;""" start="00:20:42.374" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Over here as well, if the seventh column is zero,""" start="00:20:44.402" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""we're going to press 'Enter Tenant Income'""" start="00:20:48.507" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and for this one we're going to say,""" start="00:20:51.824" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""&quot;Hey, we're going to normalize the price.&quot;""" start="00:20:53.705" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I believe this is a 1% rule.""" start="00:20:56.040" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This could have been extracted into a function,""" start="00:20:59.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but I just did the calculation right here.""" start="00:21:01.490" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This, I believe, is the ROI, 12 months.""" start="00:21:04.239" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This is just calculating the cash flow.""" start="00:21:07.990" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This is a very rudimentary function or formula.""" start="00:21:11.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Do not use this because there is way more""" start="00:21:15.407" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to go into calculating the cash flow""" start="00:21:16.733" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and also, it differs from person to person.""" start="00:21:18.841" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Some people are more conservative,""" start="00:21:21.599" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""other people are way more liberal, so it just""" start="00:21:23.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""depends how you want to calculate it.""" start="00:21:26.960" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""As you can see, we have the N flag for numeric number""" start="00:21:28.974" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and then we're saying we're formatting""" start="00:21:34.241" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to one decimal place.""" start="00:21:36.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""The %% sign is just to input a percent sign as itself.""" start="00:21:37.794" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Otherwise, Org mode is going to think""" start="00:21:43.208" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it's some type of a formatter, which it's not.""" start="00:21:45.420" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""If you do... As I mentioned,""" start="00:21:48.040" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""if you've used the printf function in C or C++,""" start="00:21:49.240" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""then you probably know how to use it.""" start="00:21:51.790" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Okay, so this is pretty much everything in a nutshell.""" start="00:21:55.607" video="mainVideo-realestate" id="subtitle"]]
+[[!template new="1" text="""So, one thing that I do want to say""" start="00:22:01.924" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""is the last section,""" start="00:22:05.070" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is automatically updating,""" start="00:22:06.479" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is the part that blew my mind""" start="00:22:07.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""when I realized that Org Mode can do this.""" start="00:22:10.175" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So how do we do it?""" start="00:22:11.557" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Well, you probably guessed just from looking at""" start="00:22:12.577" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""at the first table that we have right now.""" start="00:22:14.660" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We add a column at the beginning""" start="00:22:18.424" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""of the table with a percent (%)--""" start="00:22:20.874" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I'm sorry, with the pound sign (#)""" start="00:22:22.957" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""or hashtag as the younger kids call it.""" start="00:22:24.957" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So this is what we do.""" start="00:22:28.557" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""We added a column at the beginning of the""" start="00:22:31.145" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""table, we do pound sign (#).""" start="00:22:32.820" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So this is what it's for.""" start="00:22:35.084" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""This lets Org mode know that &quot;hey,""" start="00:22:35.890" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I want the values, the table formulas,""" start="00:22:38.840" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""to automatically run on each tab change.&quot;""" start="00:22:41.240" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Now I believe that you can make it so that""" start="00:22:44.057" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""it changes, so that it updates on every keystroke.""" start="00:22:46.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I think that's too much.""" start="00:22:49.223" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""And then you can also make it so that""" start="00:22:51.124" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""only certain rows update or certain columns.""" start="00:22:53.107" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""There's a plethora of things that you can do.""" start="00:22:56.020" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""You should definitely read up on the documentation,""" start="00:22:58.319" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""because you will probably make a way better talk,""" start="00:23:01.024" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a way more advanced talk than I on this one,""" start="00:23:03.525" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""so I'm looking forward for that.""" start="00:23:07.074" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""But this is essentially how you build""" start="00:23:09.674" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""a Org mode table formula that will help you know""" start="00:23:12.460" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""if a property is correct.""" start="00:23:15.508" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So, let's go ahead and as a final out to this demo,""" start="00:23:17.225" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""let's go ahead and enter a new column.""" start="00:23:22.440" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Org-mode automatically puts the pound sign (#),""" start="00:23:25.420" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""which is awesome, and let's just say 'Emacs House',""" start="00:23:30.274" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and let's say it is 100k.""" start="00:23:35.540" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So 100k, and as you can see it's already trying to""" start="00:23:39.690" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""calculate the monthly mortgage,""" start="00:23:44.340" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""but we'll see about that,""" start="00:23:46.140" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and let's just put 10% down.""" start="00:23:47.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So 10% of 100k should be 10,000.""" start="00:23:49.880" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So 10,000, correct, and the monthly mortgage is that""" start="00:23:53.157" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""and let's just say the tenant income is,""" start="00:23:56.408" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""as you can see right here,""" start="00:24:00.190" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""tenant income is, let's say 1500.""" start="00:24:01.757" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Is it passing the 1% rule?""" start="00:24:05.974" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""Yep! What's my ROI?""" start="00:24:07.374" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""118%, which is kind of cool actually.""" start="00:24:09.524" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""That's a nice deal.""" start="00:24:13.880" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""So this is a rudimentary way of""" start="00:24:14.907" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""calculating deals in Org mode.""" start="00:24:17.757" video="mainVideo-realestate" id="subtitle"]]
+[[!template text="""I hope you found it interesting, and yeah, that is it.""" start="00:24:20.419" video="mainVideo-realestate" id="subtitle"]]
+
+
+
+Captioner: tom
+
+Questions or comments? Please e-mail [gopardaniel@gmail.com](mailto:gopardaniel@gmail.com?subject=Comment%20for%20EmacsConf%202022%20realestate%3A%20Real%20estate%20and%20Org%20table%20formulas)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/realestate-before.md b/2022/info/realestate-before.md
new file mode 100644
index 00000000..58b26d1d
--- /dev/null
+++ b/2022/info/realestate-before.md
@@ -0,0 +1,40 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Daniel Gopar shares how he uses Org tables as spreadsheets to help him decide on real estate investments. Afterwards, he will handle questions via the Etherpad.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="realestate">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect stroke-width="3" x="494" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 25-min talk followed by pad Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen">#emacsconf-gen</a>)
+Etherpad: <https://pad.emacsconf.org/2022-realestate>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: Q&A finished, IRC and pad will be archived on this page
+
+
+
+
+<div class="vid"><video controls preload="none" id="realestate-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="realestate-mainVideo" data="""
+00:00.000 Introduction
+00:20.480 The end goal
+00:51.800 Constants and variables
+02:11.520 ROI
+02:40.040 Demo
+03:32.240 Detecting input
+04:02.240 Creating a table
+04:26.400 C-c C-c
+05:17.960 Our first formula
+07:13.000 Basic arithmetic
+08:11.720 Debugging
+09:53.600 Flags
+12:07.040 Recalculating
+12:50.040 Multiple formulas
+14:56.777 Formatting
+16:36.202 Conditional prompts
+18:12.203 Custom formulas
+21:57.857 Automatically updating
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.webm">Download --main.webm (52MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-realestate--real-estate-and-org-table-formulas--daniel-gopar--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/wNqs2ukhcQwCzUkar2bq55">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/realestate-nav.md b/2022/info/realestate-nav.md
new file mode 100644
index 00000000..936d9d38
--- /dev/null
+++ b/2022/info/realestate-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/mail">Revisiting the anatomy of Emacs mail user agents</a>
+Next by track: <a href="/2022/talks/maint">Maintaining the Maintainers: Attribution as an Economic Model for Open Source</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/rms-after.md b/2022/info/rms-after.md
new file mode 100644
index 00000000..455bdfbc
--- /dev/null
+++ b/2022/info/rms-after.md
@@ -0,0 +1,260 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="rms-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello! I'm going to talk about what I would like to see""" start="00:00:00.000" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""in GNU Emacs in the future,""" start="00:00:08.960" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and what I would prefer not to find there.""" start="00:00:11.240" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""This is all within the context""" start="00:00:17.600" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""of GNU Emacs and its purpose.""" start="00:00:22.080" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""GNU Emacs is a part of the GNU operating system,""" start="00:00:25.360" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and the purpose of the GNU operating system""" start="00:00:30.600" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""is not simply to do a good job technically,""" start="00:00:33.400" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""not simply to be good to use.""" start="00:00:38.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Its main purpose, its overall purpose,""" start="00:00:42.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""is to give people freedom,""" start="00:00:45.760" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and to help them value and defend that freedom.""" start="00:00:48.560" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""A GNU package, by being a convenient, well-written program,""" start="00:00:54.760" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""should contribute to that overall ethical and social goal,""" start="00:01:00.160" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and not only to the usefulness of our software.""" start="00:01:06.000" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""This is true for GNU Emacs""" start="00:01:10.440" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""as much as it is for any other free program we’ve developed.""" start="00:01:14.080" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""In fact, GNU Emacs is the first GNU program that I released.""" start="00:01:18.720" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I had written some other things before that,""" start="00:01:25.320" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""but didn't release them at that time.""" start="00:01:28.800" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""There was no particular use in doing so.""" start="00:01:30.600" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""So it was through GNU Emacs""" start="00:01:34.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that I learned about various things""" start="00:01:36.107" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""such as software licenses and how to defend freedom.""" start="00:01:38.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""You're of course familiar with what GNU Emacs is today,""" start="00:01:44.240" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""thanks to the contributions of thousands of other people""" start="00:01:50.507" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""who came after me.""" start="00:01:54.340" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""What would I like?""" start="00:01:57.067" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""What would other people like?""" start="00:01:58.880" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Lots of people come to Emacs familiar with VS Code,""" start="00:02:01.533" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and they say, &quot;Please make Emacs more like VS Code.""" start="00:02:06.480" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Change everything that you did in the 1980s and 90s""" start="00:02:10.520" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to be like that other thing.&quot;""" start="00:02:15.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""That wouldn't be feasible even if we wanted to.""" start="00:02:18.320" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Our goal is not to be... not resembling VS Code.""" start="00:02:24.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Any resemblance is coincidental.""" start="00:02:30.440" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""But in particular,""" start="00:02:33.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""we do not want to have extension languages other than Lisp.""" start="00:02:38.040" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Emacs Lisp is the variant of Lisp""" start="00:02:43.874" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that we've always supported,""" start="00:02:47.574" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""which has evolved along with Emacs.""" start="00:02:49.574" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""We can conceivably have Scheme as well,""" start="00:02:52.960" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""if we can sufficiently solve the problems,""" start="00:02:57.400" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""the technical problems of making Scheme""" start="00:03:01.140" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and Emacs Lisp interoperate.""" start="00:03:03.760" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""We did some design work, I think that was with Tom Lord,""" start="00:03:06.480" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""whom the community will greatly miss.""" start="00:03:11.600" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""In the 1990s, there are challenges that remain;""" start="00:03:15.880" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""maybe it can be done.""" start="00:03:19.340" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""But a non-Lispy language would be a mistake.""" start="00:03:21.360" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It would divert our development focus into areas""" start="00:03:27.960" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that we don't need, languages that are less powerful,""" start="00:03:33.000" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""less beautiful, and less desirable for the purpose.""" start="00:03:37.480" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""However, the language that we above all shouldn't support""" start="00:03:46.280" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""is JavaScript. That's not because of the language itself.""" start="00:03:52.120" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I don't know the JavaScript language,""" start="00:03:57.333" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I've heard people say it's rather clumsy""" start="00:04:00.480" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and not well designed, but I don't know this.""" start="00:04:04.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""In any case, it's not what my views are based on.""" start="00:04:07.520" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""There's something much worse about JavaScript,""" start="00:04:12.400" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""which is not the language itself, but how people use it.""" start="00:04:14.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Namely, it's been adopted as a way for a network server""" start="00:04:18.800" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to send a program to your machine""" start="00:04:23.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""without your even noticing, so that this program,""" start="00:04:26.120" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""written by you don't know who, will run on your computer""" start="00:04:30.120" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and do you don't know what.""" start="00:04:35.107" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""And you're supposed to just trust""" start="00:04:37.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""all and sundry developers of software""" start="00:04:39.774" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""for the sites you visit,""" start="00:04:43.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""which very commonly do malicious things, often unknown""" start="00:04:45.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to the people who are running the server itself.""" start="00:04:51.320" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""They paid someone else to design a website""" start="00:04:55.680" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and they probably said, oh,""" start="00:04:59.320" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""make it fashionable and attractive.""" start="00:05:01.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""And they didn't insist, don't snoop on the visitors,""" start="00:05:04.440" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""even if they understood what the issue was.""" start="00:05:09.760" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""So these sites snoop. It's a serious problem.""" start="00:05:12.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""The problem comes not from the language JavaScript,""" start="00:05:20.480" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""but from the fact that browsers, by default,""" start="00:05:24.080" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""will pull in JavaScript code that gets sent to them""" start="00:05:28.680" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and run it to do anything at all.""" start="00:05:32.440" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Emacs is supposed to defend your freedom.""" start="00:05:35.933" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It's supposed to help you to defend your freedom,""" start="00:05:39.320" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and lead you to defend your freedom,""" start="00:05:42.520" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""which means it shouldn't lead you""" start="00:05:45.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to throw your freedom away as soon as you visit a site""" start="00:05:47.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that tries to send you a non-free program""" start="00:05:50.960" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to run straight off of that other machine.""" start="00:05:53.920" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""So it's important not to lead users""" start="00:05:58.280" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to do computing this way.""" start="00:06:04.080" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""So what are some good things""" start="00:06:06.520" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that we would want instead of this?""" start="00:06:10.800" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""One thing we want""" start="00:06:14.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""is to update the &quot;Introduction to Emacs Lisp Programming&quot;""" start="00:06:19.874" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""by the late Bob Chassell.""" start="00:06:26.574" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It's a book that makes it easy for even non-programmers""" start="00:06:29.480" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to learn to write simple programs in Emacs Lisp.""" start="00:06:34.720" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""And from there, they can go on to do better.""" start="00:06:38.000" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""We made a pretty big change in Emacs Lisp""" start="00:06:41.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""a few years ago, implementing lexical scoping by default.""" start="00:06:44.800" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Originally, Emacs Lisp used to be entirely dynamic scoping,""" start="00:06:49.480" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""like some of the earliest Lisp interpreters.""" start="00:06:57.360" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""This is a change that should have a careful job""" start="00:07:01.960" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""of updating for the introduction.""" start="00:07:06.520" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I'm sure we've made it clear in the reference manual,""" start="00:07:10.560" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""but that's not what beginners read first.""" start="00:07:14.600" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""We need something to teach them in lexical scoping.""" start="00:07:18.400" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""Another thing we could use is to make it easier""" start="00:07:23.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to understand the facilities that we have.""" start="00:07:30.440" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""For instance, I think every package""" start="00:07:33.880" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that you might load into your Emacs and run""" start="00:07:38.560" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""should have a name that helps you remember what job it does.""" start="00:07:42.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It doesn't have to be super long to tell you""" start="00:07:47.680" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""what job that package does.""" start="00:07:51.374" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""You can read the description to learn that.""" start="00:07:53.607" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""But once you've read the description,""" start="00:07:56.874" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""it should be memorable. When you see that name again,""" start="00:07:59.600" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""you should realize, oh, that's the package I could use""" start="00:08:03.074" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to do &quot;less&quot; and so. We've had a tendency""" start="00:08:06.607" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to give packages names for the sake of pure wordplay""" start="00:08:11.880" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""or lack of obvious meaning,""" start="00:08:17.940" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and I think we should add on, to those packages,""" start="00:08:23.574" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""names that people will remember.""" start="00:08:28.189" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""Also, there are ways we can simplify the command interface""" start="00:08:31.807" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""of Emacs. For instance, there are many different parameters""" start="00:08:39.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""users can specify that can have several values,""" start="00:08:43.760" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and sometimes you do various kinds of editing""" start="00:08:48.000" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""in one session. That's normal in Emacs,""" start="00:08:51.807" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and you might want different parameter settings""" start="00:08:54.440" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""for different kinds of editing.""" start="00:08:57.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""So you specify parameter value A, do some editing,""" start="00:09:00.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""you specify parameter value B, and do some editing,""" start="00:09:06.200" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and you'd switch back and forth, so you want""" start="00:09:10.240" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to switch back and forth between these parameters.""" start="00:09:13.720" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I think we should aim ...""" start="00:09:17.440" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""People have added various commands to switch""" start="00:09:22.707" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""between the last two or n values of this parameter,""" start="00:09:26.740" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and another command to switch""" start="00:09:30.500" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""between the last two or n values of this [other] parameter,""" start="00:09:32.774" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and then that parameter, you know, and that parameter.""" start="00:09:36.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I think we should be able to have""" start="00:09:41.360" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""a switch between the last n values command""" start="00:09:44.767" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that works on various different parameters,""" start="00:09:49.120" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and thus makes it easy to remember""" start="00:09:54.320" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that there is this facility.""" start="00:09:57.040" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Because right now the commands to do that are all ad-hoc,""" start="00:09:59.340" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and if you don't use a toggling among the last n values""" start="00:10:03.874" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""of a given parameter, you won't know how to do it.""" start="00:10:08.640" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It won't be obvious that there is a way,""" start="00:10:11.840" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""so you'd have to go to a suitable manual""" start="00:10:15.367" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and study for a while to think of that.""" start="00:10:17.767" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""We could make this easily discoverable.""" start="00:10:20.100" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""There is another kind of modularity that's important,""" start="00:10:23.620" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and that is modularity at the level of maintenance.""" start="00:10:30.140" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""This is something all programmers know about, of course,""" start="00:10:34.100" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""but in Emacs, various parts interact with other parts,""" start="00:10:38.307" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and we've tried to make them modular in design""" start="00:10:43.300" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""by using lots of hooks,""" start="00:10:47.980" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""but we haven't gone as far as we could.""" start="00:10:50.380" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""With some effort, we could find calls""" start="00:10:54.380" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""from over here to over there""" start="00:10:58.060" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that could be replaced by use of hooks,""" start="00:11:00.220" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""so that we could reduce the extent""" start="00:11:03.140" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to which you need to know about one part of Emacs""" start="00:11:05.940" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to maintain another part of Emacs,""" start="00:11:09.974" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and I think that as we keep adding more facilities to Emacs,""" start="00:11:12.707" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""this kind of modularity will be an investment that pays off.""" start="00:11:17.580" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""There’s one big area of features""" start="00:11:22.220" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that I would like to see in Emacs,""" start="00:11:27.240" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and that's the ability to edit""" start="00:11:30.800" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""formatted documents in WYSIWYG, to be able to edit""" start="00:11:33.180" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""a letter or a scientific mathematical paper with formulas""" start="00:11:40.340" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""or a nicely laid out manual,""" start="00:11:47.940" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""looking at what it's really going to look like.""" start="00:11:52.900" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Now we have free software to do this.""" start="00:11:56.660" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""For instance, I use LibreOffice some of the time.""" start="00:12:00.460" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Sometimes it's faster than writing something""" start="00:12:04.660" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to be formatted with a text formatter""" start="00:12:08.100" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and then formatting it. But when I use LibreOffice,""" start="00:12:11.860" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I always miss the commands and facilities,""" start="00:12:16.180" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""the editing facilities of Emacs.""" start="00:12:19.220" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""I'd like to have them both together, something with""" start="00:12:22.674" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""the text formatting capabilities of LibreOffice""" start="00:12:26.500" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""or even better of TeX, but the editing commands""" start="00:12:30.340" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and facilities of Emacs. This would be a big job,""" start="00:12:36.060" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""but it can be made up of a lot of medium-sized jobs.""" start="00:12:40.300" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""If people start working on those medium-sized jobs,""" start="00:12:45.980" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""then in a number of years""" start="00:12:50.020" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""we'll have something absolutely amazing.""" start="00:12:52.060" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""But one thing I think we really shouldn't have""" start="00:12:55.460" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""is the equivalent of a modern web browser.""" start="00:13:01.140" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""The World Wide Web started out in the 1990s""" start="00:13:06.500" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""in a much simpler form,""" start="00:13:10.940" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""where a web page described its contents,""" start="00:13:13.874" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and the web browser laid them out,""" start="00:13:17.820" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and the user could parameterize""" start="00:13:21.180" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""how to lay out various kinds of situations.""" start="00:13:23.807" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""This was not only convenient for users""" start="00:13:27.140" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""who wanted to control things and understand things,""" start="00:13:31.807" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""it was also freedom-respecting""" start="00:13:35.974" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""because the layout was done by your browser.""" start="00:13:39.740" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""If you had a free browser, you were in control,""" start="00:13:43.020" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""even though the browser was complicated already.""" start="00:13:48.100" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""But starting around two decades ago,""" start="00:13:51.620" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""there was an explosion in the complexity of browsers""" start="00:13:54.807" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""as companies wanted to have more and more control""" start="00:13:58.820" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""over exactly what would appear on a user's screen.""" start="00:14:02.780" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""So they invented lots of features to control that,""" start="00:14:07.700" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""features where the user couldn't really customize""" start="00:14:12.474" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""how something would actually appear""" start="00:14:16.007" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""because the whole point was that""" start="00:14:18.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""the company could control that.""" start="00:14:21.307" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""And JavaScript was sort of the ultimate level""" start="00:14:23.807" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""of &quot;the company controls everything.&quot;""" start="00:14:27.020" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Because of this, going beyond the simple level""" start="00:14:32.107" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""of web page formatting features in Emacs""" start="00:14:38.500" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""is basically heading down a path that leads to subjugation.""" start="00:14:43.540" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It's a path that we need to stay away from.""" start="00:14:50.940" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It's a path to an unjust world of computing""" start="00:14:54.740" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that you can easily see around you.""" start="00:15:00.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Web browsers nowadays are designed to display ads""" start="00:15:03.420" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that you may not want to see.""" start="00:15:08.700" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""They're designed for DRM.""" start="00:15:11.667" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""They're designed for companies to snoop on you""" start="00:15:17.900" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""in unobvious ways. And all of that""" start="00:15:22.420" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""we should protect ourselves from,""" start="00:15:26.300" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""protect our users from.""" start="00:15:28.980" video="mainVideo-rms" id="subtitle"]]
+[[!template new="1" text="""So I hope that some of you will be enthusiastic""" start="00:15:31.300" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""about some of these changes,""" start="00:15:39.980" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""especially towards editing formatted text.""" start="00:15:42.060" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""If you want to get involved, we have""" start="00:15:46.940" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""a development discussion list called emacs-devel@gnu.org.""" start="00:15:51.980" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""You can join that. You can also,""" start="00:15:57.820" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""if you get interested in working on a package""" start="00:16:02.380" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""and you're not an experienced Emacs Lisp developer,""" start="00:16:05.740" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""it's a very good idea to look for an experienced developer""" start="00:16:09.500" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""to talk with.""" start="00:16:13.740" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Make sure you can write programs in Emacs Lisp first.""" start="00:16:14.980" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""It's not useful to take up the expert’s time learning that.""" start="00:16:19.220" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""You can still learn it from the introduction.""" start="00:16:24.260" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""But after that, when it's a matter of how to design""" start="00:16:27.407" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""your favorite package, do have a discussion with developers.""" start="00:16:31.660" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""They'll give you design ideas""" start="00:16:36.180" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""that will help you make a package that we put into Emacs.""" start="00:16:39.060" video="mainVideo-rms" id="subtitle"]]
+[[!template text="""Now it's time for questions.""" start="00:16:43.180" video="mainVideo-rms" id="subtitle"]]
+
+
+
+Captioner: anush
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20rms%3A%20What%20I%27d%20like%20to%20see%20in%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/rms-before.md b/2022/info/rms-before.md
new file mode 100644
index 00000000..62113c2d
--- /dev/null
+++ b/2022/info/rms-before.md
@@ -0,0 +1,78 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+For context, we will first play Richard Stallman's 2014 TEDx talk called "Free Software, Free Society." The TEDx talk is licensed under the Creative Commons Attribution - No Derivative Works 3.0 license. Afterwards, Richard Stallman will discuss what he believes will be good ways to improve Emacs. The EmacsConf talk will be under the Creative Commons Attribution - ShareAlike license. There will be a moderated Q&A, so please put your questions in the Etherpad or IRC.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="rms">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect stroke-width="3" x="211" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 18-min talk followed by moderated Mumble Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">#emacsconf-dev</a>)
+Etherpad: <https://pad.emacsconf.org/2022-rms>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T16:15:00Z" end="2022-12-04T16:35:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~11:15 AM - 11:35 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~10:15 AM - 10:35 AM CST (US/Central)<br />Sunday, Dec 4 2022, ~9:15 AM - 9:35 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~8:15 AM - 8:35 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~4:15 PM - 4:35 PM UTC <br />Sunday, Dec 4 2022, ~5:15 PM - 5:35 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~6:15 PM - 6:35 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~9:45 PM - 10:05 PM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~12:15 AM - 12:35 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~1:15 AM - 1:35 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="rms-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="rms-mainVideo" data="""
+00:00.000 GNU Emacs and its purpose
+02:33.640 Lisp as the extension language
+03:46.280 JavaScript versus freedom
+06:14.640 Updating "An Introduction to Emacs Lisp Programming"
+07:23.407 More memorable package names
+08:31.807 Simplifying the command interface
+10:23.620 Modularity
+11:22.220 Editing formatted text
+12:55.460 Not the equivalent of a modern web browser
+15:31.300 Getting involved
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.webm">Download --main.webm (81MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.opus">Download --main.opus (7.7MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/oWWwS9T9BTQU8DnJ2g56vm">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="rms-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="rms-qanda" data="""
+00:56.800 Pragmatically, how are people that buy into these ideals, and especially those that build the software, meant to live/thrive, short of renouncing many of the luxuries of modern life, as many have been struggling to reconcile both, it appears? Wouldn't it be smarter and more productive longer-term to solve that problem too?
+03:24.600 I have been admiring your work for free software for many years now. I am a bit concerned about what will happen to the GNU project when you retire (not soon, I hope!!). Have you planned how to manage the GNU project in the long run?
+04:52.520 In response to your aversion to JavaScript support in Emacs: In the same way that to revolt against the nonfree spirit in software development one has to develop software, and that to fight nonfree compilers one has to write a free compiler - can you fairly consider rejection of JavaScript as a tool conducive to improving the state of free JavaScript? A server can send back any MIME type to execute on your machine, JS was just the most convenient.
+07:27.000 With all the recent additions and optimizations to Emacs Lisp (lexical scoping, native compilation etc.) would you deem Emacs Lisp suitable for general purpose programming outside Emacs (i.e. scripting, running web servers). If not, why?
+08:44.760 Could you give a few examples of the medium-sized jobs necessary for WYSIWYG-editor support in Emacs?
+09:33.480 Should GNU (or someone else) define a safe-subset of HTML/CSS/JS to make web browsers simpler and safer (e.g. by preventing JS from contacting servers)?
+10:57.440 How can we ensure the continuity of an understanding of the more arcane parts of the [Emacs] source code, and increase their evolvability, notably with regards to display, single-threading limitations, etc.?
+13:50.480 Are there any problems or disadvantages using the GNU AGPL for non-networked software like Emacs packages?
+14:50.280 Is there a list of Emacs issues which can be solved by programmers with different levels? For example my level is A, I know basic elisp and C. How can I help?
+16:36.840 What roadblocks kept some of the other efforts from being used with Emacs?
+17:36.240 What do you use emacs for beyond editing?
+17:55.120 Song about e-mail
+18:49.556 Emacs is used by a small population relative to the population that could benefit from it. Do you have any thoughts on how to expand the user base more broadly even among software developers?
+20:05.760 Would a namespace system similar to Common Lisp packages but without :USE work in Emacs? Modern CL implementations have package local nicknames to create package local prefixes.
+22:42.440 With Emacs 29 adding more (awesome) features into vanilla Emacs, how should we ensure vanilla Emacs does not get bloated with many similar features? (example: ido/icomplete, vc/magit)
+24:26.920 Do you recommend reaching out in [high] schools for volunteers instead of universities because they are more prone to value the objectives of freedom?
+25:35.040 What was the thought process behind making Emacs Lisp dynamically scoped when you first created it? What advantages did it provide over the alternative?
+27:18.766 It's hard to pick up Emacs if you do not speak English. Can something be done to address that?
+29:28.840 Do you use Org or Org mode, and if so, to what extent?
+33:54.480 What do you have in mind for more modular Emacs development?
+35:19.040 Reframing the school question
+36:18.640 In light of that critique of JavaScript not being about the language per se but rather the "culture of blindly getting and running packages/libraries", what's so different with what's currently done by the vast majority of Emacs/Elisp users to just install packages blindly?
+37:48.800 Do you still intend to merge your patch to the "shorthands" feature to the master branch?
+38:54.880 Do you think the freedom e.g., we have in Emacs, becomes a hurdle for some people to pursue more important things in the world? I used to do a lot of Emacs programming, but I recently try to stay away from tinkering on Emacs.
+40:27.920 Question about software freedom: how does it apply to software that are art/media experiences, like videogames? In your view, Is the creator of a videogame obliged to release it under a free license?
+43:35.915 Have you seen Haketilo? It seems similar to LibreJS.
+45:45.568 Do you have any suggestions for helping propective contributers streamline
+the copyright assignment needed to contribute to Emacs (and other FSF software
+projects)?
+47:09.800 Can complexity induced by company-funded free/libre code become a problem, when the company pulls out, leaving the code potentially unmaintainable?
+49:31.280 What do you think of Hyperbole or EEV instead of org mode, or other things for the stuff that org mode does "second brain / knowledge base", or GTD 'getting things done' etc... among other things in Emacs or other Emacs packages
+52:06.251 Are there plans to bring modal editing (eg. evil-mode, viper) to Emacs core and did your opinion on modal editing change over the years?
+53:03.000 What is your opinion on the current state of large machine
+learning/AI models?
+54:14.302 I thought it was a virtue to separate the content from the style orappearance of information. Part of being free is also to view information in the format that you want. Does your WYSIWYG idea erode this virtue and lead to more thinking -- perhaps undue thinking about style over substance?
+55:38.840 Do you ever dabble in retro-computing, e.g. logging into TOPS10/20 systems SDF, etc?
+56:38.196 Do you know Gemini?
+58:04.480 stallmansupport.org
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="rms-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.webm">Download --answers.webm (129MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rms--what-id-like-to-see-in-emacs--answers.opus">Download --answers.opus (30MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/rms-nav.md b/2022/info/rms-nav.md
new file mode 100644
index 00000000..1ae68acd
--- /dev/null
+++ b/2022/info/rms-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/orgvm">orgvm: a simple HTTP server for org</a>
+Next by track: <a href="/2022/talks/hyperorg">Powerful productivity with Hyperbole and Org Mode</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/rolodex-after.md b/2022/info/rolodex-after.md
new file mode 100644
index 00000000..bcd512c2
--- /dev/null
+++ b/2022/info/rolodex-after.md
@@ -0,0 +1,453 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="rolodex-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, attendees of EmacsConf 2022!""" start="00:00:00.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The title of my talk is:""" start="00:00:06.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""&quot;Build a Zettelkasten with the Hyperbole Rolodex.&quot;""" start="00:00:08.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""My name is Ramin Honary.""" start="00:00:16.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I work as a software engineer""" start="00:00:17.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""writing apps for a small machine learning consultancy.""" start="00:00:19.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I have been using Emacs since roughly 2018""" start="00:00:22.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""after having switched from a workflow""" start="00:00:24.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""using Vim together with Screen/Tmux for over a decade.""" start="00:00:26.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Today I'd like to talk a bit about""" start="00:00:29.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the Hyperbole package for Emacs.""" start="00:00:31.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Others are presenting talks later today""" start="00:00:34.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""about Hyperbole as well,""" start="00:00:36.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""including some of the the authors and maintainers,""" start="00:00:37.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so I won't go into too much detail""" start="00:00:39.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""about how Hyperbole works.""" start="00:00:41.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Instead, I want to present""" start="00:00:43.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a more concrete use case for Hyperbole,""" start="00:00:45.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which is how to use it to facilitate""" start="00:00:46.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the Zettelkasten method.""" start="00:00:49.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Most Emacs users will probably be""" start="00:00:51.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""more familiar with Org Roam.""" start="00:00:53.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Org Roam may even be the first thing that comes to mind""" start="00:00:56.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""when you hear the word &quot;Zettelkasten.&quot;""" start="00:00:58.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""But personally, I use Hyperbole""" start="00:01:00.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""because I found it easier to get started with""" start="00:01:02.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""using it as an ideas database.""" start="00:01:05.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""All you need to do is install the Hyperbole package""" start="00:01:07.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(which is available on GNU-ELPA)""" start="00:01:09.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and then set a few customization options.""" start="00:01:11.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""There is nothing else you really need to do""" start="00:01:13.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to get started.""" start="00:01:15.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And also, Hyperbole works nicely with Org Mode.""" start="00:01:16.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So Hyperbole's built-in functionality""" start="00:01:19.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""can be used as a nice, light-weight alternative""" start="00:01:21.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to other Emacs Zettelkasten packages.""" start="00:01:24.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This talk is for people who are curious about""" start="00:01:28.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""getting started with the Zettelkasten method,""" start="00:01:30.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but are not ready to commit""" start="00:01:34.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to a more purpose-built solution like Org Roam.""" start="00:01:36.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""So the thing I'd like people""" start="00:01:41.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to take away from this presentation""" start="00:01:42.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is that the Hyperbole Emacs package""" start="00:01:44.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""provides you with a flat-file database called &quot;HyRolo&quot;""" start="00:01:46.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which you can use to store ideas.""" start="00:01:50.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Then you can use what Hyperbole calls &quot;buttons&quot;""" start="00:01:53.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(which are hyperlinks)""" start="00:01:56.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to execute arbitrary Emacs commands""" start="00:01:57.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and by inserting links into your database""" start="00:02:00.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that execute queries against the database itself.""" start="00:02:03.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""These query-action links serve as""" start="00:02:06.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a means to link ideas together,""" start="00:02:08.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""thus creating a functioning &quot;Zettelkasten.&quot;""" start="00:02:10.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""If this doesn't make sense to you,""" start="00:02:13.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I'll explain what all of this means presently.""" start="00:02:15.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""So just a quick overview of what &quot;Zettelkasten&quot; is.""" start="00:02:19.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Note that most of what I say""" start="00:02:24.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""about the Zettelkasten method""" start="00:02:26.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""comes from a guy called Sascha Fast,""" start="00:02:27.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and his website: zettelkasten.de .""" start="00:02:29.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So a Zettelkasten is, in brief,""" start="00:02:33.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a database containing many nodes of interconnected ideas,""" start="00:02:35.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""each idea being a single quantity of knowledge""" start="00:02:38.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(about a paragraph)""" start="00:02:40.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and linked to other related ideas.""" start="00:02:42.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Also, let me quickly mention""" start="00:02:46.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that there are actually many tools I use""" start="00:02:47.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that assist me with the zettelkasten method:""" start="00:02:49.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Hyperbole for hyperlinks;""" start="00:02:51.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Embark for general text editing;""" start="00:02:53.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Org Mode for markup;""" start="00:02:56.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Dired for managing large sets of files;""" start="00:02:57.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Consult, Vertico, Orderless, Marginalia;""" start="00:02:59.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for interactive search through directories and documents;""" start="00:03:01.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and Magit for revision control,""" start="00:03:04.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and syncing my database of ideas""" start="00:03:06.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""across a few of my computers.""" start="00:03:08.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Each of these tools provides some unique functionality,""" start="00:03:10.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but today I will be focusing mostly on Hyperbole""" start="00:03:12.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and how it is especially useful""" start="00:03:15.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the task of linking information together""" start="00:03:17.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which is the most important aspect""" start="00:03:19.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""of the Zettelkasten methodology.""" start="00:03:21.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""And now I'll briefly go over what Hyperbole is.""" start="00:03:25.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""At it's core, Hyperbole is a simple markup language""" start="00:03:28.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""specifically designed to markup hyperlinks.""" start="00:03:31.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now, a hyperlink usually is only able to jump to""" start="00:03:34.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""ordinary URLs and file paths.""" start="00:03:38.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Hyperbole extends the function of a hyperlink to provide""" start="00:03:40.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a simple human-readable markup""" start="00:03:44.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for executing Emacs commands (called &quot;button actions&quot;)""" start="00:03:46.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and then, on top of this core functionality,""" start="00:03:49.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a few mini applications""" start="00:03:52.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for example &quot;HyRolo&quot; and &quot;Koutline&quot;,""" start="00:03:53.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""have been built to make Hyperbole more generally useful""" start="00:03:56.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""as a personal information management tool.""" start="00:04:00.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""&quot;HyRolo&quot; is the feature that I use as my Zettelkasten,""" start="00:04:03.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and in particular, the HyRolo search feature""" start="00:04:07.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in combination with""" start="00:04:11.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the usual Hyperbole hyperlink markup language.""" start="00:04:12.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So let me just quote the Hyperbole manual:""" start="00:04:16.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""&quot;Hyperbole includes HyRolo for convenient management of""" start="00:04:19.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""hierarchical, record-oriented information.""" start="00:04:24.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Most often, this is used for contact management""" start="00:04:27.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but it can quickly be adapted to most any""" start="00:04:30.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""record-oriented lookup task requiring fast retrieval.&quot;""" start="00:04:33.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So in other words, for example,""" start="00:04:37.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""it can be used to run search queries""" start="00:04:38.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""across the full set of nodes in a set of Org-Mode files.""" start="00:04:41.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This means we can use an Org-Mode file""" start="00:04:44.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""as a flat-file database""" start="00:04:47.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in which entries in the database can be linked together.""" start="00:04:49.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This, in essence, is a what a Zettelkasten is.""" start="00:04:52.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""HyRolo needs almost no configuration,""" start="00:04:55.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""even if you are using it""" start="00:04:58.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the purpose of Zettelkasten,""" start="00:05:00.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but you should at least make sure""" start="00:05:01.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""you set the location of the database""" start="00:05:03.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in your Emacs config file, using the Customize system""" start="00:05:05.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""or however you prefer to configure your Emacs.""" start="00:05:08.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I use &quot;use-package&quot;, and on this slide I have here""" start="00:05:10.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""an abridged version of what my &quot;init.el&quot; file""" start="00:05:13.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""looks like for the Hyperbole package.""" start="00:05:15.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""A few relevant environment variables are set:""" start="00:05:18.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the &quot;hyrolo-file-list&quot; variable""" start="00:05:21.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""selects where to find Rolo database files""" start="00:05:23.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the purpose of search. I have it set""" start="00:05:26.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to just the Zettelkasten flat file database.""" start="00:05:29.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And I also set &quot;hyrolo-date-format&quot; variable.""" start="00:05:31.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Each database entry has a time stamp, and""" start="00:05:35.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I use the time stamp as a unique ID""" start="00:05:37.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for each entry (that is, each idea node)""" start="00:05:40.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in the database.""" start="00:05:43.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Finally, before I get into the actual demo,""" start="00:05:44.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""let me quickly explain""" start="00:05:48.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the Hyperbole mini-buffer menu system.""" start="00:05:49.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Mini-buffer menus in Hyperbole work just like""" start="00:05:51.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in an ordinary GUI,""" start="00:05:54.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""except you typically enter into the mini-buffer menu""" start="00:05:55.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with a key binding instead of a mouse click.""" start="00:05:58.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""To open the Hyperbole menu,""" start="00:06:01.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""you use the Hyperbole universal leader key""" start="00:06:03.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that's C-h h, which by the way,""" start="00:06:06.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""this rebinds the &quot;view-hello-file&quot; command,""" start="00:06:09.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which is a command that probably most people never use.""" start="00:06:13.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So all Hyperbole menu key sequences begin with C-h h.""" start="00:06:15.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Please remember this:""" start="00:06:20.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""as I explain how to do things,""" start="00:06:23.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""please don't worry too much""" start="00:06:25.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""about the key sequences I use""" start="00:06:26.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to perform certain actions.""" start="00:06:28.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Really, I am just navigating""" start="00:06:30.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the Hyperbole mini-buffer menus.""" start="00:06:32.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""It is a very discoverable and fluid user interface.""" start="00:06:33.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Anyway, now that we have configured our Rolo database,""" start="00:06:37.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""let's see how we enter new ideas into the database.""" start="00:06:42.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And I will start with an empty database,""" start="00:06:45.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""then I'll switch over to a more complete database""" start="00:06:48.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that I prepared for this demo. So...""" start="00:06:53.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""first we type the Hyperbole universal leader key C-h h,""" start="00:06:57.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and then, you can see the menus down here""" start="00:07:04.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""we type &quot;r&quot; for &quot;Rolo&quot; and &quot;a&quot; for &quot;add&quot;.""" start="00:07:08.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""That's C-h h r a to enter a new idea.""" start="00:07:15.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And this command is available globally so,""" start="00:07:19.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""much like with the &quot;org-capture&quot; feature in Org-Mode,""" start="00:07:23.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""you can run this command at any time,""" start="00:07:26.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""at the very moment you want to enter an idea.""" start="00:07:28.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""First we are prompted for an entry title,""" start="00:07:32.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and if you were using HyRolo as a contact list,""" start="00:07:36.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""this is where you would enter the person's name.""" start="00:07:38.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I am using it as a Zettelkasten,""" start="00:07:40.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so I instead enter a title for my idea.""" start="00:07:43.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I'll just type in...""" start="00:07:45.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and as soon as I press enter after this prompt,""" start="00:07:46.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""my Zettelkasten org file is opened,""" start="00:07:53.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a new entry with the timestamp is created,""" start="00:07:56.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and the cursor is placed at this entry""" start="00:08:02.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""ready for me to enter the body text of the idea.""" start="00:08:06.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I'll type that in...""" start="00:08:09.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now I save the &quot;idea&quot; file (C-x C-s)""" start="00:08:14.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and switch back to what I was working on before""" start="00:08:18.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the usual C-x 0 (delete-window) command.""" start="00:08:20.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Next, I'd like to talk about""" start="00:08:23.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the HyRolo database search feature,""" start="00:08:26.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which is very useful.""" start="00:08:28.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The HyRolo search feature uses""" start="00:08:30.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""only Emacs built-in functions""" start="00:08:33.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and there is no indexing""" start="00:08:35.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""as with tools like &quot;mlocate&quot; or Org-Roam.""" start="00:08:36.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So far, I have not had any trouble with efficiency.""" start="00:08:38.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I don't know if at some point in the future,""" start="00:08:41.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""it will start slowing down.""" start="00:08:42.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Emacs built-in search functionality""" start="00:08:44.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is already pretty efficient as it is.""" start="00:08:46.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""It could also be that I am in the habit""" start="00:08:47.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""of storing larger bodies of text in separate files,""" start="00:08:50.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and not in the flat file database.""" start="00:08:55.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Anyway, you can search""" start="00:08:57.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""by regex, by string, or by words.""" start="00:08:59.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I personally find the string search""" start="00:09:02.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to be the most useful.""" start="00:09:03.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The difference between word search and string search""" start="00:09:04.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is that string search provides""" start="00:09:07.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""logical query operators like AND, OR, XOR, and NOT.""" start="00:09:09.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Once you run a search query,""" start="00:09:12.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a &quot;*HyRolo*&quot; buffer is opened""" start="00:09:14.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the query's results.""" start="00:09:16.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And this is a read-only-mode buffer""" start="00:09:18.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with a few useful single-key action bindings""" start="00:09:20.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for navigating the list of results""" start="00:09:23.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which I will now demonstrate.""" start="00:09:25.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""By the way, I have now switched over""" start="00:09:27.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to a larger example Rolo database that I have created""" start="00:09:31.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to demonstrate more of the HyRolo features.""" start="00:09:34.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The HyRolo search is available""" start="00:09:36.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in the Hyperbole mini-buffer menu""" start="00:09:39.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so it is always available to you.""" start="00:09:40.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Start with the Hyperbole universal leader key C-h h""" start="00:09:42.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""then &quot;r&quot; for Rolo and &quot;s&quot; for search. That is C-h h r s.""" start="00:09:46.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now we are prompted for a search string:""" start="00:09:53.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I type in &quot;Alice Abelton&quot;, and when I press enter,""" start="00:09:56.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the search results pop up""" start="00:10:02.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and the number of results is printed in the mini-buffer.""" start="00:10:04.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""We could also enter a search expression""" start="00:10:06.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""similar to a Lisp S-expression""" start="00:10:09.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with logical operators like AND or NOT,""" start="00:10:12.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but you would not need to quote the search terms.""" start="00:10:14.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So, for example (C-h h r s), I could write""" start="00:10:19.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""&quot;(and university character)&quot; within parentheses""" start="00:10:24.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and this would find entries""" start="00:10:30.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that only contain both of the words""" start="00:10:31.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""&quot;university&quot; and &quot;character&quot;.""" start="00:10:33.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""For the most part, I only really ever use""" start="00:10:35.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the ordinary string search without logical operators.""" start="00:10:39.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So as you can see, a search result buffer""" start="00:10:41.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""called &quot;*HyRolo*&quot; has popped up""" start="00:10:44.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with all of the matching entries.""" start="00:10:47.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And the search results buffer is a read-only buffer""" start="00:10:48.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with several useful navigation key bindings:""" start="00:10:51.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can press &quot;o&quot; to switch to &quot;overview&quot; mode,""" start="00:10:54.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which shows all of the headings, but no content.""" start="00:11:01.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This would include subheadings""" start="00:11:03.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with like 2 stars in front of it or 3 stars""" start="00:11:05.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can press &quot;a&quot; to switch to &quot;show all mode&quot;""" start="00:11:07.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which shows all of the content under each heading.""" start="00:11:12.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""If I know I am looking for a keyword""" start="00:11:14.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in a top-level heading,""" start="00:11:17.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can press &quot;t&quot; to switch to the &quot;top-level&quot; view mode""" start="00:11:18.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which shows only the top-level headings.""" start="00:11:22.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""As is always the case""" start="00:11:25.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the Emacs default key bindings,""" start="00:11:27.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""&quot;n&quot; and &quot;p&quot; move the cursor down and up lines,""" start="00:11:28.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so I can navigate the cursor downward""" start="00:11:32.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to an entry that looks interesting.""" start="00:11:34.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can press &quot;s&quot; to show the content""" start="00:11:37.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""of that particular entry.""" start="00:11:40.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can press &quot;h&quot; to hide the entry again.""" start="00:11:41.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And I can press &quot;e&quot; or M-RET on the entry heading""" start="00:11:44.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to &quot;edit&quot; that heading (that entry),""" start="00:11:49.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which will open the Org-Mode file,""" start="00:11:53.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that is, the Zettelkasten database file""" start="00:11:56.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the cursor at this particular entry.""" start="00:11:59.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Be warned that editing an entry creates a new timestamp,""" start="00:12:01.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which I do not need, and there is currently""" start="00:12:07.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""no way to avoid this behavior.""" start="00:12:10.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I work around this by simply using the undo command""" start="00:12:12.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which removes the unwanted timestamp.""" start="00:12:15.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And so that is how I use the HyRolo search functionality.""" start="00:12:20.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Now... since the most important aspect of Zettelkasten""" start="00:12:25.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is linking ideas in the database,""" start="00:12:32.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""how do we actually make this work in HyRolo?""" start="00:12:33.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So this is the secret sauce of Hyperbole,""" start="00:12:37.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and the key take-away""" start="00:12:40.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for this presentation (as I said earlier).""" start="00:12:41.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Hyperbole provides markup syntax""" start="00:12:43.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for executing arbitrary Emacs commands""" start="00:12:46.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so you can link HyRolo entries together""" start="00:12:50.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""using the HyRolo search function.""" start="00:12:53.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Let me demonstrate this now.""" start="00:12:56.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I am back in my example HyRolo database,""" start="00:12:58.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and if you take a closer look""" start="00:13:03.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""you can see some of the hyperlinks""" start="00:13:06.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that I already created""" start="00:13:11.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the angle-round bracket syntax.""" start="00:13:13.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now with the cursor inside of these brackets,""" start="00:13:15.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can press M-RET to &quot;click&quot; on this link.""" start="00:13:19.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""As you can see, the search query""" start="00:13:23.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""corresponding to this hyperlink here has executed""" start="00:13:27.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and popped up the &quot;*HyRolo*&quot; search results buffer.""" start="00:13:32.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""There is only one linked entry,""" start="00:13:34.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but the list of ideas that are produced""" start="00:13:38.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""by the search query in this buffer here""" start="00:13:41.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""are the list of all of the other ideas""" start="00:13:43.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that are related to this hyperlink""" start="00:13:45.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that we just clicked on here.""" start="00:13:47.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(Let me get rid of the other window...)""" start="00:13:49.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now from within this &quot;*HyRolo*&quot; buffer,""" start="00:13:52.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can navigate to another hyperlink...""" start="00:13:55.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and clicking on that updates the &quot;*HyRolo*&quot; buffer""" start="00:13:57.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with new results again.""" start="00:14:03.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can just keep navigating through""" start="00:14:04.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""all the Zettelkasten entries in this way.""" start="00:14:10.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""And so this is it.""" start="00:14:13.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This is my simple but effective Zettelkasten,""" start="00:14:18.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""constructed entirely with the functionality""" start="00:14:22.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""already built-in to Hyperbole.""" start="00:14:25.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""In the remaining time,""" start="00:14:26.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I'd like to talk about how Hyperbole hyperlinks work,""" start="00:14:32.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""because it's slightly different""" start="00:14:37.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""from how hyperlinks work in Org Mode""" start="00:14:38.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""or with the Emacs clickable text properties.""" start="00:14:40.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The easiest way to create a hyperlink button""" start="00:14:49.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that runs an Emacs command""" start="00:14:52.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is simply to type the Emacs command as an S-expression,""" start="00:14:55.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but with angle brackets instead of parentheses.""" start="00:14:59.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""If you were looking closely,""" start="00:15:03.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""you probably already saw a hyperlink of this form,""" start="00:15:05.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""an angle-bracketed Emacs command.""" start="00:15:08.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This hyperlink simply calls""" start="00:15:10.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the &quot;hyrolo-fgrep&quot; function with this string argument.""" start="00:15:13.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and so clicking on this button""" start="00:15:18.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is equivalent to running a HyRolo search""" start="00:15:20.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the C-h h r s key sequence.""" start="00:15:23.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""As you can see, clicking on it""" start="00:15:27.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""produced the search results""" start="00:15:31.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for entries associated with that string query.""" start="00:15:32.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""It's also possible to label an action""" start="00:15:35.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with a so-called &quot;implicit link&quot;,""" start="00:15:41.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and that's this angle-and-square bracketed notation.""" start="00:15:43.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""If I click on this button,""" start="00:15:47.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""it will activate this action""" start="00:15:52.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""to the right of the colon separator,""" start="00:15:54.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and there are the relevant search results""" start="00:16:01.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""from that string query.""" start="00:16:03.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""Finally, there are &quot;explicit links&quot;,""" start="00:16:04.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which I find to be especially useful""" start="00:16:09.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the Zettelkasten method.""" start="00:16:11.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I've already shown an example""" start="00:16:12.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""of using an explicit link before.""" start="00:16:15.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""What makes explicit links so useful is, firstly,""" start="00:16:17.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that the button works with just the label alone.""" start="00:16:20.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""There is no need to write an S-expression or anything.""" start="00:16:23.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""You can write the link label""" start="00:16:26.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""inline with the body text of the idea.""" start="00:16:28.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(For example, like this.)""" start="00:16:31.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Explicit links are identified by their label,""" start="00:16:34.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so they are especially good for""" start="00:16:39.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the names of people and places.""" start="00:16:40.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""By the way, this Zettelkasten database is for""" start="00:16:43.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a fictional story I started writing""" start="00:16:46.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the purpose of demonstrating HyRolo""" start="00:16:47.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""in this presentation, and I had so much fun writing it""" start="00:16:50.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that I may actually continue developing this story.""" start="00:16:52.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Anyway, let's create a new explicit link""" start="00:16:55.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and a new idea entry for a character in the story.""" start="00:16:58.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So suppose I want to create a new idea node entry""" start="00:17:01.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for this fictional character here,""" start="00:17:10.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and I'll also want to link this entry to that node.""" start="00:17:11.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Since hyperlinks are just string search,""" start="00:17:15.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""we don't actually need to have""" start="00:17:17.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""an entry in the database for this character.""" start="00:17:19.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The worst that can happen is that the hyperlink""" start="00:17:22.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""executes a search that returns no results.""" start="00:17:24.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So it's OK to create the hyperlink""" start="00:17:27.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""before we have an actual entry for this person.""" start="00:17:29.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(I'll just M-w copy the name.)""" start="00:17:31.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now I use the universal Hyperbole leader key C-h h,""" start="00:17:36.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and then &quot;e&quot; for &quot;explicit links&quot;""" start="00:17:40.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and &quot;c&quot; for &quot;create&quot;. That's C-h h e c.""" start="00:17:44.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""We are prompted for an entry label""" start="00:17:49.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but it defaults to the text highlighted by the region,""" start="00:17:52.640" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so I just press enter.""" start="00:17:56.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now it prompts for a button type,""" start="00:17:57.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so I select &quot;hyrolo-fgrep&quot;""" start="00:18:00.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(and there's Orderless helping me go faster),""" start="00:18:03.120" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and since &quot;hyrolo-fgrep&quot; requires""" start="00:18:06.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""a string argument for the search query,""" start="00:18:10.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I am prompted for the query string.""" start="00:18:12.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I'll type in &quot;character:&quot;, (yank &quot;Kerri Katz's&quot; name)""" start="00:18:14.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and there we are, the link has been created, and""" start="00:18:21.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(let me just get rid of the # character)""" start="00:18:26.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I can try it out.""" start="00:18:31.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""There's no search results. That's fine.""" start="00:18:32.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""We haven't created an idea entry yet""" start="00:18:36.200" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for this character now.""" start="00:18:38.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""So let's go ahead and do that now.""" start="00:18:40.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""If we remember how to create a new idea,""" start="00:18:43.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""it's C-h h r a, and then I type &quot;character:&quot;""" start="00:18:45.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and then yank the name again.""" start="00:18:52.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now a new node has been created,""" start="00:18:56.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and I can start describing this character.""" start="00:18:58.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Notice that I like to precede my characters""" start="00:19:04.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""with the keyword &quot;character:&quot; colon.""" start="00:19:08.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""This technique helps me to create hyperlinks""" start="00:19:11.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""using more descriptive search queries""" start="00:19:14.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that return fewer but more useful search results.""" start="00:19:17.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""And finally, I can create an explicit link""" start="00:19:19.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""from this character back to""" start="00:19:23.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the other character (her boyfriend).""" start="00:19:26.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I just type in &quot;<(Bertrand Becket)>&quot;,""" start="00:19:28.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and this explicit link has already been created""" start="00:19:31.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so I don't need to create it again. It just works.""" start="00:19:37.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Hyperbole identifies buttons by their label,""" start="00:19:39.680" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so as long as an explicit link button with that label""" start="00:19:41.880" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""has been created before,""" start="00:19:44.720" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I just can type in the button with markup by hand,""" start="00:19:46.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and then I can just use it.""" start="00:19:51.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Now I am back to the search results""" start="00:19:53.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the boyfriend character.""" start="00:19:57.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I hope you can see how minimal but useful""" start="00:19:59.320" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is this particular Zettelkasten technique I have""" start="00:20:04.160" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""that uses this &quot;HyRolo&quot;.""" start="00:20:07.760" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""I should also make clear that Hyperbole explicit links""" start="00:20:10.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""are encoded in a separate file in the same directory""" start="00:20:19.360" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""as the Zettelkasten flat-file database.""" start="00:20:22.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(So, let's go back to that and C-x C-f &quot;.hypb&quot;).""" start="00:20:24.280" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""You should not edit this file by hand,""" start="00:20:37.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""but it is human readable,""" start="00:20:41.240" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""so it works well with Git""" start="00:20:43.600" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and other revision control systems.""" start="00:20:45.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Whenever an explicit link is activated,""" start="00:20:47.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""it consults this file and runs the associated action,""" start="00:20:49.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""which, in the Zettelkasten use case,""" start="00:20:52.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""will always be to run a HyRolo search query.""" start="00:20:55.840" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""The advantage of keeping a separate table of links""" start="00:20:58.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""is that you can edit the link action""" start="00:21:02.040" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""(that is, the search query) in just one place,""" start="00:21:03.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""and the updated button action works everywhere""" start="00:21:07.000" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""without having to change any other files.""" start="00:21:10.560" video="mainVideo-rolodex" id="subtitle"]]
+[[!template new="1" text="""So, that is all for today.""" start="00:21:12.480" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Thank you so much for listening to my talk.""" start="00:21:18.400" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""I'll be available for questions""" start="00:21:20.520" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""for the next 20 minutes or so.""" start="00:21:23.080" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""If there are any questions that I cannot answer,""" start="00:21:24.920" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""you will have a chance to ask""" start="00:21:27.960" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""the author of Hyperbole himself, Bob Weiner,""" start="00:21:29.440" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""later today after his presentation.""" start="00:21:31.800" video="mainVideo-rolodex" id="subtitle"]]
+[[!template text="""Thanks for your attention!""" start="00:21:34.240" video="mainVideo-rolodex" id="subtitle"]]
+
+
+
+Captioner: ramin
+
+Questions or comments? Please e-mail [ramin.honary@gmail.com](mailto:ramin.honary@gmail.com?subject=Comment%20for%20EmacsConf%202022%20rolodex%3A%20Build%20a%20Zettelkasten%20with%20the%20Hyperbole%20Rolodex)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/rolodex-before.md b/2022/info/rolodex-before.md
new file mode 100644
index 00000000..93b0adc4
--- /dev/null
+++ b/2022/info/rolodex-before.md
@@ -0,0 +1,32 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Ramin Honary shares how he uses HyRolo to create and navigate links between his notes. Afterwards, he will handle questions via IRC.
+
+<div class="vid"><video controls preload="none" id="rolodex-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="rolodex-mainVideo" data="""
+00:00.000 Introduction
+01:41.040 Key takeaway
+02:17.000 Overview of Zettelkasten
+02:46.320 Tools I use in day-to-day writing
+03:25.360 Quick overview of Hyperbole
+04:03.520 Explain HyRolo
+04:55.240 Configuration of Hyperbole using ~use-package~
+05:44.280 The Hyperbole menu-driven user interface
+06:37.600 Getting started with *HyRolo*: Create a /zettel/
+08:23.760 Searching the *HyRolo* database
+09:27.120 Demo *HyRolo* search
+10:06.960 Search operators AND/OR/NOT
+10:42.520 Navigating the search results
+12:01.760 Editing entries creates timestamps
+12:25.560 How is *HyRolo* a zettelkasten?
+12:56.040 Demo interlinked notes via *HyRolo* search
+14:26.800 Explaining how Hyperbole hyperlinks work
+15:35.080 Demo Hyperbole "implicit links"
+16:04.680 Explain Hyperbole "explicit links"
+16:04.680 Demo creating an explicit link
+18:32.720 Demo creating an /zettel/ entry for a person
+19:19.880 Demo explicit linking new entry to others
+20:10.560 How "explicit buttons" encode actions
+21:12.480 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.webm">Download --main.webm (63MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-rolodex--build-a-zettelkasten-with-the-hyperbole-rolodex--ramin-honary--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/n6kPHmyb7bwombvnc48BE6">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/rolodex-nav.md b/2022/info/rolodex-nav.md
new file mode 100644
index 00000000..d52810ca
--- /dev/null
+++ b/2022/info/rolodex-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/orgyear">This Year in Org</a>
+Next by track: <a href="/2022/talks/rde">rde Emacs introduction</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/sat-close-after.md b/2022/info/sat-close-after.md
new file mode 100644
index 00000000..a51ef399
--- /dev/null
+++ b/2022/info/sat-close-after.md
@@ -0,0 +1,7 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20sat-close%3A%20Saturday%20closing%20remarks)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/sat-close-before.md b/2022/info/sat-close-before.md
new file mode 100644
index 00000000..f3b222a8
--- /dev/null
+++ b/2022/info/sat-close-before.md
@@ -0,0 +1,4 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><div></div><div class="files resources"><ul></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/sat-close-nav.md b/2022/info/sat-close-nav.md
new file mode 100644
index 00000000..f9156b4f
--- /dev/null
+++ b/2022/info/sat-close-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/haskell">Haskell code exploration with Emacs</a>
+Next by track: <a href="/2022/talks/sun-open">Sunday opening remarks</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/sat-open-after.md b/2022/info/sat-open-after.md
new file mode 100644
index 00000000..c5e3d342
--- /dev/null
+++ b/2022/info/sat-open-after.md
@@ -0,0 +1,89 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="sat-open-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Welcome to EmacsConf 2022, where we get to find out""" start="00:00:00.000" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""just how crazy a text editor can get.""" start="00:00:03.520" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""There were so many interesting talks""" start="00:00:06.240" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""that we couldn't figure out how to fit them in two days,""" start="00:00:08.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""so this year we're experimenting with having two tracks.""" start="00:00:11.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""There's a General track and a Development track,""" start="00:00:14.120" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""but really, you'll probably find""" start="00:00:16.120" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""interesting things on both tracks""" start="00:00:17.960" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""no matter what your level of experience is,""" start="00:00:19.600" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""so don't feel limited to one or the other.""" start="00:00:22.160" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""If we all figure out this track thing together,""" start="00:00:25.080" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""that could mean being able to have even more Emacs talks""" start="00:00:27.000" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""next year, so let's give it a try!""" start="00:00:29.880" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""The best parts of EmacsConf are the conversations.""" start="00:00:32.840" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""The wiki has a page on how to watch and participate,""" start="00:00:35.720" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and I'll give you a quick overview as well.""" start="00:00:38.280" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""You can watch both streams at live.emacsconf.org""" start="00:00:40.840" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""using free and open source software.""" start="00:00:44.000" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""The schedule shows the General track on top""" start="00:00:46.280" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and the Development track on the bottom,""" start="00:00:48.200" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""so you can see what else is going on.""" start="00:00:49.960" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""The track pages have quick shortcuts so that you can""" start="00:00:52.160" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""find out more about talks, open the Etherpads,""" start="00:00:54.560" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and join the Q&A sessions. The watch page has more tips""" start="00:00:57.360" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""on how to make the most of Q&A.""" start="00:01:00.800" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""If you can, please add notes and ask questions""" start="00:01:02.120" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""in the Etherpad for the talk. That makes it easier""" start="00:01:05.760" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""for everyone to share their notes,""" start="00:01:08.520" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and speakers and hosts can read the questions from there.""" start="00:01:10.080" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""We'll copy the notes to the talk pages afterwards.""" start="00:01:13.120" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""We have one pad for each talk this year,""" start="00:01:16.040" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""so you can follow the links to get to the next one""" start="00:01:18.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""or go back to the schedule and get the link from there.""" start="00:01:20.920" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""If you have general feedback about""" start="00:01:23.960" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""the conference itself, please put it in""" start="00:01:25.600" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""pad.emacsconf.org/2022 .""" start="00:01:27.760" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""Internet Relay Chat or IRC can be another great way""" start="00:01:31.600" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""to be part of lots of conversations.""" start="00:01:34.480" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""You can use chat.emacsconf.org to join the IRC channels""" start="00:01:37.280" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""through your web browser. The tabs on the left can help you""" start="00:01:40.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""switch between the different channels.""" start="00:01:43.200" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""There's #emacsconf-gen for the General track""" start="00:01:45.240" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and #emacsconf-dev for the Development track.""" start="00:01:47.720" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""If you need to reach us, you can join #emacsconf-org""" start="00:01:50.240" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""or e-mail emacsconf-org-private@gnu.org.""" start="00:01:53.440" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""You can use #emacsconf for hallway conversations.""" start="00:01:57.880" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""Once again, we're going to be streaming with open captions""" start="00:02:01.360" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""for most of the talks this year, thanks to our speakers and""" start="00:02:03.920" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""captioning volunteers. The captioned talks are indicated""" start="00:02:06.640" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""on the schedule, and with any luck, we'll be posting""" start="00:02:09.920" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""transcripts on talk pages shortly after the talks start.""" start="00:02:12.520" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""If you need additional accommodations, please let us know""" start="00:02:16.120" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""in #emacsconf-org and we'll see""" start="00:02:18.920" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""if we can make things happen.""" start="00:02:20.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""If something goes down, we'll update status.emacsconf.org.""" start="00:02:22.440" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""If it doesn't look like we've noticed yet,""" start="00:02:26.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""please let us know in the #emacsconf-org IRC channel,""" start="00:02:27.800" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""where we will be quietly panicking.""" start="00:02:31.600" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""In all of these conversations, please keep in mind""" start="00:02:34.520" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""our guidelines for conduct. You can find them on the wiki,""" start="00:02:36.960" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and they basically boil down to: please be nice. Thank you!""" start="00:02:39.760" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""We'll be posting the prerecorded videos as soon as possible.""" start="00:02:42.960" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""Assuming things go well, you might be able to check out""" start="00:02:47.520" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""quick replays on the Toobnix channel, which you can""" start="00:02:50.040" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""find on the watch page in the wiki. We'll post the live""" start="00:02:52.720" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""talks and Q&A sessions some time after the conference.""" start="00:02:55.680" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""If you'd like to get an update, you can subscribe to""" start="00:02:58.760" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""the emacsconf-discuss mailing list.""" start="00:03:01.800" video="mainVideo-sat-open" id="subtitle"]]
+[[!template new="1" text="""All right, let's get going.""" start="00:03:05.360" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""Leo Vivier is going to be hosting the general track,""" start="00:03:06.600" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and Amin Bandali will host the development track.""" start="00:03:09.640" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""The other volunteers and I will run around mostly backstage,""" start="00:03:12.400" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""and you'll probably meet us in the closing remarks.""" start="00:03:15.320" video="mainVideo-sat-open" id="subtitle"]]
+[[!template text="""Let's have fun at EmacsConf 2022!""" start="00:03:18.160" video="mainVideo-sat-open" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20sat-open%3A%20Saturday%20opening%20remarks)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/sat-open-before.md b/2022/info/sat-open-before.md
new file mode 100644
index 00000000..89db2e0d
--- /dev/null
+++ b/2022/info/sat-open-before.md
@@ -0,0 +1,15 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><video controls preload="none" id="sat-open-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-sat-open--opening-remarks--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-sat-open--opening-remarks--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-sat-open--opening-remarks--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="sat-open-mainVideo" data="""
+00:00.000 General and Development tracks
+00:32.840 Conversations
+01:02.120 Etherpad
+01:31.600 Internet Relay Chat
+02:01.360 Accessibility and open captions
+02:22.440 status.emacsconf.org, #emacsconf-org
+02:34.520 Guidelines for conduct
+02:42.960 Recordings
+03:05.360 Let's have fun
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sat-open--opening-remarks--main.webm">Download --main.webm (11MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sat-open--opening-remarks--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sat-open--opening-remarks--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/xp2YZmteZe5qgSvwQxfCUS">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/sat-open-nav.md b/2022/info/sat-open-nav.md
new file mode 100644
index 00000000..28900365
--- /dev/null
+++ b/2022/info/sat-open-nav.md
@@ -0,0 +1,6 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Next by track: <a href="/2022/talks/journalism">Emacs journalism (or everything's a nail if you hit it with Emacs)</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/school-after.md b/2022/info/school-after.md
new file mode 100644
index 00000000..6433a51c
--- /dev/null
+++ b/2022/info/school-after.md
@@ -0,0 +1,137 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="school-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Taking notes on a computer can be challenging,""" start="00:00:00.000" video="mainVideo-school" id="subtitle"]]
+[[!template text="""especially if you compare computer notes""" start="00:00:04.880" video="mainVideo-school" id="subtitle"]]
+[[!template text="""with handwritten notes. When you're handwriting,""" start="00:00:08.280" video="mainVideo-school" id="subtitle"]]
+[[!template text="""you don't focus as much on taking those notes.""" start="00:00:11.960" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Well, you don't focus as much on *how* you take the notes,""" start="00:00:16.160" video="mainVideo-school" id="subtitle"]]
+[[!template text="""you more so focus on what you're taking.""" start="00:00:19.560" video="mainVideo-school" id="subtitle"]]
+[[!template text="""You don't get that same experience""" start="00:00:24.120" video="mainVideo-school" id="subtitle"]]
+[[!template text="""if you're writing your notes on a computer.""" start="00:00:27.720" video="mainVideo-school" id="subtitle"]]
+[[!template text="""When writing notes on a computer,""" start="00:00:30.520" video="mainVideo-school" id="subtitle"]]
+[[!template text="""you mostly focus on typing or alignment.""" start="00:00:32.120" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Those are things that are kind of solved already""" start="00:00:38.440" video="mainVideo-school" id="subtitle"]]
+[[!template text="""by certain software such as Org Mode,""" start="00:00:42.160" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which is fantastic when it comes to note-taking,""" start="00:00:45.360" video="mainVideo-school" id="subtitle"]]
+[[!template text="""but I still believe it could be much better.""" start="00:00:48.600" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""That's why I've developed the package called Lectorg.""" start="00:00:51.920" video="mainVideo-school" id="subtitle"]]
+[[!template text="""It's a collection of scripts and snippets which allow you""" start="00:00:56.640" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to improve your note-taking experience on the computer,""" start="00:01:01.800" video="mainVideo-school" id="subtitle"]]
+[[!template text="""of course, making you more focused on the subject""" start="00:01:04.960" video="mainVideo-school" id="subtitle"]]
+[[!template text="""rather than the process of taking notes.""" start="00:01:09.920" video="mainVideo-school" id="subtitle"]]
+[[!template text="""So why use Emacs? Well, again,""" start="00:01:14.440" video="mainVideo-school" id="subtitle"]]
+[[!template text="""if compared with other software,""" start="00:01:16.560" video="mainVideo-school" id="subtitle"]]
+[[!template text="""it has a lot more customizability""" start="00:01:18.720" video="mainVideo-school" id="subtitle"]]
+[[!template text="""and it can also unify pretty much anything you need""" start="00:01:21.800" video="mainVideo-school" id="subtitle"]]
+[[!template text="""in student life or work life into one place.""" start="00:01:24.680" video="mainVideo-school" id="subtitle"]]
+[[!template text="""The problems that Lectorg solves are kind of,""" start="00:01:31.080" video="mainVideo-school" id="subtitle"]]
+[[!template text="""as I mentioned, already solved partially""" start="00:01:35.640" video="mainVideo-school" id="subtitle"]]
+[[!template text="""by Org Mode itself.""" start="00:01:37.880" video="mainVideo-school" id="subtitle"]]
+[[!template text="""What I've done is simply make a bunch of additions""" start="00:01:40.480" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to Org Mode through an external package,""" start="00:01:44.600" video="mainVideo-school" id="subtitle"]]
+[[!template text="""but I've also developed other sub-modules,""" start="00:01:47.360" video="mainVideo-school" id="subtitle"]]
+[[!template text="""one of them being HBH, which allows me""" start="00:01:51.280" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to easily plan out my days HBH, hour by hour,""" start="00:01:54.440" video="mainVideo-school" id="subtitle"]]
+[[!template text="""therefore I can plan out my days on an hourly basis""" start="00:02:01.400" video="mainVideo-school" id="subtitle"]]
+[[!template text="""practically. But I've also built something called Reorg""" start="00:02:04.680" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which, for those of you that are familiar""" start="00:02:09.440" video="mainVideo-school" id="subtitle"]]
+[[!template text="""with the Remarkable tablet, allows you""" start="00:02:12.000" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to integrate notes from your Remarkable into Emacs--""" start="00:02:14.600" video="mainVideo-school" id="subtitle"]]
+[[!template text="""into your Org Mode notes basically.""" start="00:02:20.000" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Now I believe there's already another talk on integrating""" start="00:02:22.440" video="mainVideo-school" id="subtitle"]]
+[[!template text="""handwritten notes into Emacs,""" start="00:02:25.200" video="mainVideo-school" id="subtitle"]]
+[[!template text="""so I won't get too much into that.""" start="00:02:26.920" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""So again, at the heart of Lectorg is Org Mode,""" start="00:02:30.680" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which for those of you that might not be familiar,""" start="00:02:36.080" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Org Mode is one of the best pieces of software""" start="00:02:38.480" video="mainVideo-school" id="subtitle"]]
+[[!template text="""when it comes to basically capturing any sort of text,""" start="00:02:43.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""managing that text, exporting it""" start="00:02:49.040" video="mainVideo-school" id="subtitle"]]
+[[!template text="""into various different formats,""" start="00:02:51.560" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which is perfect for taking notes""" start="00:02:53.960" video="mainVideo-school" id="subtitle"]]
+[[!template text="""because you can either export them,""" start="00:02:57.280" video="mainVideo-school" id="subtitle"]]
+[[!template text="""take them on the go if you don't have access""" start="00:02:59.400" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to your computer all the time,""" start="00:03:02.120" video="mainVideo-school" id="subtitle"]]
+[[!template text="""or you can share them with friends, which...""" start="00:03:03.880" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Well, that is somewhat self-explanatory""" start="00:03:05.840" video="mainVideo-school" id="subtitle"]]
+[[!template text="""in how that can help you or others.""" start="00:03:11.360" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""Now the ecosystem of Lectorg,""" start="00:03:14.920" video="mainVideo-school" id="subtitle"]]
+[[!template text="""it's a bit chaotic as of right now. It's a package itself,""" start="00:03:16.560" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Lectorg.el, which also partially relies on""" start="00:03:21.720" video="mainVideo-school" id="subtitle"]]
+[[!template text="""a collection of Python scripts""" start="00:03:25.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""as I didn't have that much time""" start="00:03:27.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to develop the software strictly in Elisp,""" start="00:03:30.040" video="mainVideo-school" id="subtitle"]]
+[[!template text="""but it still gets the job done,""" start="00:03:34.120" video="mainVideo-school" id="subtitle"]]
+[[!template text="""and I believe that there is no speed hindrance.""" start="00:03:37.600" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Now to further improve Lectorg,""" start="00:03:43.720" video="mainVideo-school" id="subtitle"]]
+[[!template text="""I'd love to ask for your help""" start="00:03:46.520" video="mainVideo-school" id="subtitle"]]
+[[!template text="""if you have encountered any sort of issue""" start="00:03:49.280" video="mainVideo-school" id="subtitle"]]
+[[!template text="""when it comes to note-taking or academics in general,""" start="00:03:53.080" video="mainVideo-school" id="subtitle"]]
+[[!template text="""I would love to integrate your solution""" start="00:03:56.840" video="mainVideo-school" id="subtitle"]]
+[[!template text="""(or if you don't have one, we can come up with one)""" start="00:03:59.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""into Lectorg. Also, if anyone would be willing""" start="00:04:04.400" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to transcribe those Python scripts""" start="00:04:07.520" video="mainVideo-school" id="subtitle"]]
+[[!template text="""into a more Lisp approach, then that'd be fabulous.""" start="00:04:13.440" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""So let's look at how Lectorg works in practice.""" start="00:04:18.680" video="mainVideo-school" id="subtitle"]]
+[[!template text="""We'll look at two examples,""" start="00:04:24.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""one of taking notes for math""" start="00:04:26.040" video="mainVideo-school" id="subtitle"]]
+[[!template text="""and the other for business, I believe.""" start="00:04:28.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Now I have to mention that all of the things""" start="00:04:33.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""that I do in that example""" start="00:04:36.040" video="mainVideo-school" id="subtitle"]]
+[[!template text="""do not cover all the functions and features of Lectorg.""" start="00:04:38.280" video="mainVideo-school" id="subtitle"]]
+[[!template text="""There is decent documentation on the Lectorg GitLab page,""" start="00:04:43.920" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""so do check that out for further reference.""" start="00:04:49.160" video="mainVideo-school" id="subtitle"]]
+[[!template text="""For our first example, we're going to start off""" start="00:04:57.520" video="mainVideo-school" id="subtitle"]]
+[[!template text="""with taking notes for statistics. Now what I'm doing here""" start="00:04:59.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""is opening Lectorg Hub, which allows me""" start="00:05:04.240" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to associate certain resources with this particular course.""" start="00:05:06.480" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Here, I've opened the book which I have associated""" start="00:05:10.880" video="mainVideo-school" id="subtitle"]]
+[[!template text="""with this course, and I'm going to go ahead""" start="00:05:15.680" video="mainVideo-school" id="subtitle"]]
+[[!template text="""and start taking some notes""" start="00:05:19.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""on the cumulative distribution function here.""" start="00:05:22.520" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Now what OrgMode allows you to do""" start="00:05:26.640" video="mainVideo-school" id="subtitle"]]
+[[!template text="""is integrate LaTeX into regular text quite easily,""" start="00:05:30.000" video="mainVideo-school" id="subtitle"]]
+[[!template text="""preview it, and then later export it.""" start="00:05:34.600" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Now here we can see the first usage of a snippet !m,""" start="00:05:38.240" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which inserts a block for entering a LaTeX equation.""" start="00:05:48.600" video="mainVideo-school" id="subtitle"]]
+[[!template text="""What I'm trying to do here""" start="00:05:59.640" video="mainVideo-school" id="subtitle"]]
+[[!template text="""is take a screenshot of the figures in the book,""" start="00:06:00.840" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which is done with org-download (not a part of Lectorg,""" start="00:06:05.000" video="mainVideo-school" id="subtitle"]]
+[[!template text="""but a very useful tool). Now that is it for math.""" start="00:06:10.680" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""Let's look at something a bit different.""" start="00:06:15.800" video="mainVideo-school" id="subtitle"]]
+[[!template text="""We're going to take a look at business,""" start="00:06:18.040" video="mainVideo-school" id="subtitle"]]
+[[!template text="""more specifically, taking notes on the product lifecycle.""" start="00:06:20.200" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Here on the left, I have certain notes from class""" start="00:06:24.520" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which are not complete.""" start="00:06:27.560" video="mainVideo-school" id="subtitle"]]
+[[!template text="""As you can see at the top, there's a comment""" start="00:06:31.080" video="mainVideo-school" id="subtitle"]]
+[[!template text="""also done using Lectorg which puts this file into a TODO""" start="00:06:34.680" video="mainVideo-school" id="subtitle"]]
+[[!template text="""so that I can get back to it whenever I want""" start="00:06:42.720" video="mainVideo-school" id="subtitle"]]
+[[!template text="""or schedule this TODO.""" start="00:06:46.720" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Now I'm taking notes on a video lecture,""" start="00:06:48.880" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which I've opened, again, through Lectorg hub.""" start="00:06:54.440" video="mainVideo-school" id="subtitle"]]
+[[!template text="""As you can see right now, I'm inserting""" start="00:07:07.640" video="mainVideo-school" id="subtitle"]]
+[[!template text="""another snippet for Plantuml,""" start="00:07:09.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""which immediately exports it to a file,""" start="00:07:12.480" video="mainVideo-school" id="subtitle"]]
+[[!template text="""and again I'm going to be using org-download here""" start="00:07:15.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""to insert another figure at the top.""" start="00:07:19.800" video="mainVideo-school" id="subtitle"]]
+[[!template new="1" text="""I hope this demonstration was useful.""" start="00:07:25.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Once again, it did not demonstrate everything.""" start="00:07:33.360" video="mainVideo-school" id="subtitle"]]
+[[!template text="""You can find more on GitLab.""" start="00:07:35.600" video="mainVideo-school" id="subtitle"]]
+[[!template text="""I hope some of you might consider using Lectorg""" start="00:07:37.840" video="mainVideo-school" id="subtitle"]]
+[[!template text="""in your academic life or perhaps even""" start="00:07:44.400" video="mainVideo-school" id="subtitle"]]
+[[!template text="""in some areas of business. I believe that is""" start="00:07:46.840" video="mainVideo-school" id="subtitle"]]
+[[!template text="""everything I have to demonstrate for today.""" start="00:07:51.320" video="mainVideo-school" id="subtitle"]]
+[[!template text="""Thank you for listening to this talk,""" start="00:07:53.760" video="mainVideo-school" id="subtitle"]]
+[[!template text="""have a nice rest of the day.""" start="00:07:57.440" video="mainVideo-school" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [daniel@alves.world](mailto:daniel@alves.world?subject=Comment%20for%20EmacsConf%202022%20school%3A%20Back%20to%20school%20with%20Emacs)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/school-before.md b/2022/info/school-before.md
new file mode 100644
index 00000000..536648a3
--- /dev/null
+++ b/2022/info/school-before.md
@@ -0,0 +1,16 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+Daniel Rosel demonstrates Lectorg, a package that he wrote to make note taking faster and simpler. Afterwards, he will handle questions over IRC.
+
+<div class="vid"><video controls preload="none" id="school-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="school-mainVideo" data="""
+00:00.000 Introduction
+00:51.920 Packages: Lectorg, Reorg, HBH
+02:30.680 Org Mode
+03:14.920 The ecosystem of Lectorg: Elisp and Python
+04:18.680 How Lectorg works
+04:49.160 Math
+06:15.800 Business
+07:25.760 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.webm">Download --main.webm (22MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.opus">Download --main.opus (6.3MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-school--back-to-school-with-emacs--daniel-rosel--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/tM8H4Dj2hZ69CwWMFStZqX">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/school-nav.md b/2022/info/school-nav.md
new file mode 100644
index 00000000..daf22b0e
--- /dev/null
+++ b/2022/info/school-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/journalism">Emacs journalism (or everything's a nail if you hit it with Emacs)</a>
+Next by track: <a href="/2022/talks/treesitter">Tree-sitter beyond syntax highlighting</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/science-after.md b/2022/info/science-after.md
new file mode 100644
index 00000000..148bde2b
--- /dev/null
+++ b/2022/info/science-after.md
@@ -0,0 +1,399 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="science-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello everyone, I'm Vidianos.""" start="00:00:00.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Today I'm going to show you""" start="00:00:02.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""how I write and organize""" start="00:00:03.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""my literature notes using Emacs.""" start="00:00:04.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I take my notes using Zettelkasten,""" start="00:00:06.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which you may or may not have heard.""" start="00:00:08.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It is about taking small atomic notes""" start="00:00:11.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and linking them one another""" start="00:00:13.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to create your so-called second brain.""" start="00:00:15.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Here is mine.""" start="00:00:17.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is a graph of all the notes""" start="00:00:19.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I have accumulated the last few years.""" start="00:00:20.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It has various types of notes,""" start="00:00:22.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but we're mainly going to focus on""" start="00:00:25.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""literature notes today.""" start="00:00:25.960" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""Here are the contents of my talk.""" start="00:00:28.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""We're going to start""" start="00:00:29.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""with bibliography management,""" start="00:00:30.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is how I take bibliography""" start="00:00:31.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""from the web and import it to Emacs.""" start="00:00:33.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Then we're going to talk about""" start="00:00:35.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""how I create literature notes""" start="00:00:37.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""using a custom org-roam-bibtex template I have.""" start="00:00:38.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And after talking about that,""" start="00:00:42.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""we can talk about how I write literature notes,""" start="00:00:43.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is through annotating an article""" start="00:00:46.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""using org-noter. Org-noter is a package""" start="00:00:48.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that allows you to annotate PDFs""" start="00:00:51.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""using the Org format""" start="00:00:53.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and creates a supplementary Org file to your PDF.""" start="00:00:55.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Then we're going to talk about""" start="00:00:59.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""adding the literature to your Zettelkasten,""" start="00:01:00.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is a simple but important topic,""" start="00:01:03.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and how you can write permanent notes""" start="00:01:06.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""based on the info you obtain from this literature.""" start="00:01:08.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Lastly, we're going to focus on""" start="00:01:11.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""the organization problem""" start="00:01:13.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""one might find when having a lot of literature""" start="00:01:15.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""for an assignment or an article or something,""" start="00:01:17.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and how I have tried to solve this""" start="00:01:21.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""with my package Zetteldesk.""" start="00:01:22.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This isn't the perfect solution,""" start="00:01:24.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but it is what I have, and I really like it.""" start="00:01:26.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Finally, we're going to talk about""" start="00:01:29.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""how to compose the final article""" start="00:01:30.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that you want to produce""" start="00:01:33.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""using this literature""" start="00:01:35.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""with the technique described""" start="00:01:36.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""in the rest of this talk.""" start="00:01:38.640" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""So let's begin the talk""" start="00:01:40.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""with bibliography management.""" start="00:01:42.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Zotero is the bibliography manager I use.""" start="00:01:44.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It is very simple to store articles with it,""" start="00:01:47.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it exports to .bib,""" start="00:01:49.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""integrating with packages""" start="00:01:50.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""such as org-roam-bibtex and ivy-bibtex.""" start="00:01:52.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""When researching, I typically find""" start="00:01:54.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""a long list of articles from a search engine.""" start="00:01:56.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I open the titles which have interesting titles""" start="00:02:00.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""through their abstracts""" start="00:02:03.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and save to Zotero those whose abstracts""" start="00:02:05.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""are the most relevant to what I want.""" start="00:02:07.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""From these articles,""" start="00:02:10.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I typically won't read all of them""" start="00:02:11.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because they're a lot,""" start="00:02:13.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but I will select a few,""" start="00:02:14.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""once I have collected as many as I want.""" start="00:02:17.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Zotero acts as a way to store everything""" start="00:02:21.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that might be interesting,""" start="00:02:24.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""while Emacs and my Zettelkasten""" start="00:02:25.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""stores everything that is definitely interesting,""" start="00:02:28.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and I have read it already.""" start="00:02:30.960" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""And then we can move to""" start="00:02:35.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""how I create literature notes.""" start="00:02:36.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I set the default action of ivy-bibtex""" start="00:02:38.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to ivy-bibtex-edit-notes,""" start="00:02:41.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which will prompt-- which""" start="00:02:43.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""with org-roam-bibtex-mode active,""" start="00:02:44.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""prompts you for an org-capture template""" start="00:02:46.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""when selecting something""" start="00:02:48.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""if the node doesn't exist,""" start="00:02:50.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""or takes you to the existing node.""" start="00:02:52.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And obviously you need to have this here,""" start="00:02:54.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to set the default action""" start="00:02:58.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that was already there""" start="00:03:00.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to a letter.""" start="00:03:02.600" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""Then we can move to my org-roam reference template,""" start="00:03:04.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""using org-roam-bibtex.""" start="00:03:08.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This isn't so complicated,""" start="00:03:11.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but it has some important stuff""" start="00:03:12.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I want to highlight.""" start="00:03:14.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Save it to the ref directory,""" start="00:03:14.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so I can remember where it is,""" start="00:03:17.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it's classified as a literature note.""" start="00:03:19.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The file name is the cite key,""" start="00:03:23.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is easy and small,""" start="00:03:25.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but the title is the actual article's title.""" start="00:03:27.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Give it a tag of the entry-type;""" start="00:03:30.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""this is typically &quot;article,&quot;""" start="00:03:32.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but it's easy to sort things this way""" start="00:03:35.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because not all literature notes are articles.""" start="00:03:37.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And then give the keywords""" start="00:03:41.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that are given by Zotero, because why not?""" start="00:03:43.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Tags here are tags from Zettelkasten.""" start="00:03:47.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""These are the links to""" start="00:03:51.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""other files which are relevant,""" start="00:03:53.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but its initialization is empty, obviously.""" start="00:03:55.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And then this heading is where""" start="00:03:58.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""all the magic happens.""" start="00:03:59.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The name is just not really so relevant;""" start="00:04:00.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I just needed something that made sense.""" start="00:04:04.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The properties are what matters,""" start="00:04:07.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and mainly this one here.""" start="00:04:10.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The ${file} attribute finds""" start="00:04:12.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""the file of this specific literature""" start="00:04:18.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and makes sure that org-noter works""" start="00:04:24.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""by default here.""" start="00:04:27.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""As I'm going to show you in a moment,""" start="00:04:29.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""this way [of] initializing the literature note,""" start="00:04:32.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""org-noter works by default.""" start="00:04:34.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""That's all, basically, for the template.""" start="00:04:37.000" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""This is the point of the talk""" start="00:04:40.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""where we reach the first demo.""" start="00:04:42.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is about opening ivy-bibtex,""" start="00:04:44.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""selecting an article I want to annotate,""" start="00:04:47.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""initializing the literature note.""" start="00:04:50.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""We can see that everything""" start="00:04:53.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""is inserted in for me,""" start="00:04:55.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and if I open org-noter on this heading,""" start="00:04:56.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""it opens the article, as expected.""" start="00:05:01.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I can read the article,""" start="00:05:03.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I can say I want to""" start="00:05:06.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""annotate something here.""" start="00:05:08.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Obviously, annotation is not that simple as here,""" start="00:05:20.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but I don't really have the time""" start="00:05:24.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to actually annotate an article live.""" start="00:05:26.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""But you can keep going, and it's a good setup.""" start="00:05:28.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Then close org-noter,""" start="00:05:34.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and let's go presentation again.""" start="00:05:39.880" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""Moving on, this section is some stuff""" start="00:05:40.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""about my annotation process.""" start="00:05:44.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""As I said, there is not enough time for me""" start="00:05:45.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to actually annotate an article live,""" start="00:05:49.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but here are some things about it.""" start="00:05:51.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""First, is that I annotate with org-noter,""" start="00:05:53.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which I absolutely love.""" start="00:05:55.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It is great for annotations""" start="00:05:56.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because you do them in org,""" start="00:05:59.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is an amazing format""" start="00:06:02.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and gives you a lot of flexibility,""" start="00:06:03.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""such as adding to the Zettelkasten,""" start="00:06:05.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""being initialized by a capture template,""" start="00:06:07.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and other things.""" start="00:06:11.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""But also, you don't need to look for""" start="00:06:13.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""the notes inside the PDF,""" start="00:06:15.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is a problem you can have""" start="00:06:17.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""if you annotate on the PDF,""" start="00:06:19.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it is very annoying in my opinion.""" start="00:06:20.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""So I prefer having these notes,""" start="00:06:23.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and I can only focus on them,""" start="00:06:26.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but I can also see where they refer.""" start="00:06:27.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The other scenarios are not so good.""" start="00:06:29.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Annotating on the PDF,""" start="00:06:33.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you search for it,""" start="00:06:35.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and if you don't know which section it refers to,""" start="00:06:36.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""then you need to look about it,""" start="00:06:41.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and that is very tiring.""" start="00:06:42.760" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""Also, I am always annotating in English.""" start="00:06:44.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is not my mother tongue,""" start="00:06:48.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but it helps me avoid""" start="00:06:50.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""the necessary mental overhead""" start="00:06:52.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""of translating while reading.""" start="00:06:53.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I want to pay attention to what I read""" start="00:06:55.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and not to translate stuff.""" start="00:06:57.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I will translate later.""" start="00:06:59.680" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""And when finishing an article,""" start="00:07:02.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I write a mini-abstract myself,""" start="00:07:05.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which contains what I think about the article.""" start="00:07:07.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It doesn't need to be much,""" start="00:07:10.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""it's usually like 3 or 4 paragraphs,""" start="00:07:11.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it shows things that are useful in the article,""" start="00:07:14.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and what is mentioned that matters to me.""" start="00:07:18.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""So I can look back at it,""" start="00:07:21.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it is very easy for me to find""" start="00:07:22.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""what I got from this article,""" start="00:07:24.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so where I will cite it on my actual project.""" start="00:07:26.600" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""Then last thing you need to do""" start="00:07:30.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""is add a note to your Zettelkasten.""" start="00:07:33.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is very easy due to it being in an org format.""" start="00:07:35.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""You can just have it in the org-roam directory,""" start="00:07:38.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which it automatically goes to,""" start="00:07:41.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and link it to other relevant notes,""" start="00:07:43.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is its index""" start="00:07:46.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because everything in my Zettelkasten""" start="00:07:48.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""(at least) has an index,""" start="00:07:50.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but also every other permanent note""" start="00:07:51.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""whose contents are in one way or another""" start="00:07:54.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""mentioned inside the article.""" start="00:07:56.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This way the article is in a network with notes""" start="00:07:58.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that are similar to it.""" start="00:08:00.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Then we move on to the second demo,""" start="00:08:02.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is about a full-fledged literature note.""" start="00:08:05.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""We can go on org-roam-node-find,""" start="00:08:08.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""search for references,""" start="00:08:11.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""go to this, and you can see""" start="00:08:13.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""it is linked to other notes.""" start="00:08:15.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And here is the mini-abstract,""" start="00:08:17.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and here are my notes on it.""" start="00:08:20.040" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""The last thing you need to do""" start="00:08:21.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""when creating a literature note,""" start="00:08:27.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""is obviously create permanent notes""" start="00:08:29.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""based on what you read.""" start="00:08:31.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""If you never create these literature notes,""" start="00:08:32.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you will never get new information.""" start="00:08:35.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""So for your Zettelkasten to grow,""" start="00:08:37.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you need to create such notes.""" start="00:08:40.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This means that the subject you are researching""" start="00:08:42.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""is not just literature notes""" start="00:08:45.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but has well-structured permanent notes,""" start="00:08:47.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is what you will actually read.""" start="00:08:50.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""You typically only read literature notes""" start="00:08:52.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to see what gets cited where.""" start="00:08:55.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""What you will mostly read""" start="00:08:57.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""is these permanent notes""" start="00:08:58.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that you create from this knowledge.""" start="00:08:59.840" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""So finally we are at the last part of the talk,""" start="00:09:01.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which is about organizing literature notes.""" start="00:09:05.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And this is in my opinion""" start="00:09:07.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""the most interesting part""" start="00:09:09.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because it is very unique.""" start="00:09:10.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It uses a package I wrote myself,""" start="00:09:12.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it doesn't have as much usage""" start="00:09:14.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""as the rest of the things I described so far.""" start="00:09:18.320" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""So what is the problem you might find?""" start="00:09:21.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Indeed, if you read a lot of things,""" start="00:09:24.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you have a large collection of notes,""" start="00:09:27.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and it's not the only thing you will think about.""" start="00:09:30.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""However, you do need to""" start="00:09:33.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""justify everything with citations,""" start="00:09:36.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so you need to remember everything""" start="00:09:37.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you read in these notes.""" start="00:09:39.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""You have done a lot of work,""" start="00:09:41.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but there is still a lot for you""" start="00:09:43.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to reach your final manuscript.""" start="00:09:45.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Except if there was a handy little way""" start="00:09:47.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to combine everything""" start="00:09:50.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and sort it in a very easy way.""" start="00:09:52.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Well, there is,""" start="00:09:55.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and I think it came out pretty well.""" start="00:09:56.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It's zetteldesk.el.""" start="00:10:00.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It was inspired by this quote here""" start="00:10:01.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""from How to Take Smart Notes.""" start="00:10:05.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Sönke Ahrens here talked about a desktop,""" start="00:10:06.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which you have all the literature""" start="00:10:09.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you want in that desktop,""" start="00:10:13.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and you try to bring it in order.""" start="00:10:16.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And by doing that,""" start="00:10:20.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you can improve your ideas""" start="00:10:22.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and have a structure""" start="00:10:24.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so that your manuscript will then be""" start="00:10:27.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""very, very easy to write.""" start="00:10:30.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And as I say here, in trying to do this,""" start="00:10:33.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I made something much more general""" start="00:10:36.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""than it needed to be, so yeah,""" start="00:10:38.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you can use it for many other things.""" start="00:10:41.560" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""But before I show you some things about it,""" start="00:10:43.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I want to introduce you to what a desktop is.""" start="00:10:46.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It's essentially a collection of the knowledge""" start="00:10:49.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you want to be able to see.""" start="00:10:53.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""You add things to your Zetteldesk,""" start="00:10:54.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and using filter functions,""" start="00:10:58.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you only see these notes and nothing else,""" start="00:11:01.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which in my opinion is very handy.""" start="00:11:04.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""So having said that,""" start="00:11:07.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""we can see these things in action""" start="00:11:10.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""for the final demo of the talk.""" start="00:11:12.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is the third one.""" start="00:11:14.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I will go to an index file of mine.""" start="00:11:15.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is 3D printing,""" start="00:11:20.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""an assignment I had last semester.""" start="00:11:21.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And this has 28 backlinks,""" start="00:11:23.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so a lot of things that I looked at""" start="00:11:27.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""for this assignment.""" start="00:11:30.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I can say I want to add""" start="00:11:31.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""the current note's backlinks to the Zetteldesk,""" start="00:11:33.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and now I have a filtered version""" start="00:11:35.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""of org-roam-node-find defined,""" start="00:11:38.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which only lists these 29 notes.""" start="00:11:40.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Very nice, right?""" start="00:11:42.000" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""I can also filter just the literature notes,""" start="00:11:45.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which can also use other UIs beside org-roam,""" start="00:11:49.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""such as, for example,""" start="00:11:56.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""one I use a lot is the ivy-bibtex command.""" start="00:11:57.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This takes a lot of time,""" start="00:12:00.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""much longer than the org-roam one,""" start="00:12:03.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but has them in this UI,""" start="00:12:04.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which in a lot of cases is more useful for me.""" start="00:12:06.480" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""The other very important thing is inserting these.""" start="00:12:09.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""For example, say I want to insert a permanent note,""" start="00:12:15.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""such as this.""" start="00:12:20.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Its title will become a top-level heading,""" start="00:12:21.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and everything else will be inserted as expected.""" start="00:12:25.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""But the most important thing for us""" start="00:12:29.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""is inserting literature, right?""" start="00:12:35.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is done with this command,""" start="00:12:37.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and let's say I want to insert this.""" start="00:12:39.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The title again becomes a heading,""" start="00:12:42.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and this is the article title also.""" start="00:12:48.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I store the cite key here,""" start="00:12:50.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and everything else about it is also here.""" start="00:12:53.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And I can add others,""" start="00:12:56.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""for example, this and this.""" start="00:12:58.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And we have all of them here.""" start="00:13:01.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I see it says this is the basic,""" start="00:13:09.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so let's put it at the top.""" start="00:13:11.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And then maybe I want to put this last.""" start="00:13:12.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""And this way, you can sort things,""" start="00:13:18.840" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and typically, on the other side,""" start="00:13:24.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I have a manuscript,""" start="00:13:26.320" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and I look at what order""" start="00:13:27.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I want to have things in""" start="00:13:30.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and sort the articles and the permanent notes""" start="00:13:31.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""in a way so that each section can have""" start="00:13:34.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""its own citations and its own notes,""" start="00:13:38.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""which makes writing, again, very easy, in my opinion.""" start="00:13:41.800" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""Finally, let's go to composing the final article.""" start="00:13:46.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This is our goal: we wrote and organized""" start="00:13:53.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""all these literature notes""" start="00:13:57.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to put them in your final project.""" start="00:13:58.360" video="mainVideo-science" id="subtitle"]]
+[[!template text="""This might be an assignment""" start="00:14:00.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""or an actual scientific article.""" start="00:14:01.880" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It is apparent that you have done""" start="00:14:04.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""a lot of work for this so far,""" start="00:14:07.480" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but you don't need to do a lot more.""" start="00:14:09.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""In my opinion, this is the easiest part""" start="00:14:12.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""of the whole workflow.""" start="00:14:14.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""People consider final article composition hard,""" start="00:14:15.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but if you've done all these steps,""" start="00:14:19.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you already have everything you want""" start="00:14:21.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""to add in the article from your notes.""" start="00:14:23.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""It's already there,""" start="00:14:25.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""a lot of things are copy-pasted,""" start="00:14:27.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""it's all in a coherent order,""" start="00:14:30.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""connections are to an extent already there,""" start="00:14:34.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and you know what citation goes where,""" start="00:14:38.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so you can justify everything you write.""" start="00:14:41.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""The actual draft isn't there,""" start="00:14:44.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but it is very easy""" start="00:14:46.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because now you just write things as you see them""" start="00:14:48.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""in your desktop and connect them.""" start="00:14:52.600" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Connections are basic--""" start="00:14:54.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""connections and making the article good, obviously,""" start="00:14:56.960" video="mainVideo-science" id="subtitle"]]
+[[!template text="""are basically the only thing you need to worry,""" start="00:14:59.440" video="mainVideo-science" id="subtitle"]]
+[[!template text="""but those are very important""" start="00:15:02.400" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because others will only see the final manuscript,""" start="00:15:05.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so if that's not good,""" start="00:15:09.040" video="mainVideo-science" id="subtitle"]]
+[[!template text="""then the whole assignment is not good, obviously.""" start="00:15:11.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""So it's not like your work is done,""" start="00:15:14.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""it's just very easy.""" start="00:15:17.520" video="mainVideo-science" id="subtitle"]]
+[[!template new="1" text="""And with that, I hope you liked my talk""" start="00:15:19.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""because it is coming to an end now.""" start="00:15:23.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I want to thank you for your time;""" start="00:15:25.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I hope you enjoyed it.""" start="00:15:27.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""You can feel free to email me at this address;""" start="00:15:29.680" video="mainVideo-science" id="subtitle"]]
+[[!template text="""it has also been on every slide since the beginning.""" start="00:15:32.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I also have the GitHub for zetteldesk.el here,""" start="00:15:35.640" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and I will be available for questions.""" start="00:15:40.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I will be viewing both the pad and the IRC""" start="00:15:42.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and will do a live Q&A after this. See you.""" start="00:15:45.000" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Actually, before I go,""" start="00:15:49.160" video="mainVideo-science" id="subtitle"]]
+[[!template text="""let's show you the GitHub for zetteldesk.el.""" start="00:15:51.280" video="mainVideo-science" id="subtitle"]]
+[[!template text="""Here's the README; if you're interested on it,""" start="00:15:54.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you can see more about it,""" start="00:15:57.120" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and also I have a very in-depth wiki about it""" start="00:15:58.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""with 11 pages, and talking about everything""" start="00:16:02.560" video="mainVideo-science" id="subtitle"]]
+[[!template text="""that happens here.""" start="00:16:06.520" video="mainVideo-science" id="subtitle"]]
+[[!template text="""A lot of what we discussed is in this section""" start="00:16:08.080" video="mainVideo-science" id="subtitle"]]
+[[!template text="""about literature notes.""" start="00:16:11.760" video="mainVideo-science" id="subtitle"]]
+[[!template text="""These documents go a lot more in-depth""" start="00:16:12.920" video="mainVideo-science" id="subtitle"]]
+[[!template text="""in how Zetteldesk works, and also how to use it,""" start="00:16:17.200" video="mainVideo-science" id="subtitle"]]
+[[!template text="""so if you're interested, feel free to read them,""" start="00:16:22.800" video="mainVideo-science" id="subtitle"]]
+[[!template text="""and if you have any problems,""" start="00:16:27.720" video="mainVideo-science" id="subtitle"]]
+[[!template text="""you can open an issue about it;""" start="00:16:30.240" video="mainVideo-science" id="subtitle"]]
+[[!template text="""I will be very active. Thank you.""" start="00:16:31.840" video="mainVideo-science" id="subtitle"]]
+
+
+
+Captioner: hannah
+
+Questions or comments? Please e-mail [vidianosgiannitsis@gmail.com](mailto:vidianosgiannitsis@gmail.com?subject=Comment%20for%20EmacsConf%202022%20science%3A%20Writing%20and%20organizing%20literature%20notes%20for%20scientific%20writing)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/science-before.md b/2022/info/science-before.md
new file mode 100644
index 00000000..5dd6ce02
--- /dev/null
+++ b/2022/info/science-before.md
@@ -0,0 +1,58 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Vidianos Giannitsis shares how he uses Org Roam, org-noter, and zetteldesk.el to manage his literature notes and write articles. Afterwards, he will handle questions over BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="science">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect stroke-width="3" x="164" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 17-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-science>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T15:45:00Z" end="2022-12-03T16:05:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~10:45 AM - 11:05 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~9:45 AM - 10:05 AM CST (US/Central)<br />Saturday, Dec 3 2022, ~8:45 AM - 9:05 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~7:45 AM - 8:05 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~3:45 PM - 4:05 PM UTC <br />Saturday, Dec 3 2022, ~4:45 PM - 5:05 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~5:45 PM - 6:05 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~9:15 PM - 9:35 PM IST (Asia/Kolkata)<br />Saturday, Dec 3 2022, ~11:45 PM - 12:05 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~12:45 AM - 1:05 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="science-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="science-mainVideo" data="""
+00:00.000 My second brain
+00:28.320 Contents of the talk
+01:40.560 Bibliography management
+02:35.200 Creating literature notes: ivy-bibtex-edit-notes
+03:04.960 org-roam reference template
+04:40.160 Demo
+05:40.840 Annotating with org-noter
+06:44.240 Annotating in English
+07:02.120 Afterthoughts on an article
+07:30.200 Adding a note
+08:21.480 Creating permanent notes from reference material
+09:01.680 The organization problem
+09:21.520 zetteldesk.el
+10:43.600 The zetteldesk-desktop
+11:45.040 Filtering with ivy-bibtex
+12:09.840 Inserting literature
+13:46.200 Composing the final article
+15:19.160 Thanks
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.webm">Download --main.webm (121MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.org">Download --main.org</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/v8ypuDbDai4WJYu5CbVRYc">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="science-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="science-qanda" data="""
+00:00.000 Introduction
+00:24.000 Q1 - Do you use flipping notes and do you keep them in org-roam?
+03:21.000 Q2 - Does it work only for PDFs or does it work for more formats?
+06:00.000 Q3 - Why use OrgNoter in place of Zotero PDF Reader?
+07:04.000 Q4 - Thoughts on the future of Zettelkasten
+08:16.000 Q4.5 - Collaborative Zettelkasten notes
+12:03.000 Q5 - How do you find a way to get a nice overview of multiple notes to rearrange them?
+15:26.000 Q6 - Can we use Zettelkasten for coding too?
+18:29.000 Q7 - Is Zetteldesk available in Melpa? - Yes
+19:33.000 Conclusion - thoughts about Zettelkasten
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="science-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.webm">Download --answers.webm (13MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--answers.opus">Download --answers.opus (7.2MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/science-nav.md b/2022/info/science-nav.md
new file mode 100644
index 00000000..3bde0317
--- /dev/null
+++ b/2022/info/science-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/lspbridge">lsp-bridge: a smooth-as-butter asynchronous LSP client</a>
+Next by track: <a href="/2022/talks/asmblox">asm-blox: a game based on WebAssembly that no one asked for</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/sqlite-after.md b/2022/info/sqlite-after.md
new file mode 100644
index 00000000..974f0328
--- /dev/null
+++ b/2022/info/sqlite-after.md
@@ -0,0 +1,451 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="sqlite-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello. I'm Andrew Hyatt. I've been working on Emacs,""" start="00:00:00.000" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""with Emacs, and to some extent""" start="00:00:08.556" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""on Emacs for a while. I've written the WebSockets library""" start="00:00:10.540" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and Emacs calc tutorials. I've enjoyed use of""" start="00:00:15.273" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""many of everyone's incredible packages.""" start="00:00:20.046" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""So my thesis for this talk, why I'm giving this talk,""" start="00:00:24.640" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""is that I'm interested in SQLite.""" start="00:00:27.133" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think we should be exploring SQLite for applications""" start="00:00:29.061" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""in ways I think the community has shied away from.""" start="00:00:34.954" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'd like to introduce the triples package as a way,""" start="00:00:37.483" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""both easy and with interesting functionality,""" start="00:00:41.951" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that will allow us to build extensible databases""" start="00:00:47.665" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""in a way that is, I think,""" start="00:00:49.154" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""a little bit unusual and perhaps compelling, I hope.""" start="00:00:52.583" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""So first of all, why SQLite?""" start="00:00:56.220" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Why is this good? Well, SQLite is now built into Emacs.""" start="00:00:59.227" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""So you get a few things out of this when you use it for data.""" start="00:01:06.080" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""First of all, it's a database.""" start="00:01:12.217" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's extremely good for data, of course.""" start="00:01:14.580" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""There's a simplicity to data manipulation""" start="00:01:16.370" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""using a database, compared to data manipulation,""" start="00:01:19.919" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that is, manipulating data in a text file.""" start="00:01:22.028" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Text files are really not built for data.""" start="00:01:25.197" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""So when typically when you need to do this,""" start="00:01:31.034" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""like I know Org Mode is--""" start="00:01:33.140" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which I'm a huge, huge Org Mode fan--""" start="00:01:35.027" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it's all about sort of data in text.""" start="00:01:38.117" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It does work, but you certainly would be""" start="00:01:41.045" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""hard pressed to make sweeping changes""" start="00:01:45.376" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to your database that is represented in text.""" start="00:01:47.360" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's just not well suited for this sort of thing.""" start="00:01:51.954" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It would take a long time,""" start="00:01:53.061" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""where the speed of SQL is incredibly impressive.""" start="00:01:54.964" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think certainly Emacs is not known""" start="00:02:00.220" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""for being extremely speedy.""" start="00:02:04.430" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think the overuse of text""" start="00:02:06.753" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""is part of this. Of course, text and using text,""" start="00:02:11.906" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""using files has awesome advantages as well.""" start="00:02:14.614" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'm really here to talk about""" start="00:02:18.468" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the other side of the coin, right?""" start="00:02:20.511" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Everyone can judge""" start="00:02:22.718" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""those advantages and disadvantages""" start="00:02:23.962" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and make their own trade-offs,""" start="00:02:24.646" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but I want to kind of""" start="00:02:25.417" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""make the pitch for SQLite.""" start="00:02:26.021" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""So let's talk about the triples package.""" start="00:02:29.870" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The triples package is a package""" start="00:02:32.860" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that is designed to give you a very generic schema.""" start="00:02:35.489" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You don't have to do,""" start="00:02:40.420" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""for most of the common operations,""" start="00:02:42.006" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""you don't have to write SQL yourself.""" start="00:02:43.292" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""A lot of stuff is built in""" start="00:02:45.517" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and is based on a very generic schema.""" start="00:02:47.925" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That is, it's a single table.""" start="00:02:51.036" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That table has, of course, fixed schema.""" start="00:02:53.840" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It basically has three columns.""" start="00:02:55.230" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It actually has four columns.""" start="00:02:57.479" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""In this talk, I'm not going to get into""" start="00:03:00.868" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the fourth column and why, but it's useful.""" start="00:03:01.194" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""So the three columns are subject, predicate,""" start="00:03:04.124" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and object. This is what it's related to""" start="00:03:07.711" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""what we call an RDF format.""" start="00:03:10.362" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""These things basically describe a link.""" start="00:03:13.909" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The link is from the subject to the object.""" start="00:03:17.140" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The link type is a predicate.""" start="00:03:20.008" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That sounds overly theoretical,""" start="00:03:23.956" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but the point is that you can describe""" start="00:03:26.086" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""a lot of things with this format.""" start="00:03:28.033" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You probably describe everything with it.""" start="00:03:32.006" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's very simple because the schema is fixed.""" start="00:03:33.330" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's only this kind of data. That means""" start="00:03:39.227" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""for your application, you define a schema""" start="00:03:42.774" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""in subject, predicate, object format.""" start="00:03:44.140" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That defines what data you can use,""" start="00:03:47.327" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""what types there are, what properties they have,""" start="00:03:50.073" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""how you can use the system,""" start="00:03:56.070" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and what is legal to do. And this is stored as data.""" start="00:03:57.215" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think as Lisp people,""" start="00:04:01.007" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think we're all very onboard""" start="00:04:03.891" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""with the fact that you have a simple way""" start="00:04:07.540" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to express everything, and you don't have these""" start="00:04:13.913" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""two systems. In this way,""" start="00:04:17.660" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""you don't have to have code as a system.""" start="00:04:18.925" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Do you have to load code to use the triples package""" start="00:04:20.872" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to make sure your schema is obeyed?""" start="00:04:24.826" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""No, it's all just built in to this database.""" start="00:04:27.917" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'll describe this. As I said,""" start="00:04:35.214" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it's a little bit abstract right now,""" start="00:04:37.037" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but it will become a lot clearer""" start="00:04:39.860" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""when we go through an example,""" start="00:04:42.049" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which we're going to do now.""" start="00:04:46.779" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""As an exercise, let's create Emacs bookmarks,""" start="00:04:50.209" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which basically are three things:""" start="00:04:56.660" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""a name, a file, and an annotation.""" start="00:04:57.346" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I may be missing out on functionality.""" start="00:05:01.039" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Of course, everything in Emacs,""" start="00:05:02.365" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""everything has lots and lots of functionality,""" start="00:05:04.773" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but let's just start with this simple thing.""" start="00:05:05.140" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""First of all, we're going to open up a database.""" start="00:05:08.050" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Pretty simple.""" start="00:05:11.100" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think there's nothing to explain there.""" start="00:05:12.104" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""But here on this line that I'm on right now,""" start="00:05:15.015" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we are saying, okay, there's going to be""" start="00:05:19.107" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""a type called bookmark.""" start="00:05:21.433" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's going to have the following properties.""" start="00:05:24.840" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""First, a file, which is unique and a string.""" start="00:05:26.827" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The second is an annotation,""" start="00:05:29.179" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which is again unique and a string.""" start="00:05:31.765" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Then we're going to have another type called named.""" start="00:05:34.318" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""First of all, why is it named as part of bookmark?""" start="00:05:37.865" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As I'll get into, it's interesting""" start="00:05:39.809" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""when you start sharing this database""" start="00:05:45.563" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""with other things, not just bookmarks, but other types.""" start="00:05:48.512" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Bookmarks are very similar to many other things""" start="00:05:51.366" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that you might want to expand into.""" start="00:05:54.617" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Those other things have names,""" start="00:05:56.724" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but they're not bookmarks.""" start="00:05:57.087" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's nice to separate these concerns out""" start="00:05:58.270" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and just have another type called named,""" start="00:06:04.124" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which just basically has a name.""" start="00:06:08.373" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We can execute this.""" start="00:06:12.780" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's not interesting to look at these.""" start="00:06:15.747" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that is not all that useful for anything,""" start="00:06:21.440" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It outputs something""" start="00:06:21.799" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but that's okay. What's done is, actually,""" start="00:06:25.908" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it's created a database""" start="00:06:28.015" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and it's populated it with the schema.""" start="00:06:32.263" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We can look at this.""" start="00:06:34.046" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We won't go through all of this""" start="00:06:41.479" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""because it's a little bit too much""" start="00:06:43.603" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""for a short presentation like this,""" start="00:06:44.189" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but you could see that there's something here""" start="00:06:46.037" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that's like, oh, we have a subject bookmark.""" start="00:06:48.186" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We have a property base/type.""" start="00:06:52.500" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That just means that there's a property""" start="00:06:56.032" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that's defined by the base.""" start="00:06:58.879" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This means this is from the triples package itself.""" start="00:07:00.563" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's not some other package.""" start="00:07:02.249" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Third is, what is the type of this object?""" start="00:07:08.940" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's a schema. This thing could be many types.""" start="00:07:11.526" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As I said, if you have a--""" start="00:07:17.060" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we haven't seen an example yet,""" start="00:07:19.151" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but if you have a bookmark,""" start="00:07:20.236" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it's going to have a name type""" start="00:07:21.100" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and a bookmark type.""" start="00:07:23.687" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Everything is multi-typed""" start="00:07:25.695" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and that's kind of a feature""" start="00:07:26.720" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""of this kind of storage system.""" start="00:07:28.147" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'm not going to go through everything,""" start="00:07:32.138" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but you can see it's all there in triples,""" start="00:07:33.140" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the whole schema, everything we just did.""" start="00:07:35.866" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""Let's create a bookmark. Again,""" start="00:07:40.740" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we're going to connect to our database""" start="00:07:42.646" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and we're going to basically set""" start="00:07:46.998" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""an entire subject.""" start="00:07:49.247" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The subject is, it's basically like an entity.""" start="00:07:52.553" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're going to define a whole entity""" start="00:07:54.240" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""or you could refer to it as an object.""" start="00:07:56.106" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That's a perfectly fine way to look at it, I think.""" start="00:08:00.677" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's going to have some identifier.""" start="00:08:03.910" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That identifier could be anything.""" start="00:08:04.357" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It doesn't have to be a string.""" start="00:08:06.724" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It could really be anything, but we're going""" start="00:08:07.432" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to give it a string called emacs-init.""" start="00:08:09.260" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It does not matter what this identifier is,""" start="00:08:11.370" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""at least for our purposes.""" start="00:08:13.299" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It does matter when you're linking to it,""" start="00:08:17.809" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but I think nothing that I'm about to show you.""" start="00:08:19.915" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This could truly be anything""" start="00:08:22.264" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""because it has a separate name.""" start="00:08:25.831" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'm giving it a name here, which is init.""" start="00:08:28.180" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'm just specifying the named type here""" start="00:08:32.133" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and I'm specifying the bookmark type here""" start="00:08:34.918" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and its values. We're going to do that.""" start="00:08:38.048" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Now, if we look, we see everything we saw before,""" start="00:08:43.220" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but now we have subject emacs-init.""" start="00:08:47.770" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It has a type and it's named.""" start="00:08:52.247" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We also see the same thing two lines down.""" start="00:08:55.974" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This type is also a bookmark,""" start="00:08:57.220" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but the name is init in the named/name,""" start="00:08:58.265" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which is like the type is name, named,""" start="00:09:02.820" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and the property is name. It's init.""" start="00:09:05.967" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As you can see, this is just""" start="00:09:08.753" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""how everything looks.""" start="00:09:12.662" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's pretty straightforward""" start="00:09:16.332" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and you can retrieve it.""" start="00:09:18.357" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Now, we're looking at the database,""" start="00:09:19.319" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but you don't really have to""" start="00:09:21.604" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""look at the database for... In fact,""" start="00:09:22.690" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I think we're done looking""" start="00:09:23.219" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""at the triples format,""" start="00:09:24.223" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""because I think it's very simple.""" start="00:09:25.106" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You've already got the hang of it, I think.""" start="00:09:29.719" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""Let's retrieve that just to make sure, yes,""" start="00:09:31.366" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we can retrieve it.""" start="00:09:33.070" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're going to retrieve it and say, okay,""" start="00:09:37.981" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""what do we get when we load the emacs-init subject?""" start="00:09:38.248" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Well, we get a plist of all of its properties,""" start="00:09:43.287" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which then you can use in your application.""" start="00:09:48.698" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""There's many more ways to retrieve""" start="00:09:55.631" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and there's many more ways to save.""" start="00:09:57.456" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""In fact, I think the way I did it here""" start="00:09:59.380" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""with set subject is probably not""" start="00:10:01.905" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the right way to do it most of the time.""" start="00:10:04.016" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's usually because it'll erase everything.""" start="00:10:06.782" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's only really to be used when""" start="00:10:08.128" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""you're sure you control all the data,""" start="00:10:13.740" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but you're never sure because there could be""" start="00:10:15.711" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""other packages that are also using this database,""" start="00:10:16.400" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""they could have their own data.""" start="00:10:19.611" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You don't want to erase""" start="00:10:20.696" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""all the other Emacs init subject data.""" start="00:10:21.343" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""In this case, we did because""" start="00:10:25.015" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we are confident it was a new entity,""" start="00:10:27.700" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but in most cases, the right thing to do is""" start="00:10:30.811" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""just set it by type. Just say,""" start="00:10:31.336" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we're just going to set the bookmark type,""" start="00:10:34.290" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which is... The properties are this,""" start="00:10:36.677" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and then the name type""" start="00:10:37.223" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and the properties are that.""" start="00:10:38.105" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That's a way that you could do things.""" start="00:10:42.815" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""There's also many retrieval types.""" start="00:10:44.900" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The retrieval types:""" start="00:10:48.527" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""you can retrieve by a number of different ways,""" start="00:10:53.756" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which I'm not going to get into,""" start="00:10:56.404" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but you can read about in either the source""" start="00:10:58.870" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""or the readme in the package.""" start="00:11:01.242" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""We have backlinks as well.""" start="00:11:10.034" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Let me explain what backlinks are.""" start="00:11:14.540" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""There's another feature of the triples.""" start="00:11:15.863" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As I mentioned, these things""" start="00:11:17.173" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""can be thought about as links,""" start="00:11:19.861" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but what could be a link in one direction""" start="00:11:21.850" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""could also be a link in the other direction,""" start="00:11:23.798" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and we basically get this for free.""" start="00:11:25.805" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Here's an example where we are again""" start="00:11:28.396" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""connecting toward bookmark. Here we're going to""" start="00:11:33.808" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""add a new type called tagged.""" start="00:11:35.753" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're going to give everything in tags.""" start="00:11:38.224" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Here we're saying, okay, there's a type called tagged""" start="00:11:41.614" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and it has a property called tags.""" start="00:11:45.525" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This is not unique, so it's a list basically.""" start="00:11:49.235" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's a list of string.""" start="00:11:52.060" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""There also is a type called tag.""" start="00:11:54.327" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This is for things that are tags themselves.""" start="00:11:58.676" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Then it has a type called numbers""" start="00:12:01.403" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and it has what we call a virtual reversed property.""" start="00:12:06.128" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's virtual because it's not actually stored.""" start="00:12:18.004" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We just compute it by reversing""" start="00:12:21.076" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the subject and the object.""" start="00:12:23.742" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This is on tagged tags. When we query this,""" start="00:12:24.307" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we can just say, okay,""" start="00:12:29.260" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""what are all the subjects""" start="00:12:32.007" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that have tagged tags of me, the tag?""" start="00:12:33.269" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""In fact, let me demonstrate that for you.""" start="00:12:38.860" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're going to set the type on emacs-init.""" start="00:12:39.366" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're going to add the &quot;tagged&quot; type.""" start="00:12:42.140" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This is the alternate way of setting data""" start="00:12:45.071" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that I mentioned.""" start="00:12:47.018" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This won't erase anything else.""" start="00:12:48.740" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're just adding something here.""" start="00:12:49.925" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're adding this type &quot;tagged&quot;""" start="00:12:51.753" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to our previous bookmark emacs-init.""" start="00:12:54.743" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We're going to add emacs and config""" start="00:12:59.954" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""as the tags. We're going to then""" start="00:13:01.059" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""set emacs as a tag and config as a tag.""" start="00:13:06.867" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That just lets us have this virtual property.""" start="00:13:11.096" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You have to do something.""" start="00:13:15.386" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You can't get it out of thin air.""" start="00:13:16.390" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The design decision we've made is:""" start="00:13:18.734" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""you at least need to tag it""" start="00:13:23.427" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""before you get the free property.""" start="00:13:25.509" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""What you should see... Let's try it out.""" start="00:13:32.660" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We got the subject config,""" start="00:13:35.632" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which we've set no data on.""" start="00:13:36.038" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You can tell we're not sending any data.""" start="00:13:37.262" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""If I get that subject, the result is that""" start="00:13:40.669" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it says its members are emacs-init.""" start="00:13:44.821" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That's what a virtual reverse property.""" start="00:13:46.069" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As we tag more things, this just""" start="00:13:49.879" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""continues to work because it's just doing""" start="00:13:53.607" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""a SQL query here.""" start="00:13:55.152" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""Besides showing off the backlinks function,""" start="00:13:59.380" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""this also shows off the general way""" start="00:14:01.986" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""you can have extensible entities.""" start="00:14:04.176" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That is, it's possible that someone writes""" start="00:14:07.864" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""a bookmarks package that stores everything""" start="00:14:09.392" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""in a database, in the triples database,""" start="00:14:13.063" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but then someone else can come and say,""" start="00:14:18.055" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""okay, I'm going to define my own types""" start="00:14:21.522" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that's meant to work with this database,""" start="00:14:23.591" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""just like someone could do what I did here,""" start="00:14:25.740" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""just to add simple tagging.""" start="00:14:28.508" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's very easy to do.""" start="00:14:30.875" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This stuff is not that easy to do otherwise.""" start="00:14:32.901" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""To do this in Lisp, I would say it's a little awkward.""" start="00:14:35.932" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""With databases, again, it's not only possible,""" start="00:14:38.962" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it's relatively trivial,""" start="00:14:42.674" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""especially with this kind of database.""" start="00:14:43.499" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The benefit is it's super easy to work with.""" start="00:14:49.829" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""With this kind of generic database,""" start="00:14:53.057" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the drawback is it's not all that efficient""" start="00:14:56.042" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""as a special purpose table""" start="00:15:00.312" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that is really built for efficiencies.""" start="00:15:04.382" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""A lot of times you have to do multiple lookups""" start="00:15:06.192" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and things like that.""" start="00:15:08.820" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Again, it's a trade-off for various things.""" start="00:15:09.443" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As you can see, this is like""" start="00:15:11.986" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""one database for everything.""" start="00:15:19.901" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""That means that we don't have to all""" start="00:15:22.067" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""contribute to one giant database.""" start="00:15:29.179" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""All the packages that use triples,""" start="00:15:31.945" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it doesn't have to be one database,""" start="00:15:33.053" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but it's cool if it does.""" start="00:15:35.180" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I don't know what I want to happen""" start="00:15:37.087" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""or what I expect to happen,""" start="00:15:39.394" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but I think an interesting property is that""" start="00:15:41.220" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""this is a way for lots of data to live together""" start="00:15:43.069" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and build off each other in ways that I think""" start="00:15:45.400" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""are hard to do with other forms of table layouts""" start="00:15:49.607" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and things like that.""" start="00:15:55.780" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""Let's talk about a use of it,""" start="00:15:57.008" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which is the EKG package.""" start="00:15:59.654" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The EKG package is something I've written""" start="00:16:02.644" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to demonstrate the triples library""" start="00:16:04.590" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and use it for something I think is interesting,""" start="00:16:07.780" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which is personal knowledge management systems""" start="00:16:09.410" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""of the same type, of the same genre""" start="00:16:12.420" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that Org Roam is,""" start="00:16:14.385" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but with different design decisions.""" start="00:16:15.287" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I'll show it in action for a little bit.""" start="00:16:18.434" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Let's just look at... it's all tag-based,""" start="00:16:26.532" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""same kind of tags we saw before""" start="00:16:28.360" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""when we were playing around""" start="00:16:30.186" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""with the bookmarks example application,""" start="00:16:32.233" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""What I want to show is: I can look at a tag.""" start="00:16:35.224" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but everything here is...""" start="00:16:35.560" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I could see notes with that tag.""" start="00:16:37.476" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Everything you see here is in the database,""" start="00:16:40.288" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""no files involved.""" start="00:16:42.633" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""All of this is just a thing""" start="00:16:43.199" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that's an entire object, the entire string.""" start="00:16:46.405" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It works. It has tags.""" start="00:16:49.391" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You can see not only this tag,""" start="00:16:56.082" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but all the other tags associated with it""" start="00:16:59.230" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and their notes.""" start="00:17:01.355" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's kind of an interesting way to do things.""" start="00:17:04.860" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""When you capture it, I think it's interesting.""" start="00:17:10.256" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""There's a lot of interesting design elements here.""" start="00:17:12.260" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This tags thing is not part of the buffer.""" start="00:17:22.276" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's not like Org Roam.""" start="00:17:25.819" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You see here in this other tags,""" start="00:17:28.752" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""these are things I've imported from Org Roam.""" start="00:17:29.117" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This is why they look like they do.""" start="00:17:31.925" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""They have their own titles because""" start="00:17:32.231" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I just wrote them all in Org Roam.""" start="00:17:34.020" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""What it looks like, really, for these notes""" start="00:17:37.890" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""is that it's just text.""" start="00:17:39.458" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You really don't have to bother with this metadata.""" start="00:17:41.024" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""If I want another tag like pancakes,""" start="00:17:44.616" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I can just add it here. Again, these tags""" start="00:17:46.283" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""will turn into data, triple data.""" start="00:17:53.655" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""The text is just a triple date[??] as well,""" start="00:17:56.740" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but different to triple data.""" start="00:17:59.826" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""All these things are like that.""" start="00:18:01.970" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""You can open up any of these things, et cetera.""" start="00:18:08.363" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""I think the interesting thing here""" start="00:18:12.772" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""is to see the code. It's not super interesting""" start="00:18:16.683" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to look at code for too long,""" start="00:18:22.597" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but we don't have that long.""" start="00:18:23.980" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Whenever we connect--""" start="00:18:26.992" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I just want to point out a few things.""" start="00:18:27.655" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Whenever we connect, we have a schema.""" start="00:18:28.820" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We just do this. Every time we connect,""" start="00:18:29.206" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we just make sure it has the right schema.""" start="00:18:31.176" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This way, the user is up to date.""" start="00:18:33.164" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""This schema just looks exactly like""" start="00:18:36.315" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""stuff I showed you in the triples""" start="00:18:38.301" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""when we were looking at bookmarks.""" start="00:18:41.688" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's not complicated.""" start="00:18:43.533" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I even have stuff here with people""" start="00:18:45.100" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to use this as a person database.""" start="00:18:48.211" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I haven't figured out how I'm going to use this yet,""" start="00:18:51.539" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but you can see just to do this,""" start="00:18:52.105" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""it's really trivial and it's pretty easy.""" start="00:18:54.274" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Let's show a few other things,""" start="00:19:01.914" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""like getting all the tags.""" start="00:19:02.499" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Here, we could just say,""" start="00:19:05.845" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""let's get the subjects of type tag.""" start="00:19:07.991" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""We have all the triples,""" start="00:19:10.380" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""all the ones that are of type tag,""" start="00:19:12.903" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""all the things that have a subject.""" start="00:19:15.850" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""All the subjects that have links,""" start="00:19:18.778" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""that have this type, this tag in it,""" start="00:19:22.146" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we can return them all.""" start="00:19:28.338" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""of all these objects.""" start="00:19:30.426" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Basically, it just gives you a list""" start="00:19:30.660" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Again, you can think of these things as objects.""" start="00:19:32.675" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""All the objects of type tag,""" start="00:19:33.244" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""we'll just get them all. Super, super simple.""" start="00:19:35.434" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Triples gives you this functionality""" start="00:19:37.321" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""out of the box. It's not that complicated.""" start="00:19:39.586" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""What I would like to show,""" start="00:19:43.780" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and that shows my thesis for this whole talk,""" start="00:19:45.168" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""is this rename tag. Now, think about""" start="00:19:49.519" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""how you would rename a tag in Org Roam""" start="00:19:52.786" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""or anything where the tag is part of the files.""" start="00:19:54.151" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""It's like how you would re-tag everything""" start="00:20:03.014" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""in Org Mode. It's complicated and error-prone""" start="00:20:05.280" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and slow. This is anything,""" start="00:20:09.870" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""this is instantaneous and super easy.""" start="00:20:12.557" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Look, that's it. There's not that many places""" start="00:20:14.764" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""for an error to live here.""" start="00:20:17.256" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""One thing I would like to point out""" start="00:20:19.540" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""is that we are doing direct,""" start="00:20:21.508" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""not everything has to go through""" start="00:20:23.338" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the triples package. Maybe it should,""" start="00:20:24.321" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but the triples package is a fixed format,""" start="00:20:28.293" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""which is why it's okay--""" start="00:20:31.660" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""whether it's a good idea, I'm not sure,""" start="00:20:33.907" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""but it's okay for client packages""" start="00:20:34.070" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""to just directly manipulate the tables.""" start="00:20:39.864" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Here, we're just doing it just to""" start="00:20:42.834" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""update all the tags""" start="00:20:43.938" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""and then remove and set types""" start="00:20:45.266" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""so that the correct thing happens.""" start="00:20:47.892" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""As you can see, it's super, super simple.""" start="00:20:49.120" video="mainVideo-sqlite" id="subtitle"]]
+[[!template new="1" text="""I think this proves my thesis about""" start="00:20:52.147" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""the advantages of applications with SQLite.""" start="00:20:55.375" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Thank you for listening.""" start="00:21:01.527" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I hope this puts ideas in your minds""" start="00:21:02.431" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""about taking advantage of this functionality.""" start="00:21:05.877" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""I hope to see more things""" start="00:21:09.828" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""using the triples library""" start="00:21:11.936" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""or otherwise that take advantage of this.""" start="00:21:12.180" video="mainVideo-sqlite" id="subtitle"]]
+[[!template text="""Thank you for your time.""" start="00:21:16.018" video="mainVideo-sqlite" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20sqlite%3A%20Using%20SQLite%20as%20a%20data%20source%3A%20a%20framework%20and%20an%20example)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/sqlite-before.md b/2022/info/sqlite-before.md
new file mode 100644
index 00000000..e0ada947
--- /dev/null
+++ b/2022/info/sqlite-before.md
@@ -0,0 +1,57 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Andrew Hyatt shows how to use SQLite to store and retrieve information using the triples package. Afterwards, he wil handle questions over BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="sqlite">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect stroke-width="3" x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 22-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-sqlite>
+Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
+Status: TO_CAPTION_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-03T18:00:00Z" end="2022-12-03T18:25:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~1:00 PM - 1:25 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~12:00 PM - 12:25 PM CST (US/Central)<br />Saturday, Dec 3 2022, ~11:00 AM - 11:25 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~10:00 AM - 10:25 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~6:00 PM - 6:25 PM UTC <br />Saturday, Dec 3 2022, ~7:00 PM - 7:25 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~8:00 PM - 8:25 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~11:30 PM - 11:55 PM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~2:00 AM - 2:25 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~3:00 AM - 3:25 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="sqlite-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="sqlite-mainVideo" data="""
+00:00.000 Introduction
+00:56.220 Why SQLite
+02:29.870 The triples package
+04:50.209 Exercise: Emacs bookmarks
+07:40.740 Creating bookmarks
+09:31.366 Retrieving bookmarks
+11:10.034 Backlinks
+13:59.380 Extensible entities
+15:57.008 EKG package
+18:12.772 The code
+19:43.780 Renaming tags
+20:52.147 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.webm">Download --main.webm (69MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/a26FMpRuCKmn4YZU4ysdrd">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="sqlite-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="sqlite-qanda" data="""
+00:29.040 Is this built into Emacs? Multiple schemas, multiple databases?
+01:22.756 What about collaborative editing with this?
+02:22.913 What about using this on multiple computers? How do you synchronize your data?
+03:16.640 Are you planning to further develop EKG?
+04:45.303 Is it then possible to combine the triples DB with some custom tables in the same SQLite file?
+06:01.734 What are your thoughts on adding a timestamp attribute to triples so that the database becomes append-only and by default you return the latest fact for a subject-object pair?
+08:37.040 With EKG what about views like org roam node mind map view? Or org mode virtual view for integration with other org packages?
+09:46.220 Can ordinary lisp data types (lists, symbols, etc) be stored in the database?
+13:41.041 Beyond note-taking, what kind of packages do you think would benefit from triples library?
+15:03.200 Are you trying to create a PIM with EKG? What information do you primarily want to manage?
+17:10.021 What about using other databases programs: PostgreSQL, MongoDB, etc.?
+17:55.899 What is your preferred reference to understand triples/graph dbs? (e.g. think better about schema design)
+18:49.200 Will it slow down with the growth of a database?
+20:39.728 What are your thoughts on allowing for a true graph DB backend?
+22:58.960 Challenges with recording
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="sqlite-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.webm">Download --answers.webm (44MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--answers.opus">Download --answers.opus (8.3MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/sqlite-nav.md b/2022/info/sqlite-nav.md
new file mode 100644
index 00000000..df7ecc8f
--- /dev/null
+++ b/2022/info/sqlite-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/meetups">Attending and organizing Emacs meetups</a>
+Next by track: <a href="/2022/talks/buttons">Linking personal info with Hyperbole implicit buttons</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/sun-close-after.md b/2022/info/sun-close-after.md
new file mode 100644
index 00000000..f15ea0e2
--- /dev/null
+++ b/2022/info/sun-close-after.md
@@ -0,0 +1,7 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20sun-close%3A%20Sunday%20closing%20remarks)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/sun-close-before.md b/2022/info/sun-close-before.md
new file mode 100644
index 00000000..f3b222a8
--- /dev/null
+++ b/2022/info/sun-close-before.md
@@ -0,0 +1,4 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><div></div><div class="files resources"><ul></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/sun-close-nav.md b/2022/info/sun-close-nav.md
new file mode 100644
index 00000000..c7f08cc2
--- /dev/null
+++ b/2022/info/sun-close-nav.md
@@ -0,0 +1,6 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/python">Short hyperlinks to Python docs</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/sun-open-after.md b/2022/info/sun-open-after.md
new file mode 100644
index 00000000..e11c9bbb
--- /dev/null
+++ b/2022/info/sun-open-after.md
@@ -0,0 +1,7 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20sun-open%3A%20Sunday%20opening%20remarks)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/sun-open-before.md b/2022/info/sun-open-before.md
new file mode 100644
index 00000000..f3b222a8
--- /dev/null
+++ b/2022/info/sun-open-before.md
@@ -0,0 +1,4 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><div></div><div class="files resources"><ul></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/sun-open-nav.md b/2022/info/sun-open-nav.md
new file mode 100644
index 00000000..a5b07625
--- /dev/null
+++ b/2022/info/sun-open-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/sat-close">Saturday closing remarks</a>
+Next by track: <a href="/2022/talks/survey">Results of the 2022 Emacs Survey</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/survey-after.md b/2022/info/survey-after.md
new file mode 100644
index 00000000..d3d710f3
--- /dev/null
+++ b/2022/info/survey-after.md
@@ -0,0 +1,538 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="survey-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello everyone and thanks for tuning in. I'm Timothy,""" start="00:00:00.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and in this talk, we'll be going over""" start="00:00:06.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the 2022 Emacs User Survey.""" start="00:00:08.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Since this is the first time we're discussing this,""" start="00:00:11.970" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we'll be going over the survey itself a bit,""" start="00:00:15.079" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""how it's being put together and run,""" start="00:00:18.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then we'll have a little taste of the results""" start="00:00:21.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with more analysis to be published in the future.""" start="00:00:24.200" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""To start with though, a bit of background.""" start="00:00:26.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So in 2020, we had an Emacs User Survey""" start="00:00:32.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""run by Adrien Brochard.""" start="00:00:36.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now this is, to the best of my knowledge,""" start="00:00:38.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the first time that a large-scale Emacs User Survey""" start="00:00:41.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""has actually been run.""" start="00:00:45.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""About 7,000 people responded to the survey,""" start="00:00:48.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""so in many respects, it was quite successful.""" start="00:00:50.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And what's significant about this is that""" start="00:00:53.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with this being the first time""" start="00:00:56.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that a large-scale survey has been run,""" start="00:00:57.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it actually provided some insight""" start="00:01:00.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""into questions about how the community is using Emacs""" start="00:01:01.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that allow for much better guesses""" start="00:01:06.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""than just speculation based on the small number of people""" start="00:01:09.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""who respond on the mailing list usually.""" start="00:01:15.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So, why are we doing another survey? Well, to start with,""" start="00:01:16.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in order to get the most value out of an Emacs User Survey,""" start="00:01:24.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's quite helpful if the information in it is recent.""" start="00:01:28.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Furthermore, we can actually get some more value""" start="00:01:32.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""if we can examine trends,""" start="00:01:35.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""shifts in the way that people are using Emacs,""" start="00:01:38.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""where the pain points lie,""" start="00:01:41.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""what people are enjoying the most, etc.""" start="00:01:42.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So in both of these respects,""" start="00:01:45.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's to our benefit if the survey""" start="00:01:46.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""is actually a regular event,""" start="00:01:49.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""instead of just something that's run once.""" start="00:01:51.520" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now, with this in mind,""" start="00:01:54.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we ran the 2022 Emacs User Survey with the plan""" start="00:01:57.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that this will actually become an annual event.""" start="00:02:00.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""In the design of the survey, there are a few goals here.""" start="00:02:05.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""The main one is of the user community.""" start="00:02:09.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now, user community is a rather nebulous phrase.""" start="00:02:11.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""In this case, what's meant in particular""" start="00:02:14.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""is value in questions, for example,""" start="00:02:17.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""things like pain points with Emacs,""" start="00:02:21.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which versions people are using,""" start="00:02:23.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which capabilities people are making the most use of,""" start="00:02:27.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which could potentially be helpful to both emacs-devel""" start="00:02:30.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but also our collection of Emacs package maintainers""" start="00:02:34.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and the whole community.""" start="00:02:36.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Actually, I think going beyond just the packages,""" start="00:02:38.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've also got the people who develop tutorials, guides,""" start="00:02:40.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and all of that sort of surrounding activity,""" start="00:02:46.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which can benefit from a clear understanding""" start="00:02:49.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of how Emacs users use Emacs.""" start="00:02:51.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Separately to that,""" start="00:02:56.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think as an Emacs user myself,""" start="00:02:58.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that it's rather interesting to see""" start="00:03:01.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""how other people are using Emacs""" start="00:03:02.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and what their experience is. So yes, basically,""" start="00:03:04.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""you've got utility and interest""" start="00:03:07.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""as the two separate driving factors""" start="00:03:08.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""as we try to pick questions, which actually can give us""" start="00:03:10.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""all of this without taking up too much""" start="00:03:14.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of the respondents time.""" start="00:03:16.521" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now, last time in 2020, the Emacs survey that Adrien ran""" start="00:03:18.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""used, I think Google Forms, if I recall correctly,""" start="00:03:24.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with an option to send in responses manually.""" start="00:03:27.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""This worked, but it's not great,""" start="00:03:28.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""particularly given that this is for a survey""" start="00:03:33.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""being run in an ardently FOSS community.""" start="00:03:35.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Ideally, we actually want""" start="00:03:37.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to find a survey framework""" start="00:03:38.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that respects the priorities of users, is open source,""" start="00:03:40.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""ideally free and open source,""" start="00:03:44.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and is a relatively pleasant experience.""" start="00:03:46.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Unfortunately, looking at available options,""" start="00:03:50.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it seems that one always has to compromise on at least one,""" start="00:03:53.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""if not all of those criteria,""" start="00:03:56.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which is quite far from ideal.""" start="00:03:58.021" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""So what's the obvious solution?""" start="00:04:01.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Okay, we should just write a new survey framework.""" start="00:04:04.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Obviously, this is easier said than done.""" start="00:04:06.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But around a year ago,""" start="00:04:10.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I actually started doing exactly this.""" start="00:04:12.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I've used the programming language Julia quite a bit""" start="00:04:13.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""on a day to day basis. And there just so happens to be""" start="00:04:17.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a web framework for that called Genie.""" start="00:04:21.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So I thought I'd give it a shot.""" start="00:04:23.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And well, here we are today.""" start="00:04:24.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I ended up putting something together,""" start="00:04:26.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which could take a set of questions written in Julia""" start="00:04:28.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and using a survey library,""" start="00:04:34.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""actually pass that into this helpful structure""" start="00:04:35.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then construct HTML forms based on that,""" start="00:04:38.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and ingest results from the HTML forms,""" start="00:04:44.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and just sort of handle that altogether.""" start="00:04:47.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now, all of this ends up being fed into an SQLite DB.""" start="00:04:48.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So everything's there, even part responses.""" start="00:04:52.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""One of the goals with the actual design of this has been""" start="00:04:55.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to just minimize what's actually done on the client side.""" start="00:04:57.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So that means JavaScript, cookies, the whole lot.""" start="00:05:01.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Basically, as far as this could reasonably be taken,""" start="00:05:05.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've just got static HTML being shoved to the user,""" start="00:05:08.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""or respondent rather. And then we just""" start="00:05:14.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""take an HTTP post request back""" start="00:05:16.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and update the results that way.""" start="00:05:18.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now by doing things like actually paging the survey,""" start="00:05:20.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we can allow for incremental saving of results""" start="00:05:24.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and a few other niceties while essentially preserving""" start="00:05:26.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""an experience that doesn't really require any data""" start="00:05:30.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of any particular capabilities, which is sort of""" start="00:05:36.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a nice, clean, minimal experience as far as I'm concerned.""" start="00:05:37.320" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""So how does this actually look like in practice?""" start="00:05:40.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Well, one of the nice things about this is""" start="00:05:45.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""because the question itself is written in Julia,""" start="00:05:48.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we can get some nice features like custom validators""" start="00:05:51.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and other fancy behavior and directly specify""" start="00:05:54.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""how we actually want questions to be registered""" start="00:05:57.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in the database. So here we have, for example,""" start="00:06:01.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""two questions we had from this email survey.""" start="00:06:04.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""One is a multi-select. Another one is just putting in""" start="00:06:06.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the number of years people have used Emacs for.""" start="00:06:09.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think this gives a brief overview of the capabilities.""" start="00:06:14.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""One of the things I'd like to draw particular attention""" start="00:06:16.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to here is in the multi-select,""" start="00:06:19.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""you'll see an array of options,""" start="00:06:20.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the first one of which actually maps for different value""" start="00:06:22.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to be stored for convenience.""" start="00:06:24.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And then the final one is a special one, :other,""" start="00:06:25.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and you can see that's a bit different to the rest""" start="00:06:29.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""where it's got that colon function,""" start="00:06:30.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's a symbol, not a string.""" start="00:06:32.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And this is quite a nice one because the way""" start="00:06:33.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that this framework's been designed,""" start="00:06:37.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""when we have an :other value like that,""" start="00:06:39.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""instead of it just being a sort of tick box &quot;Other&quot;,""" start="00:06:41.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it actually provides the option to write""" start="00:06:44.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""your own different response to all of the above.""" start="00:06:47.200" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Okay, so at the very end, we've now got""" start="00:06:50.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a completely FOSS survey framework, rather nice.""" start="00:06:55.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So the set of what were these...""" start="00:06:58.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Decent array of input types.""" start="00:07:00.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""It would be nice to expand, but at the moment""" start="00:07:01.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think we could just about describe it as a rich set.""" start="00:07:02.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Zero JavaScript required, but a little bit useful""" start="00:07:04.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""for progressive enhancement.""" start="00:07:07.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""As demonstrated, we can get some fancy validation going on.""" start="00:07:08.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And then because we've got the results""" start="00:07:12.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""tied into this quite nicely,""" start="00:07:16.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we can actually have them available live""" start="00:07:18.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and in quite a number of formats.""" start="00:07:21.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I'm not sure how much you saw in the architecture diagram,""" start="00:07:23.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but we've got all sorts of things here.""" start="00:07:25.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""CSV, TSV, plain text, JSON,""" start="00:07:27.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""just grab a copy of the SQLite database,""" start="00:07:29.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but only the relevant bits.""" start="00:07:32.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Or something called JLD2,""" start="00:07:33.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which preserves a lot of type information""" start="00:07:35.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and a few other nice things.""" start="00:07:38.000" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now, what are we going to do going forward from here?""" start="00:07:39.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Well, there are a few minor issues here.""" start="00:07:43.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""For example, there's a memory leak issue which is going on,""" start="00:07:46.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""resulting in the service being restarted,""" start="00:07:48.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think every day or two, while the survey was running.""" start="00:07:51.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I actually have the suspicion""" start="00:07:54.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that that's largely responsible for""" start="00:07:56.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""about 1% of respondents, which is about 75 people,""" start="00:07:57.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""who described the survey experience as not great.""" start="00:08:01.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Overall though, the feedback has been quite positive.""" start="00:08:04.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""There's been some detailed written feedback,""" start="00:08:08.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but just from the quick great/okay/not great options,""" start="00:08:09.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we had about two-thirds of people saying""" start="00:08:12.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that the user experience was great,""" start="00:08:14.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which is really nice to hear the first time being run.""" start="00:08:16.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""A few other things would be nice to add, for example,""" start="00:08:19.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in future control flow. By this, I mean""" start="00:08:22.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the option to present different questions""" start="00:08:25.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""based on previous answers""" start="00:08:27.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""would be quite nice to streamline the experience.""" start="00:08:29.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""For example, having a set of questions""" start="00:08:31.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""for first-time respondents or people who are involved""" start="00:08:33.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in the packaging side of things""" start="00:08:37.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""without actually cluttering the experience""" start="00:08:42.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""for everybody else. That'd be quite nice.""" start="00:08:45.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Further to this, all of this,""" start="00:08:46.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think on top of the standard web interface,""" start="00:08:48.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it'd be quite nice to actually write a server API.""" start="00:08:51.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And the particular reason why I mentioned this""" start="00:08:53.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""is because this could potentially allow for""" start="00:08:55.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""basically an Emacs survey package.""" start="00:08:58.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I mean, we already use Emacs for so many things,""" start="00:09:00.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""might as well fill the survey out from within it as well.""" start="00:09:03.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Okay, so this is how the survey has been conducted.""" start="00:09:05.520" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now, what are the responses look like?""" start="00:09:11.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now, at this stage, I was actually hoping""" start="00:09:13.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to get into some somewhat sophisticated analysis""" start="00:09:16.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""because there's quite a bit that you can dig out""" start="00:09:18.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of the data responses that we've received.""" start="00:09:22.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""However, unfortunately, I've been much more limited on time""" start="00:09:24.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""than I'd hoped for, so that's going to have to come later.""" start="00:09:27.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""For now, we're just going to take a bit of a peek""" start="00:09:30.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""at some of the really basic answers.""" start="00:09:33.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Well, it's not even really analysis.""" start="00:09:35.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Expect to see lots of pie charts, basically.""" start="00:09:38.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But there's still a bit of interest there,""" start="00:09:40.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""so we'll go through a bit of that""" start="00:09:43.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and just give a bit of a tease""" start="00:09:44.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""as to what might come in the future.""" start="00:09:47.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So to sum up for starters,""" start="00:09:50.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've had about 6,500 responses.""" start="00:09:51.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""It is worth noting that a thousand of those are partials,""" start="00:09:55.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""so people who gave up on the survey partway through.""" start="00:09:58.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Given that the 2020 survey had about 7000 responses,""" start="00:10:02.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I'll tell you we're basically on par here.""" start="00:10:05.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""This ran over a month and interestingly,""" start="00:10:07.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""about half of these respondents""" start="00:10:10.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""did not participate in the 2020 survey.""" start="00:10:12.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think at this point,""" start="00:10:13.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's not really clear what to make of that.""" start="00:10:16.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""There's been a two-year gap between the surveys.""" start="00:10:17.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""It's been done, well, it's been done quite differently,""" start="00:10:21.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and yes, there's not enough, really, to say.""" start="00:10:25.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""What could be interesting though is actually,""" start="00:10:29.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""once this starts running regularly,""" start="00:10:32.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we can see whether there's regular churn""" start="00:10:33.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in the survey respondents,""" start="00:10:36.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""or if we have a consistent core""" start="00:10:38.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with people who respond each year,""" start="00:10:40.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then just people who come by every now and then and go,""" start="00:10:42.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""&quot;Oh, why not respond to this year's survey?&quot;""" start="00:10:46.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But we're going to have to wait a bit to actually see""" start="00:10:47.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""how people treat the survey.""" start="00:10:51.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now these responses came from quite a wide range of places""" start="00:10:52.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've got 115 nations represented here. Collectively,""" start="00:10:57.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""these ones have spent about a thousand hours""" start="00:11:02.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""giving us information. So I think, if nothing else,""" start="00:11:04.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""just from the effort that people have put into""" start="00:11:06.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""actually giving us useful data to work with,""" start="00:11:10.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's worth giving at least a good effort""" start="00:11:12.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to actually trying to extract some value""" start="00:11:13.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""out of these responses.""" start="00:11:16.000" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now, overall we found a lot of responses came from America,""" start="00:11:17.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""no surprises there, but as mentioned,""" start="00:11:20.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've got a good mix around the globe.""" start="00:11:23.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""The usual suspects for the rest of the responses,""" start="00:11:24.021" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a whole bunch in Europe, a whole bunch around Asia,""" start="00:11:29.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a bit in Australasia as well and yes,""" start="00:11:33.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""there's nothing particularly surprising here,""" start="00:11:36.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""there's a lot of inline expectations.""" start="00:11:38.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""What I find a bit more interesting, though,""" start="00:11:41.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""is if we actually normalise""" start="00:11:42.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the number of responses from each nation""" start="00:11:45.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""by the population of said nations,""" start="00:11:48.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""essentially giving a popularity of Emacs""" start="00:11:50.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""or at least of Emacs early respondents for each nation,""" start="00:11:54.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we end up finding that Europe, particularly Scandinavia,""" start="00:11:57.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""becomes a bit of a hotspot.""" start="00:12:00.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So I'm not sure what's going on""" start="00:12:02.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in Sweden, Finland and Norway,""" start="00:12:04.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but it seems to be particularly popular around there.""" start="00:12:07.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""It's also worth noting that we now find""" start="00:12:10.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that the proportion of respondents""" start="00:12:14.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in countries like America, Canada, Australia""" start="00:12:18.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and most of Europe actually becomes""" start="00:12:21.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""quite comparable with each other,""" start="00:12:24.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which yes, once again, sort of lines up""" start="00:12:26.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with these responses, expectations from the last slide.""" start="00:12:30.240" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Okay, getting into some of the other""" start="00:12:32.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""demographic information.""" start="00:12:36.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""The demographic information was new to this survey.""" start="00:12:38.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""In the 2020 survey, people were asked what they think""" start="00:12:40.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of being asked about some demographic information""" start="00:12:44.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in a future survey, and the overwhelming response is, &quot;Sure,""" start="00:12:47.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I don't really mind.&quot; And so that's what we've done here.""" start="00:12:50.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""One of the ones of somewhat interest""" start="00:12:52.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""is the age gender breakdown. So we expect Emacs""" start="00:12:56.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to be used predominantly among people in software""" start="00:12:59.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and programming and within the industry,""" start="00:13:03.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think it's quite widely documented""" start="00:13:05.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to have about a sort of 75-25%, roughly, split""" start="00:13:08.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""between male and female.""" start="00:13:14.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Interestingly, in Emacs,""" start="00:13:14.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's a much more aggressively-biased result.""" start="00:13:19.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So we had about 96% of respondents are male""" start="00:13:22.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with just 4% for the rest. Interestingly, though,""" start="00:13:28.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""if we look at the young respondents,""" start="00:13:34.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""say for example, under 25, we go from 96% male to 88%.""" start="00:13:35.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So it's fair to say that the young respondents are""" start="00:13:41.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in this respect, a somewhat more diverse group.""" start="00:13:46.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Hopefully, as future surveys go on,""" start="00:13:49.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we'll see this continue not die off""" start="00:13:52.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to the sort of well, at this point,""" start="00:13:54.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's more like 99% if you look at the older ages.""" start="00:13:58.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But we'll see.""" start="00:14:02.920" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Occupations was an interesting slide as well.""" start="00:14:04.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Interesting question as well.""" start="00:14:07.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We've got the usual suspects here. I mean,""" start="00:14:09.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it's a text editor, well, Lisp machine""" start="00:14:11.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""masquerading as a text editor, mainly used for programming,""" start="00:14:15.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and so we expect lots of software development""" start="00:14:17.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and that sort of thing. But that's only about""" start="00:14:20.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""just over half of the responses.""" start="00:14:23.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We've got a huge chunk from academia,""" start="00:14:25.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then really just an odd bag""" start="00:14:28.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of all sorts of other things,""" start="00:14:30.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""including things which you wouldn't really associate""" start="00:14:30.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with programming and software at all.""" start="00:14:33.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Things like creative writing, publishing, legal, yes.""" start="00:14:35.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And then you've got this chunk of Other,""" start="00:14:39.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which is I think here is""" start="00:14:41.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the fourth most popular option here.""" start="00:14:43.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And what we have here is about 500 different responses""" start="00:14:46.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""from a huge range of activities.""" start="00:14:49.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""It's really quite interesting to read things like""" start="00:14:51.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think, things like &quot;naval officer&quot;,""" start="00:14:54.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and just... All sorts of surprising occupations for Emacs.""" start="00:14:56.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And I think this is a particular area""" start="00:15:01.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""because I imagine compared to other code editors,""" start="00:15:04.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""sort of your VS Code, remember like""" start="00:15:10.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that Emacs may have a particularly diverse set""" start="00:15:13.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of industry occupations represented in its users.""" start="00:15:18.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now, if you look at where the response actually came from,""" start="00:15:23.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've got the usual suspects up top,""" start="00:15:28.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Hacker News and r/emacs.""" start="00:15:31.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But then we actually get a much more graduated breakdown""" start="00:15:33.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""than in the 2020 survey.""" start="00:15:40.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We do think familiar results here like IRC, Telegram,""" start="00:15:43.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Emacs China, and Twitter.""" start="00:15:46.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But now you've got a few new entries,""" start="00:15:48.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""things like the Fediverse, Discourse, Matrix,""" start="00:15:50.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which didn't pop up previously.""" start="00:15:53.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So I think this is yes, quite a nice sign in terms of""" start="00:15:56.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""actually hitting a wide range""" start="00:15:59.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of pockets of Emacs users across different platforms,""" start="00:16:02.521" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which bodes well for the potential representiveness""" start="00:16:06.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of this survey.""" start="00:16:10.320" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Unsurprisingly, if we're talking about Emacs""" start="00:16:11.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and particularly people who are quite engaged in it,""" start="00:16:15.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which are the respondents to this survey,""" start="00:16:17.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we find that we also get quite a high degree of care""" start="00:16:19.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""for free and open source software.""" start="00:16:25.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So if you have a look here,""" start="00:16:27.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""only about a quarter of users""" start="00:16:30.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""didn't express a strong preference towards FOSS software.""" start="00:16:35.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""In fact, we had over a quarter saying that""" start="00:16:39.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""they would accept significant or even any compromise""" start="00:16:43.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to use a FOSS user software""" start="00:16:49.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""over a proprietary alternative,""" start="00:16:52.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which given the nature of Emacs,""" start="00:16:55.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""not terribly surprising,""" start="00:16:59.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but a strong showing nonetheless.""" start="00:17:00.640" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now, let's start getting to things""" start="00:17:02.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which are actually useful for""" start="00:17:05.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""potential Emacs development and packaging.""" start="00:17:07.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""If you're thinking about supporting Emacs versions,""" start="00:17:11.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""it looks like you can do fantastically well""" start="00:17:13.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in terms of hitting most users if you support Emacs 27+.""" start="00:17:16.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""That hits about 96% of respondents.""" start="00:17:20.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Interestingly though, you can actually make an argument""" start="00:17:23.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""for being even more aggressive.""" start="00:17:26.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I mean, if you have a look at Emacs 28+,""" start="00:17:27.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that's still over three quarters of respondents.""" start="00:17:30.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We've got, at this point, a quarter""" start="00:17:32.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""using the unreleased HEAD version,""" start="00:17:35.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""even though it's getting close to release.""" start="00:17:37.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Obviously here, as stated, we're hitting""" start="00:17:40.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a sort of more engaged with the community""" start="00:17:43.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""subset of Emacs users, but still,""" start="00:17:44.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think it's interesting to see that""" start="00:17:47.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""with Emacs's increasingly frequent update schedule,""" start="00:17:49.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that users are actually picking up those updates""" start="00:17:52.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""quite promptly as they roll out.""" start="00:17:55.000" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Continuing on with how people actually use Emacs: languages.""" start="00:17:56.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We've got the usual suspects here: lots of Python,""" start="00:18:02.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""quite a bit of JavaScript and C, lots of shell.""" start="00:18:05.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""What I find quite interesting though is""" start="00:18:08.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""if we actually bring in""" start="00:18:11.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the 2020 Stack Overflow language usage survey data,""" start="00:18:12.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and that maps quite well""" start="00:18:16.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to the array of language options we provided here.""" start="00:18:19.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""They had a general Lisp option,""" start="00:18:20.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which I've folded into Common Lisp""" start="00:18:21.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""since they listed Clojure separately.""" start="00:18:23.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think that seems like a fairly safe bet.""" start="00:18:26.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""But other than that, the only languages that we missed""" start="00:18:29.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""are Scheme and Elisp.""" start="00:18:31.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""What we can do is we can look at""" start="00:18:35.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the relative popularity of different languages""" start="00:18:37.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""from our Emacs user survey compared to Stack Overflows.""" start="00:18:41.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""What do we find? Well, Clojure and Common Lisp""" start="00:18:44.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""far above the rest, I imagine in no small part due to""" start="00:18:48.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the fantastic SLIME and Cider packages.""" start="00:18:51.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Following that, we see Haskell being particularly prominent,""" start="00:18:54.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then a collection of other languages,""" start="00:18:59.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""your Erlang, Elixir, Julia, Perl and the rest.""" start="00:19:00.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And then lastly, if we have a look at the ones""" start="00:19:06.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which have significantly diminished popularity""" start="00:19:10.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""compared to Stack Overflow, we end up with, I think,""" start="00:19:13.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""what I could probably cast as more enterprising languages.""" start="00:19:17.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Things like C#, Java, Typescript and the like.""" start="00:19:20.160" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""So, that's interesting. Now, earlier""" start="00:19:25.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""when we were looking at the split of Emacs users,""" start="00:19:31.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we found that we actually had a fair few""" start="00:19:33.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in more creative areas, like writing and publishing.""" start="00:19:37.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So if looking at prose, we'd expect a decent chunk""" start="00:19:42.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to be using Emacs for prose, but it's actually more""" start="00:19:44.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""than just a little bit, it's a little slice.""" start="00:19:47.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We've got a whopping about a third of users""" start="00:19:48.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""saying they frequently use Emacs for writing prose.""" start="00:19:50.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I'd imagine that the availability""" start="00:19:54.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of things like Org mode and AUCTeX""" start="00:19:56.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""probably help like this.""" start="00:19:57.800" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Moving on to other packages, or more packages,""" start="00:20:03.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we've actually got a very similar split here""" start="00:20:05.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to the 2020 survey. Org has seen a bit of a growth""" start="00:20:08.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in popularity. We've got some new arrivals here as well.""" start="00:20:13.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""For example, Vertico has popped onto the scene""" start="00:20:16.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and overtaken Ivy here, along with""" start="00:20:18.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a few other new packages like Consult.""" start="00:20:21.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Other than that, quite comparable.""" start="00:20:24.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""What's rather interesting, though, I find here is that""" start="00:20:27.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""when you have people who listed a small number of packages,""" start="00:20:30.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""they actually predominantly listed packages""" start="00:20:33.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""other than the most common set.""" start="00:20:39.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So if we have a lot of people who only listed one package,""" start="00:20:41.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""basically two-thirds of that,""" start="00:20:43.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""or actually three-quarters of those responses""" start="00:20:48.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""were saying other packages,""" start="00:20:51.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""despite the fact that overall packages""" start="00:20:53.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""other than the highlighted selection here""" start="00:20:56.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""only constitute a quarter of responses.""" start="00:20:58.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So there might be something a bit more to look at there.""" start="00:21:01.400" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now when people are using packages,""" start="00:21:04.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we also asked what types of documentation""" start="00:21:07.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""people would like to see more of on package READMEs.""" start="00:21:11.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Basically we've got a big mix here.""" start="00:21:14.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""It seems like generally people are interested in""" start="00:21:17.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""seeing more in various forms, whether it be tutorials,""" start="00:21:20.080" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""overviews, screenshots, comparisons, or clips and videos.""" start="00:21:23.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So full READMEs with a lot of context""" start="00:21:29.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""seem to be quite desirable from this.""" start="00:21:32.920" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now moving forward, what are we going to do?""" start="00:21:38.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So 800 people gave some detailed feedback on the survey.""" start="00:21:42.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""That's quite nice. I'm going to be taking a good read""" start="00:21:45.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of all of those responses and use that""" start="00:21:47.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to improve the process and also the set of questions.""" start="00:21:50.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Now all of you can also give some feedback on the questions,""" start="00:21:55.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""both that you found most useful in this survey,""" start="00:22:00.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""ones that you think might not add much value,""" start="00:22:02.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and/or new questions""" start="00:22:04.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that you think might be a good addition.""" start="00:22:07.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Once I've done a bit more analysis,""" start="00:22:08.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""particularly the more sophisticated analysis""" start="00:22:11.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which I'm planning, which will probably come out actually""" start="00:22:13.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""maybe in the first quarter of next year,""" start="00:22:17.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we can see which questions there seem to have provided""" start="00:22:18.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the most interesting or surprising results""" start="00:22:22.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and those are probably worth keeping.""" start="00:22:25.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Lastly, once we actually have an API""" start="00:22:26.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and potentially even an Emacs package,""" start="00:22:31.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we could automate a large number of the questions,""" start="00:22:33.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""things like Emacs version, set of packages used,""" start="00:22:36.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and that could just streamline the experience""" start="00:22:39.000" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""of actually filling out the survey,""" start="00:22:41.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""make it a bit more frictionless.""" start="00:22:42.280" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Now talking of the question of questions,""" start="00:22:44.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a quick survey is a good survey.""" start="00:22:47.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""If we're asking people to dedicate their time""" start="00:22:49.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to fill out this, it's good to try to get as much value""" start="00:22:52.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""without asking them to donate much of their time.""" start="00:22:56.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""How has the survey done in this respect?""" start="00:22:59.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I'm actually very happy with how it's done.""" start="00:23:02.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""We get a few comments from the feedback saying""" start="00:23:04.120" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that it was a bit of a long side,""" start="00:23:06.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but the median time was about 12 minutes,""" start="00:23:07.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""which doesn't seem too bad, and most commonly""" start="00:23:10.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we saw people completing it in about 8 minutes.""" start="00:23:13.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""For a once-per-year survey,""" start="00:23:16.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I think this seems fairly reasonable.""" start="00:23:18.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Getting closer to a 5-10 minute range would be nice,""" start="00:23:20.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but this isn't far off.""" start="00:23:24.280" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Lastly, we're also going to be considering""" start="00:23:26.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""how long the survey is open for.""" start="00:23:30.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So from the initial opening date,""" start="00:23:32.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""what we have here is a plot of""" start="00:23:36.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the page which people ended up on""" start="00:23:38.480" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and when they started the survey.""" start="00:23:41.920" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""So what we can see is a huge spike in the first few days.""" start="00:23:43.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I've just realised that this plot""" start="00:23:46.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""is actually labelled incorrectly.""" start="00:23:50.240" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Please disregard the minutes to complete the survey.""" start="00:23:53.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""This should be days after survey opening""" start="00:23:55.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""that a response is actually submitted.""" start="00:23:58.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""And what we have here is a big spike""" start="00:24:01.520" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""in popularity in the first week basically,""" start="00:24:05.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then it trickles down""" start="00:24:08.680" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""to a fairly consistent level after that.""" start="00:24:10.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""I'm about to publish a last call for survey responses,""" start="00:24:11.960" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""so I'll see if any final bump happens,""" start="00:24:15.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""but this indicates that we can probably just""" start="00:24:18.280" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""have the survey open for a week or two""" start="00:24:20.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and that should be sufficient.""" start="00:24:23.080" video="mainVideo-survey" id="subtitle"]]
+[[!template new="1" text="""Alright, so what's the general plan going forwards?""" start="00:24:25.200" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Well, as stated earlier, the idea is to run this annually""" start="00:24:30.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and then consistently improve the questions,""" start="00:24:35.640" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""the experience, and the analysis that's done.""" start="00:24:38.400" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""This year has been the hardest by far""" start="00:24:41.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""because a lot had to be set up from scratch.""" start="00:24:43.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""The hope is that moving on from here,""" start="00:24:45.840" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""a lot of it can be reused.""" start="00:24:50.160" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""For example, with my comments about""" start="00:24:51.800" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""more sophisticated analysis being down the line,""" start="00:24:54.040" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""once that's all worked out,""" start="00:24:56.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""as long as nothing changes too drastically,""" start="00:24:58.440" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""we should be able to reuse a lot of that work""" start="00:25:00.720" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""quite easily in future years.""" start="00:25:03.560" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Alright, that's it for now.""" start="00:25:05.760" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""Hopefully, you've found this an interesting peek""" start="00:25:08.600" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""into how the survey is operated""" start="00:25:11.880" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and some of the initial results,""" start="00:25:13.360" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""and hopefully, I'll see you around next year""" start="00:25:15.320" video="mainVideo-survey" id="subtitle"]]
+[[!template text="""for the 2023 survey. Thanks for listening.""" start="00:25:18.920" video="mainVideo-survey" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20survey%3A%20Results%20of%20the%202022%20Emacs%20Survey)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/survey-before.md b/2022/info/survey-before.md
new file mode 100644
index 00000000..088e0197
--- /dev/null
+++ b/2022/info/survey-before.md
@@ -0,0 +1,28 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+<div class="vid"><video controls preload="none" id="survey-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="survey-mainVideo" data="""
+00:00.000 Introduction
+00:26.040 The 2020 Emacs User Survey
+01:54.360 The design of the survey
+03:18.560 Survey frameworks
+04:01.021 Writing a new survey framework in Julia
+05:40.200 In practice
+06:50.560 Results
+07:39.600 Going forward
+09:11.160 Responses
+11:17.000 Geography
+12:32.280 Gender
+14:04.440 Occupations
+16:11.320 Free and open source software
+17:02.440 Emacs versions
+17:56.360 Languages
+19:25.800 Prose
+20:03.400 Packages
+21:04.920 Documentation
+21:38.440 Moving forward
+22:44.200 Time
+23:26.200 How long the survey is open for
+24:25.200 Plan going forward
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.webm">Download --main.webm (16MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.opus">Download --main.opus (17MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-survey--results-of-the-2022-emacs-survey--timothy--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/gYfDLkR2DTkd1ZW54hXATW">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/survey-nav.md b/2022/info/survey-nav.md
new file mode 100644
index 00000000..20ca2a79
--- /dev/null
+++ b/2022/info/survey-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/sun-open">Sunday opening remarks</a>
+Next by track: <a href="/2022/talks/orgyear">This Year in Org</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/info/tramp-after.md b/2022/info/tramp-after.md
new file mode 100644
index 00000000..6d849143
--- /dev/null
+++ b/2022/info/tramp-after.md
@@ -0,0 +1,7 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+Questions or comments? Please e-mail [shoshin@cicadas.surf](mailto:shoshin@cicadas.surf?subject=Comment%20for%20EmacsConf%202022%20tramp%3A%20Elisp%20and%20the%20TRAMP%3A%20How%20to%20NOT%20write%20code%20you%20don%27t%20have%20to)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/tramp-before.md b/2022/info/tramp-before.md
new file mode 100644
index 00000000..1f37b892
--- /dev/null
+++ b/2022/info/tramp-before.md
@@ -0,0 +1,16 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+
+<div class="schedule-in-context schedule-svg-container" data-slug="tramp">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 10:00-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="94" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:10 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(483,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:30- 2:50 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="517" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(546,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:20- 3:40 Putting Org Mode on the Indieweb</title> <rect x="596" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:00- 4:05 Emacs development updates</title> <rect x="658" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(663,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:15- 4:25 Fanfare for the Common Emacs User</title> <rect x="682" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(695,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:45-10:55 justl: Driving recipes within Emacs</title> <rect x="164" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(177,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to" data-slug="tramp"> <title> 11:05-11:35 Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="196" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue" stroke-width="3"></rect> <g transform="translate(241,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)" font-weight="bold"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:10 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(389,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:35- 1:45 Top 10 reasons why you should be using Eshell</title> <rect x="431" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:10- 2:30 Emacs was async before async was cool</title> <rect x="486" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(515,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:05- 3:25 The Wheels on D-Bus</title> <rect x="572" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(601,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:20 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(687,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(94,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(188,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(282,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(376,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(470,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(564,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(658,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g> <g transform="translate(752,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 5</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 30-min talk followed by live Q&A (<https://emacsconf.org/current/tramp/room>)
+Status: Waiting for video from speaker
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T16:05:00Z" end="2022-12-04T16:35:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~11:05 AM - 11:35 AM EST (US/Eastern)</div><div class="others">Sunday, Dec 4 2022, ~11:05 AM - 11:35 AM EST (US/Eastern)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+
+
+# Description
+
+
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/tramp-nav.md b/2022/info/tramp-nav.md
new file mode 100644
index 00000000..11d3205f
--- /dev/null
+++ b/2022/info/tramp-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by time: <a href="/2022/talks/justl">justl: Driving recipes within Emacs</a>
+Next by time: <a href="/2022/talks/buttons">Linking personal info with Hyperbole implicit buttons</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/treesitter-after.md b/2022/info/treesitter-after.md
new file mode 100644
index 00000000..f34bdb39
--- /dev/null
+++ b/2022/info/treesitter-after.md
@@ -0,0 +1,257 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="treesitter-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hey everyone, my name is Abin Simon""" start="00:00:00.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and this talk is about &quot;Tree-sitter:""" start="00:00:03.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Beyond Syntax Highlighting.&quot;""" start="00:00:05.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For those who are not aware of what Tree-sitter is,""" start="00:00:08.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""let me give you a quick intro.""" start="00:00:10.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Tree-sitter, at its core, is a parser generator tool""" start="00:00:11.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and an incremental parsing library.""" start="00:00:17.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""What it essentially means is that it gives you""" start="00:00:19.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""an always up-to-date""" start="00:00:22.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""AST [abstract syntax tree] of your code.""" start="00:00:23.155" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""In the current Emacs frame, what you see to the right""" start="00:00:24.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""is the AST tree produced by Tree-sitter""" start="00:00:27.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""of the code that is on the left.""" start="00:00:30.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For example, if you go to this &quot;if&quot; statement,""" start="00:00:33.560" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""you can see it goes here.""" start="00:00:37.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It is also really good at handling errors.""" start="00:00:38.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For example, if I were to delete this [if statement],""" start="00:00:41.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""it still parses out a tree as much as it can,""" start="00:00:44.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but with an error node.""" start="00:00:47.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""Now let's see how we can query the tree""" start="00:00:50.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""to get the information that we need.""" start="00:00:51.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's first try to get all the identifiers in the buffer.""" start="00:00:54.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It highlights all the identifiers in the buffer,""" start="00:01:01.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but let's say we want to get something""" start="00:01:04.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""a little more precise.""" start="00:01:05.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's say we wanted to get this &quot;i&quot; here.""" start="00:01:07.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This, in our case, would be this identifier""" start="00:01:10.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""inside this assignment expression""" start="00:01:13.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""inside this &quot;for&quot; statement.""" start="00:01:15.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""We can write it out like this.""" start="00:01:27.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I hope this gives you a basic idea""" start="00:01:29.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""of how Tree-sitter works and how you can query""" start="00:01:31.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""to get the information that you need.""" start="00:01:34.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""First of all, let's see how Tree-sitter can help us""" start="00:01:37.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""with syntax highlighting.""" start="00:01:39.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is the default syntax highlighting by Emacs for SQL.""" start="00:01:41.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Now let's see how Tree-sitter helps.""" start="00:01:46.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is the syntax highlighting in Emacs""" start="00:01:52.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""which Tree-sitter enabled.""" start="00:01:54.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""You'll see that we're able to target""" start="00:01:56.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""a lot more things and highlight them.""" start="00:01:58.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""That said, you don't always have to""" start="00:02:01.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""highlight everything.""" start="00:02:03.139" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I personally prefer a much simpler theme.""" start="00:02:04.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""Now let's see how Tree-sitter helps you simplify""" start="00:02:15.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""adding custom syntax highlighting to your code.""" start="00:02:17.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is a Python file which has""" start="00:02:20.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""a class and a few member functions.""" start="00:02:22.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Anyone who has used Python will know that""" start="00:02:25.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""the &quot;self&quot; keyword, while it is passed in as an argument,""" start="00:02:27.680" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""it has more meaning than that.""" start="00:02:32.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's see if you can use Tree-sitter""" start="00:02:34.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""to highlight just the &quot;self&quot; keyword.""" start="00:02:35.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""If you look at the Tree-sitter tree,""" start="00:02:38.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""you can see that this is the first identifier""" start="00:02:40.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""in the list of parameters for a function definition.""" start="00:02:43.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is how you would query for the first identifier""" start="00:02:45.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""inside parameters inside a function definition.""" start="00:02:55.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Now, if you see here, it also matches &quot;cls&quot;,""" start="00:02:59.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but let's restrict it to match just &quot;self&quot;.""" start="00:03:02.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Now we have a Tree-sitter query that identifies""" start="00:03:11.360" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""the first argument to the function definition""" start="00:03:14.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and is also called &quot;self&quot;.""" start="00:03:16.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""We can use this to apply custom highlighting onto this.""" start="00:03:19.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is pretty much all the code""" start="00:03:22.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that you'll need to do this.""" start="00:03:25.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""The first block here is essentially to say to""" start="00:03:26.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Tree-sitter to highlight anything with python.self""" start="00:03:29.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""with the face of custom-set.""" start="00:03:32.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Now the second block here essentially is""" start="00:03:35.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""how we match for that.""" start="00:03:37.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Now if you go back into a Python buffer""" start="00:03:39.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and re-enable python-mode, we'll see that &quot;self&quot;""" start="00:03:41.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""is highlighted differently.""" start="00:03:44.680" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""How about creating text objects?""" start="00:03:47.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Tree-sitter can help there too.""" start="00:03:48.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For those who don't know, text objects""" start="00:03:50.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""is an idea that comes from Vim,""" start="00:03:53.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and you can do things like select word,""" start="00:03:54.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""delete word, things like that.""" start="00:03:57.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""There are other text objects like line and paragraph.""" start="00:04:00.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For each text object, you can have operations""" start="00:04:06.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that are defined on them.""" start="00:04:09.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For example, delete, copy, select, comment,""" start="00:04:09.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""all of these are operations that you can do.""" start="00:04:13.600" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's try and use Tree-sitter to add more text objects.""" start="00:04:16.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is a plugin that I wrote""" start="00:04:19.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""which lets you add more text objects into Emacs.""" start="00:04:20.560" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It helps you code aware text objects""" start="00:04:25.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""like functions, conditionals, loops, and such.""" start="00:04:27.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's see an example scenario of how""" start="00:04:31.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""something like this could come in handy.""" start="00:04:34.360" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For example, I can select inside this condition""" start="00:04:35.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""or inside this function and do things like that.""" start="00:04:39.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's say I want to take this conditional,""" start="00:04:42.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""move to the next function, and create it here.""" start="00:04:44.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""What I would do is something like""" start="00:04:47.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""delete the conditional, move to the next function,""" start="00:04:49.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""create a conditional there, and paste.""" start="00:04:52.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's try another example.""" start="00:04:56.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's say I want to take this and move it to the end.""" start="00:04:57.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""If I had to do it without text objects,""" start="00:05:01.360" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I'd probably have to go back to the previous comma,""" start="00:05:02.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""delete till next comma, find the closing bracket,""" start="00:05:06.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and paste before.""" start="00:05:10.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""That works, but let's see""" start="00:05:11.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""how Tree-sitter can simplify it.""" start="00:05:14.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""With Tree-sitter, I can say delete the argument,""" start="00:05:16.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""go to the end of the next argument, and then paste.""" start="00:05:19.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Tree-sitter essentially helps Emacs""" start="00:05:22.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""understand the code better semantically.""" start="00:05:25.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Here is yet another use case.""" start="00:05:27.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I work at a remote company,""" start="00:05:29.600" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and I often find myself being in a call""" start="00:05:31.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""with my teammates, explaining the code to them.""" start="00:05:33.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""And one thing that really comes in handy""" start="00:05:35.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""is the narrowing capability of Emacs.""" start="00:05:38.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Specifically, the fancy-narrow package.""" start="00:05:39.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I use it to narrow just the function,""" start="00:05:43.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""or I could narrow to the conditional.""" start="00:05:44.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""Next to the end, the list would be code folding.""" start="00:05:48.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is a package which uses Tree-sitter""" start="00:05:51.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""to improve the code folding functionalities of Emacs.""" start="00:05:54.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Code folding has always been this thing""" start="00:05:57.560" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that I've had a love-hate relationship with.""" start="00:06:00.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It usually works most of the time,""" start="00:06:02.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but then fails if the indentation is wrong""" start="00:06:04.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""or we do something weird with the arguments.""" start="00:06:06.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""But now with Tree-sitter in the mix,""" start="00:06:09.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""it's a lot more precise.""" start="00:06:11.680" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I can fold comments, I can fold functions,""" start="00:06:12.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I can fold conditionals. You get the idea.""" start="00:06:17.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""I work with Kubernetes, which means I end up""" start="00:06:20.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""having to write and read a lot of YAML files.""" start="00:06:23.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""And navigating big YAML files is a mess.""" start="00:06:28.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""The two main problems are figuring out where I am,""" start="00:06:31.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and two, navigating to where I want to be.""" start="00:06:35.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's see how Tree-sitter can help us with both of this.""" start="00:06:38.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is an example YAML file.""" start="00:06:41.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""To be precise, this is the values file""" start="00:06:43.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""of the Redis helm chart.""" start="00:06:47.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I'm somewhere in the file on tag under image,""" start="00:06:48.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but I don't know what this tag is for.""" start="00:06:52.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""But with the help of Tree-sitter,""" start="00:06:54.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I've been able to add this information""" start="00:06:57.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""into my header line.""" start="00:06:59.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""If you see in the header line,""" start="00:07:00.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""you'll see that I'm under sentinel.image.""" start="00:07:02.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Now let's see how this helps with navigation.""" start="00:07:05.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's say I want to enable persistence on master node.""" start="00:07:08.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""So with the help of Tree-sitter,""" start="00:07:12.680" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I was able to enumerate every field""" start="00:07:18.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that is available in this YAML file,""" start="00:07:20.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and I can pass that information onto imenu,""" start="00:07:22.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""which I can then use to go to exactly where I want to.""" start="00:07:24.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Also, since we're not dealing with""" start="00:07:28.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""any language specific constructs,""" start="00:07:30.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""this is very easy to extend to""" start="00:07:32.600" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""other similar languages""" start="00:07:34.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""or config files in this case.""" start="00:07:35.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""So for example, this is a JSON file,""" start="00:07:37.440" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and I can navigate to location or project.""" start="00:07:39.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""And just like in YAML, it shows me where I'm at.""" start="00:07:44.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I'm in projects.name,""" start="00:07:48.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""or I'm inside projects.highlights.""" start="00:07:49.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Or how about Nix?""" start="00:07:52.880" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is my home.nix file.""" start="00:07:55.600" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Again, I can search for services,""" start="00:07:57.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and this lists me all the services that I've enabled.""" start="00:08:01.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""How about just services.description?""" start="00:08:04.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""So this is all the services""" start="00:08:06.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that I've enabled and have descriptions.""" start="00:08:08.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""Now that we have seen this for config files,""" start="00:08:10.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""let's see how similar things apply for code.""" start="00:08:12.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Just like in config files,""" start="00:08:15.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I can see which function I'm under,""" start="00:08:16.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and if I go to the next function, it changes.""" start="00:08:18.680" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""Okay, here is something really awesome.""" start="00:08:21.560" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This is probably one of my favorites,""" start="00:08:23.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and one of the things that actually made me understand""" start="00:08:26.600" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""how powerful Tree-sitter is, and got me into it.""" start="00:08:30.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I work with a lot of Go code,""" start="00:08:34.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and anyone who has worked with Go will tell you""" start="00:08:35.680" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""how repetitive it is handling errors.""" start="00:08:38.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""For those who don't write Go,""" start="00:08:41.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""let me give you a rough idea of what I'm talking about.""" start="00:08:42.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""If you want to bubble up the error,""" start="00:08:45.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""the way you would do it is just to return the error""" start="00:08:47.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""to the function that called it.""" start="00:08:49.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Over here, you can either return nil or an empty value,""" start="00:08:51.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and at the end, you return error.""" start="00:08:55.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Let's try and use Tree-sitter to do this.""" start="00:08:57.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Using the help of Tree-sitter, let's make Emacs""" start="00:09:00.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""go back, figure out what the return arguments are,""" start="00:09:03.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""figure out what their default values are,""" start="00:09:06.422" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and automatically fill in the return statement.""" start="00:09:08.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It would look something like this.""" start="00:09:11.480" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""In my case, it filled in the complete form,""" start="00:09:13.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""it figured out what the return arguments are,""" start="00:09:16.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""what their types are,""" start="00:09:18.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and what their default values are,""" start="00:09:19.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and filled out the entire return.""" start="00:09:20.960" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""And since this is a template,""" start="00:09:22.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I can go to the next function, do the same thing,""" start="00:09:24.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""next function, do the same thing,""" start="00:09:27.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""next function, do the same thing.""" start="00:09:29.560" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""Here is a really fascinating use case of Tree-sitter,""" start="00:09:31.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""structural editing.""" start="00:09:34.360" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""You might be aware of plugins like paredit,""" start="00:09:36.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""which seems to &quot;know&quot; your code.""" start="00:09:38.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""This sort of takes it onto another level.""" start="00:09:40.280" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It is in its early stages, but what this lets you do""" start="00:09:42.520" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""is completely treat your code as an AST,""" start="00:09:46.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and edit as if it's a tree instead of characters.""" start="00:09:48.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""I am not going to go much in depth into it,""" start="00:09:52.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but if you're interested, there is a talk""" start="00:09:54.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""from last year's EmacsConf around it.""" start="00:09:57.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""I'm just going to end this with one last tiny thing""" start="00:09:59.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that I found in the tree-sitter-extras package.""" start="00:10:02.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It's this tiny macro called tree-sitter-save-excursion.""" start="00:10:04.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It works pretty much like save-excursion, but better.""" start="00:10:07.600" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It uses the Tree-sitter syntax tree""" start="00:10:11.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""instead of just the code""" start="00:10:13.400" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""to figure out where to restore the position.""" start="00:10:14.800" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""My main use case for this was with code formatters.""" start="00:10:16.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""Since the code moves around a lot""" start="00:10:20.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""when it gets formatted,""" start="00:10:22.080" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""save-excursion was completely useless,""" start="00:10:23.160" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""but this came in handy.""" start="00:10:25.000" video="mainVideo-treesitter" id="subtitle"]]
+[[!template new="1" text="""I'll just leave you off with""" start="00:10:26.240" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""what the future of Tree-sitter looks like for Emacs.""" start="00:10:28.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""So far, every Tree-sitter related feature""" start="00:10:31.120" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""that I've talked about is powered by this library.""" start="00:10:33.760" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""But there is talk about Tree-sitter coming into the core.""" start="00:10:36.040" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""It will most probably be landing in Emacs 29,""" start="00:10:42.320" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""and if you want to check out the work on Tree-sitter""" start="00:10:45.840" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""in core Emacs, you can check out""" start="00:10:48.720" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""the features/tree-sitter branch.""" start="00:10:51.200" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""You'll probably see more and more features and packages""" start="00:10:52.920" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""relying upon Tree-sitter, and even major modes""" start="00:10:56.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""being powered by Tree-sitter.""" start="00:10:59.640" video="mainVideo-treesitter" id="subtitle"]]
+[[!template text="""And that's a wrap from me. Thank you.""" start="00:11:01.560" video="mainVideo-treesitter" id="subtitle"]]
+
+
+
+Captioner: sachac
+
+Questions or comments? Please e-mail [mail@meain.io](mailto:mail@meain.io?subject=Comment%20for%20EmacsConf%202022%20treesitter%3A%20Tree-sitter%20beyond%20syntax%20highlighting)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/treesitter-before.md b/2022/info/treesitter-before.md
new file mode 100644
index 00000000..45e483d5
--- /dev/null
+++ b/2022/info/treesitter-before.md
@@ -0,0 +1,21 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, Abin Simon shares many ways in which Tree-sitter can help improve your text editing workflow. Afterwards, he will answer questions via IRC.
+
+<div class="vid"><video controls preload="none" id="treesitter-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="treesitter-mainVideo" data="""
+00:00.000 Opening
+00:24.201 Introduction to Tree-sitter
+00:50.280 Querying Tree-sitter tree
+01:37.040 Syntax highlighting
+02:15.640 Custom syntax highlighting
+03:47.120 Text objects
+05:48.760 Code folding
+06:20.480 Navigating config files
+08:10.480 Navigating code
+08:21.560 Intelligent templates
+09:31.520 Structural editing
+09:59.080 tree-sitter-save-excursion
+10:26.240 The future
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.webm">Download --main.webm (37MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.opus">Download --main.opus (8.1MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/4AKhgQA71ewnyhDUsBnfKt">View on Toobnix</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/treesitter-nav.md b/2022/info/treesitter-nav.md
new file mode 100644
index 00000000..9f8cda8a
--- /dev/null
+++ b/2022/info/treesitter-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/school">Back to school with Emacs</a>
+Next by track: <a href="/2022/talks/handwritten">How to incorporate handwritten notes into Emacs Orgmode</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/watch.md b/2022/info/watch.md
new file mode 100644
index 00000000..a72cd9bc
--- /dev/null
+++ b/2022/info/watch.md
@@ -0,0 +1,9 @@
+<!-- Automatically generated by emacsconf-publish-watch-pages -->
+[[!sidebar content=""]]
+# Tracks
+
+<table width="100%"><tr><th>Watch page</th><th>IRC channel (libera.chat)</th><th>Alternative for streaming player</th><th>Low res</th></tr>
+<tr><td><a href="/2022/watch/gen">General</a></td><td><a href="https://chat.emacsconf.org/?join=emacsconf-gen">#emacsconf-gen</a></td><td><a href="https://live0.emacsconf.org/gen.webm">https://live0.emacsconf.org/gen.webm</a></td><td><a href="${480p}">gen-480p.webm</a></tr>
+<tr><td><a href="/2022/watch/dev">Development</a></td><td><a href="https://chat.emacsconf.org/?join=emacsconf-dev">#emacsconf-dev</a></td><td><a href="https://live0.emacsconf.org/dev.webm">https://live0.emacsconf.org/dev.webm</a></td><td><a href="${480p}">dev-480p.webm</a></tr></table>
+
+<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <title> Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs"> <title> Back to school with Emacs</title> <rect x="75" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(106,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <title> How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="125" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(139,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <title> Writing and organizing literature notes for scientific writing</title> <rect x="191" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(222,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <title> Attending and organizing Emacs meetups</title> <rect x="400" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(414,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative"> <title> The Emacs Buddy initiative</title> <rect x="450" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(464,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <title> The ship that builds itself: How we used Emacs to develop a workshop for communities</title> <rect x="483" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas"> <title> Real estate and Org table formulas</title> <rect x="583" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(614,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <title> Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <title> Edit live Jupyter notebook cells with Emacs</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <title> orgvm: a simple HTTP server for org</title> <rect x="750" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(764,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <title> Tree-sitter beyond syntax highlighting</title> <rect x="100" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(114,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <title> lsp-bridge: complete asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(164,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <title> asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="183" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(197,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <title> Emacs should become a Wayland compositor</title> <rect x="241" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(255,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <title> Using SQLite as a data source: a framework and an example</title> <rect x="400" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(431,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <title> Revisiting the anatomy of Emacs mail user agents</title> <rect x="475" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(523,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <title> Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="583" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(614,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev"> <title> Bidirectional links with eev</title> <rect x="658" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(664,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs"> <title> Short hyperlinks to Python docs</title> <rect x="683" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(689,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs"> <title> Haskell code exploration with Emacs</title> <rect x="708" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(756,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g> <g transform="translate(0,150)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <title> Results of the 2022 Emacs Survey</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org"> <title> This Year in Org</title> <rect x="58" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(72,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <title> Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="100" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(131,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <title> Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="166" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(180,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <title> Linking personal info with Hyperbole implicit buttons</title> <rect x="216" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(230,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <title> Powerful productivity with Hyperbole and Org Mode</title> <rect x="400" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(448,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers"> <title> Org workflows for developers</title> <rect x="483" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(514,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers"> <title> GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="550" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(581,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <title> Putting Org Mode on the Indieweb</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <title> Fanfare for the Common Emacs User</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction"> <title> rde Emacs introduction</title> <rect x="100" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs"> <title> justl: Driving recipes within Emacs</title> <rect x="175" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(189,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <title> Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="208" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(256,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs"> <title> Getting detached from Emacs</title> <rect x="400" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(414,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <title> Top 10 reasons why you should be using Eshell</title> <rect x="458" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(472,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool"> <title> Emacs was async before async was cool</title> <rect x="516" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(547,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus"> <title> The Wheels on D-Bus</title> <rect x="608" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(639,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs"> <title> Pre-localizing Emacs</title> <rect x="700" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(731,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g></svg> \ No newline at end of file
diff --git a/2022/info/wayland-after.md b/2022/info/wayland-after.md
new file mode 100644
index 00000000..c4ee53cd
--- /dev/null
+++ b/2022/info/wayland-after.md
@@ -0,0 +1,163 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="wayland-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Hello EmacsConf and hello fellow Emacs fans.""" start="00:00:00.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""My name is Michael Bauer, and I'm from Germany.""" start="00:00:08.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I'm gonna talk to you about &quot;Why and how Emacs""" start="00:00:10.920" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""should become a Wayland compositor.&quot;""" start="00:00:13.440" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And it already kinda is a Wayland compositor.""" start="00:00:17.200" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""This talk is composed by Wayland and Emacs.""" start="00:00:21.740" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""If I'm talking about a Wayland compositor""" start="00:00:25.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""or Emacs as Wayland compositor,""" start="00:00:26.840" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I mean it in the sense that""" start="00:00:29.360" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""EXWM is an X window manager. I hope you know EXWM.""" start="00:00:30.440" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""So, why?""" start="00:00:36.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Emacs can do Wayland now, that was a stopper""" start="00:00:41.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""before, and now it's solved with `pgtk` branch.""" start="00:00:44.120" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It makes the Emacs toolbox bigger,""" start="00:00:49.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""which is always a good thing.""" start="00:00:53.240" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And the cool thing about Wayland, which is not""" start="00:00:55.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""possible under X is, it can run standalone""" start="00:00:58.440" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""on the Linux kernel interface, or nested under X,""" start="00:01:02.280" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""or even nested under Wayland.""" start="00:01:06.840" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""The compositor features of Emacs doesn't mean""" start="00:01:09.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""it has to take over the whole output.""" start="00:01:13.840" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It can use them, even if it's just like""" start="00:01:16.960" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""a normal window or normal program.""" start="00:01:20.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And last reason is,""" start="00:01:23.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I want to keep living inside Emacs""" start="00:01:25.120" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and Wayland is the future, apparently.""" start="00:01:27.240" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""EXWM use case is the first use case.""" start="00:01:31.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""You take a Wayland surface and put it inside""" start="00:01:35.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""an Emacs window. You see it right below.""" start="00:01:38.400" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""The video of me is a Wayland surface,""" start="00:01:41.520" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and it's inside an Emacs window managed by Emacs.""" start="00:01:45.880" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Emacs does the input, and the clipboard handling,""" start="00:01:50.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and can insert itself here, and do great things.""" start="00:01:53.480" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And it's a possibility to Lispify the Linux desktop,""" start="00:01:59.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""as Emacs Lispifies the command line.""" start="00:02:03.200" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""The other use case is the XWidget use case.""" start="00:02:08.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I don't know if you know XWidgets.""" start="00:02:12.960" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's embedded X windows inside Emacs.""" start="00:02:17.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""There's a web browser available in Emacs.""" start="00:02:19.720" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""With Wayland, you could embed anything that can""" start="00:02:24.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""create a Wayland surface like video, web, or 3D.""" start="00:02:27.520" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Think OpenGL, something like""" start="00:02:32.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""EmacsGL would be possible.""" start="00:02:34.880" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And we wouldn't have just images like we have so far.""" start="00:02:38.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""So, how to implement this Wayland compositor?""" start="00:02:46.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I'm going to tell you how I did it,""" start="00:02:50.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""or I did this demo I'm showing you right now.""" start="00:02:52.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""First of all, how does Wayland work?""" start="00:02:57.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Wayland is a protocol in XML.""" start="00:03:00.680" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's a server and client, and they share a set of""" start="00:03:04.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""objects, and the objects have methods.""" start="00:03:11.120" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""They are specified in the protocol,""" start="00:03:13.960" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and Wayland also says how the server""" start="00:03:16.120" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and client talk to each other.""" start="00:03:24.080" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""First blocker for Emacs becoming a Wayland""" start="00:03:25.720" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""compositor is that Emacs and Wayland both have""" start="00:03:33.440" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""their own event loop, and you can't merge them too.""" start="00:03:37.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""But you don't have to merge them""" start="00:03:41.880" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""because you can just make Emacs speak Wayland.""" start="00:03:45.800" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""So, Emacs becomes a Wayland client,""" start="00:03:48.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and there's an extra server Emacs is talking to.""" start="00:03:50.040" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""So, we need a minimal Wayland server that does all""" start="00:03:53.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""the stuff Emacs can't do and do the rest in Emacs.""" start="00:03:59.160" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""---The minimal Wayland server, I did it in wlroots.""" start="00:04:03.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""That's the library behind Sway. I think it's""" start="00:04:07.800" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""the Wayland library to do stuff like this.""" start="00:04:13.040" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I implemented four different things to make it work.""" start="00:04:20.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's these three letter acronyms on the left.""" start="00:04:26.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's Emacs, Wayland, and then it's a server,""" start="00:04:30.680" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""a client, a protocol, and buffers.""" start="00:04:34.520" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""The server is written in C and it's mostly tinywl.""" start="00:04:38.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's the example of wlroots,""" start="00:04:44.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and it's around 1000 lines of code.""" start="00:04:46.280" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""ewc, the Wayland client in Emacs,""" start="00:04:52.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""is the thing I'm most proud of.""" start="00:04:54.960" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's 300 lines of code, and it is a""" start="00:04:58.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""fully featured Wayland client in Emacs.""" start="00:05:02.120" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""With this, Emacs can speak Wayland,""" start="00:05:08.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and then I implemented Emacs Wayland protocol.""" start="00:05:11.640" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It more or less allows Emacs to become a Wayland""" start="00:05:18.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""window manager, so it's not actually the compositor.""" start="00:05:21.280" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""The compositor stays in C, but Emacs is""" start="00:05:24.640" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""now a Wayland window manager!""" start="00:05:27.680" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And the last thing is Emacs Wayland buffers.""" start="00:05:31.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's the window manager part.""" start="00:05:34.520" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's around 500 lines of code,""" start="00:05:35.880" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and it does the buffer management inside""" start="00:05:38.440" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Emacs windows, or floating right like you see me""" start="00:05:41.680" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""now floating on the right.""" start="00:05:45.680" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It works, but it is still buggy,""" start="00:05:48.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and it is also missing input handling,""" start="00:05:51.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""so there's more code to come for this to work.""" start="00:05:54.320" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Some caveats about this approach.""" start="00:06:01.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""wlroots is around 60 kilo LoCs (Line of Code)""" start="00:06:05.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and in active development.""" start="00:06:09.640" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""They have like a slogan 60 kilo locs of code""" start="00:06:12.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""you had to write anyway to make a Wayland""" start="00:06:16.640" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""compositor. And no, you don't have to write it.""" start="00:06:19.760" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""But I still remember when it was like 50 kilo locs,""" start="00:06:22.520" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and now it's 60. And it's like a moving target.""" start="00:06:25.840" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I think it could be quite a lot of work""" start="00:06:29.680" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""to keep up with it.""" start="00:06:32.480" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Yeah, it could be quite a bit of work.""" start="00:06:34.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Some windows don't like to keep the aspect ratios.""" start="00:06:41.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""You tell them and you have to crop them.""" start="00:06:46.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And the interface I use in wlroots for doing this,""" start="00:06:49.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""`wlr_scene`, can't do cropping yet,""" start="00:06:53.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""so this doesn't work.""" start="00:06:57.280" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Another problem is with GTK.""" start="00:07:01.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Once Wayland is enabled and it stays on.""" start="00:07:03.240" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""This doesn't make sense.""" start="00:07:11.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Okay, if you kill the Wayland server,""" start="00:07:12.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""GTK kills Emacs, that's not a good thing.""" start="00:07:15.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And it's still a bit of work and fussing needed""" start="00:07:18.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""to get this to work reliably.""" start="00:07:21.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It's quite buggy right now.""" start="00:07:23.640" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And that brings me to my call to action.""" start="00:07:26.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I think making Emacs Wayland capable is""" start="00:07:30.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""a further step to make an Emacs OS.""" start="00:07:34.440" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""It gains output and input handling.""" start="00:07:39.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Output handling is already there,""" start="00:07:41.360" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""input handling is still missing,""" start="00:07:44.120" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""but Emacs can manage monitors, outputs,""" start="00:07:45.760" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""different frames if it's like nested,""" start="00:07:49.720" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And inputs, keyboards, simulation keys,""" start="00:07:53.040" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""stuff like that.""" start="00:07:57.080" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""We could use it in more ways for Emacs display, maybe.""" start="00:07:58.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Wayland just manages simple pixel buffers,""" start="00:08:02.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""so it's a protocol for managing pixel buffers.""" start="00:08:05.720" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And in a sense, we could go back to""" start="00:08:09.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""the old X ways and maybe even ditch GTK.""" start="00:08:12.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I don't know, but why need it?""" start="00:08:15.560" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""We can composite without it.""" start="00:08:18.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Let's make buffer menus, buffer world, buffer.""" start="00:08:20.600" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Emacs Wayland protocol, like I did it,""" start="00:08:27.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""allows a very concise design, and it allows""" start="00:08:29.040" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""to improve on the EXWM code base.""" start="00:08:34.040" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""And I wrote KISS style because EXWM has""" start="00:08:38.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""workspace management integrated.""" start="00:08:41.840" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I don't think that's needed, like Emacs does it.""" start="00:08:45.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Why do you have to do something extra?""" start="00:08:50.600" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""So why do it?""" start="00:08:53.640" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""To finish the call to action,""" start="00:08:56.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""if this is the thing you want to see in Emacs,""" start="00:09:00.040" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""maybe you want to get involved, have some ideas,""" start="00:09:03.280" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""so we could discuss it.""" start="00:09:06.600" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I'm looking forward to discuss with you""" start="00:09:10.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""and hear your questions and ideas.""" start="00:09:14.960" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""I want to say a big thank you to the""" start="00:09:21.000" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""organizers of EmacsConf and the other speakers""" start="00:09:24.200" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""for making this event possible.""" start="00:09:26.600" video="mainVideo-wayland" id="subtitle"]]
+[[!template text="""Thank you, and see you.""" start="00:09:29.000" video="mainVideo-wayland" id="subtitle"]]
+
+Questions or comments? Please e-mail [perma-curious@posteo.de](mailto:perma-curious@posteo.de?subject=Comment%20for%20EmacsConf%202022%20wayland%3A%20Emacs%20should%20become%20a%20Wayland%20compositor)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/wayland-before.md b/2022/info/wayland-before.md
new file mode 100644
index 00000000..e257f59b
--- /dev/null
+++ b/2022/info/wayland-before.md
@@ -0,0 +1,10 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+# Talk
+
+<div class="vid"><video controls preload="none" id="wayland-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.webm">Download --main.webm (15MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.opus">Download --main.opus (6.1MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.org">Download --main.org</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/enc6bnYbm2gHpwrBa6bVjR">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="wayland-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.webm" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div>Listen to just the audio:<br /><audio controls preload="none" id="wayland-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.webm">Download --answers.webm (78MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-wayland--emacs-should-become-a-wayland-compositor--michael-bauer--answers.opus">Download --answers.opus (13MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/wayland-nav.md b/2022/info/wayland-nav.md
new file mode 100644
index 00000000..f4977e88
--- /dev/null
+++ b/2022/info/wayland-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/buddy">The Emacs Buddy initiative</a>
+Next by track: <a href="/2022/talks/meetups">Attending and organizing Emacs meetups</a>
+Track: <span class="sched-track Development">Development</span>
+</div>
diff --git a/2022/info/workflows-after.md b/2022/info/workflows-after.md
new file mode 100644
index 00000000..b9b92295
--- /dev/null
+++ b/2022/info/workflows-after.md
@@ -0,0 +1,451 @@
+<!-- Automatically generated by emacsconf-publish-after-page -->
+
+
+<a name="workflows-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello. Welcome to my first ever EmacsConf talk.""" start="00:00:00.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is really exciting for me.""" start="00:00:04.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I've done lots of conferences,""" start="00:00:06.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but rarely ones this technical and this nerdy.""" start="00:00:08.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I also feel like""" start="00:00:12.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I have something interesting to share.""" start="00:00:13.508" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I come to Emacs relatively late in my career,""" start="00:00:15.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""only about six years ago,""" start="00:00:18.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but I've been absolutely amazed""" start="00:00:20.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""at the innovation and commitment of the community""" start="00:00:22.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to do things their own way.""" start="00:00:25.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Oftentimes, these become things""" start="00:00:28.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that are not readily available anywhere else.""" start="00:00:30.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, as I've been using Emacs""" start="00:00:33.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""(and Org mode specifically)""" start="00:00:35.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""a great deal in my day-to-day workflows,""" start="00:00:37.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I've been leaning more and more into""" start="00:00:39.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""some of these tips and tricks.""" start="00:00:41.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I find that there is almost every day""" start="00:00:43.607" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that I discover some useful tweak""" start="00:00:46.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that can make my development better.""" start="00:00:48.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I want to share them with you now.""" start="00:00:50.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""[Future George]: Hey, hold on!""" start="00:00:53.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Who are you?""" start="00:00:54.874" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: I'm you from the future!""" start="00:00:56.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Oh, nice. How good.""" start="00:01:00.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""No, I'm you from, like, a month from now.""" start="00:01:02.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Look, you know how these talks are pre-recorded,""" start="00:01:05.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and you know how you've spent the last two years""" start="00:01:08.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""criticizing conference speakers""" start="00:01:10.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""for trying to do the same old thing""" start="00:01:12.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and not creatively adapting""" start="00:01:14.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to the online conference medium?""" start="00:01:15.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Well, you are recording this back in November.""" start="00:01:17.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm in December when everyone is watching this""" start="00:01:20.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""for the first time.""" start="00:01:23.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That is something we can do now.""" start="00:01:24.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: Okay, so this is a gimmick.""" start="00:01:27.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Cool! And I see you still haven't figured out""" start="00:01:29.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""how to remove backgrounds with OBS.""" start="00:01:32.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: Oh my god! It's such a pain,""" start="00:01:35.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I have to get a plugin or something.""" start="00:01:37.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, yes, it's kind of a gimmick,""" start="00:01:40.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but I also have a cool point.""" start="00:01:42.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""You know, how you just said""" start="00:01:44.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that you discover something new every day?""" start="00:01:46.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Well, your talk isn't that long,""" start="00:01:48.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I found a bunch of cool new workflow synths.""" start="00:01:49.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: Oh, okay, that makes sense.""" start="00:01:52.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm starting a new job in the intervening time.""" start="00:01:55.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: Exactly!""" start="00:01:58.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, I have more stuff I want to add.""" start="00:01:59.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: Oh, and I bet that""" start="00:02:02.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""once we set the ground rules,""" start="00:02:03.740" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the audience might have""" start="00:02:05.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""some of their own suggestions.""" start="00:02:07.136" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That is a good idea.""" start="00:02:08.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Okay, go away now.""" start="00:02:11.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: Fine, but""" start="00:02:11.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""aren't you gonna explain the dino?""" start="00:02:13.574" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: This is EmacsConf, dude.""" start="00:02:15.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""You think a dinosaur built out of""" start="00:02:18.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""boxes and old dishwasher parts""" start="00:02:20.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""is the weirdest background thing we'll see?""" start="00:02:22.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Both making dinosaur roaring sound: ROAAAAR!]""" start="00:02:24.207" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Okay, bye now.""" start="00:02:27.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Hey everyone, you heard the idea.""" start="00:02:30.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is going to be a thinly-veiled attempt""" start="00:02:33.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to show you stuff about""" start="00:02:35.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Emacs and Org mode, specifically,""" start="00:02:36.940" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that I think is super cool and immediately useful""" start="00:02:38.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""while you're doing development.""" start="00:02:41.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Let's define the scope of Org development workflow""" start="00:02:43.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""as something specific you do with Org mode""" start="00:02:46.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that helps in certain common""" start="00:02:49.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""development related activities.""" start="00:02:50.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, tie-dye me from the future said""" start="00:02:52.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""he's got some more ideas""" start="00:02:54.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""beyond what I'm presenting here.""" start="00:02:56.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm sure many of you have ideas as well.""" start="00:02:58.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, we're going to share a collaborative document,""" start="00:03:01.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and let's all as we're listening to this""" start="00:03:07.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""be talking, and chatting, and entering""" start="00:03:10.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""our own ideas and workflows,""" start="00:03:11.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""so that we can learn and improve together.""" start="00:03:13.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""And now with that, let's begin.""" start="00:03:15.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I've got a ton of ground to cover,""" start="00:03:17.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I want to start by talking about note-taking.""" start="00:03:20.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Shrink down! [transition]""" start="00:03:23.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Note-taking is incredibly important.""" start="00:03:25.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""We can't keep all this stuff in our heads.""" start="00:03:30.074" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, for example, I find myself with""" start="00:03:33.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the need to learn about the solid project.""" start="00:03:36.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This right here is the solid project,""" start="00:03:41.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I want to play around with it.""" start="00:03:44.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I am going to start by creating a note for it.""" start="00:03:47.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, one of the things that I want to do""" start="00:03:50.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""is explore one of their tutorials.""" start="00:03:53.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That's the site I just saw.""" start="00:03:57.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I can go ahead and create a note for myself.""" start="00:03:58.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Right, &quot;Solid React Example&quot;,""" start="00:04:03.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and maybe a set of stuff ending on there.""" start="00:04:10.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to clone this project,""" start="00:04:12.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which I've already done,""" start="00:04:14.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I can pull it up right here.""" start="00:04:15.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, I can pull it up right here,""" start="00:04:18.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I can now start to explore it.""" start="00:04:22.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, for example, this code base sounds…,""" start="00:04:24.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it seems interesting.""" start="00:04:26.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to want to""" start="00:04:27.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""store a link to this in my code.""" start="00:04:28.996" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to run `org-store-link`,""" start="00:04:31.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I can come in here and say,""" start="00:04:34.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""let's explore structure. Local link,""" start="00:04:37.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and here I'm going to put that right there.""" start="00:04:48.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, at any given time I can come into this note""" start="00:04:50.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and be thrown right into the structure.""" start="00:04:52.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""I want to go and now start investigating the code,""" start="00:04:54.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but before doing that""" start="00:04:58.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to take an extra step""" start="00:05:02.474" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and customize the Org capture system.""" start="00:05:08.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to create a playground node here,""" start="00:05:13.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where I can do whatever.""" start="00:05:16.297" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, what does this template do?""" start="00:05:17.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Well, it's just going to create a new template.""" start="00:05:20.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And whenever I hit the s key,""" start="00:05:22.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it is going to go ahead and add a new heading""" start="00:05:24.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to which I will enter,""" start="00:05:31.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and it's going to grab a link""" start="00:05:36.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to wherever I'm pointing at,""" start="00:05:38.326" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and any highlighted code""" start="00:05:39.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""will also be inserted into a source block,""" start="00:05:41.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and eventually, drop my cursor""" start="00:05:44.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where I can work on it.""" start="00:05:49.407" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, we can grab our template,""" start="00:05:52.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and the one thing I'm going to need to add it here""" start="00:05:55.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""is to say what file this goes to.""" start="00:05:57.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to copy the name of this file,""" start="00:05:59.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and put it right in there.""" start="00:06:03.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to go ahead now run this template.""" start="00:06:08.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Now, we can explore our code.""" start="00:06:10.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""For example, I can look in the server,""" start="00:06:14.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and say, &quot;Oh yeah, this slide looks interesting.""" start="00:06:16.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Go ahead and capture that.&quot;""" start="00:06:18.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""There you see our template.""" start="00:06:21.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""You see, yeah, this is Next.js app,""" start="00:06:23.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and you can see it got added right in here""" start="00:06:26.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""right next to my other code.""" start="00:06:29.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, that's interesting.""" start="00:06:33.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I can always go ahead and click that link,""" start="00:06:34.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and get thrown directly to where in the code I was.""" start="00:06:36.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm kind of building up my own dashboard""" start="00:06:40.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""as I explore this project""" start="00:06:43.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""of interesting points within the project.""" start="00:06:45.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""One of the things I noticed here""" start="00:06:49.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""by looking at the file structure is that""" start="00:06:52.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""there is an area for certificates.""" start="00:06:57.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That's a little unusual, so we'll make a note""" start="00:07:02.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""of that by again running `org-store-link`.""" start="00:07:05.625" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This comes with certificates,""" start="00:07:08.007" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""so we'll put that there.""" start="00:07:12.707" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""One of the good standbys is,""" start="00:07:18.007" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""just to use our regular shell commands.""" start="00:07:21.607" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, we will go ahead and say,""" start="00:07:23.540" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the default directory for this is our project.""" start="00:07:26.774" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And we can go ahead and say,""" start="00:07:29.807" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""`cat certificates/localhost.key`,""" start="00:07:31.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and then we'll output the first five lines of it,""" start="00:07:38.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""just to make sure it's a regular certificate.""" start="00:07:43.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Now, notice this got broken up a little bit.""" start="00:07:45.848" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is due to Emacs auto formatting.""" start="00:07:49.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""We can come in here, and tell it to""" start="00:07:51.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""format it as code,""" start="00:07:55.866" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which will be the same as this block right here.""" start="00:07:57.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, there are other options available.""" start="00:07:59.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""If, for example, we don't want [it]""" start="00:08:02.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to be a shell block,""" start="00:08:05.453" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""we wanted a Python block for some reason,""" start="00:08:06.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""we do `:wrap src python`, and execute that,""" start="00:08:09.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and it's now wrapped as a Python block,""" start="00:08:15.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but I like it as a shell.""" start="00:08:18.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Let's, for example, go down into pages here""" start="00:08:21.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and look at this document file.""" start="00:08:24.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""We're saying, &quot;Okay. Well, this looks interesting""" start="00:08:25.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""maybe highlight that,&quot; and we'll go ahead""" start="00:08:29.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and capture that template""" start="00:08:32.474" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and say, grab all this code and paste it in here.""" start="00:08:36.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, there is a bug at the moment,""" start="00:08:39.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where if you highlight more than one lines of code,""" start="00:08:42.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the link will not work, and that honestly""" start="00:08:46.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""might be something I look into fixing.""" start="00:08:50.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""One of the things that might be useful here""" start="00:08:54.540" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""would be to check out""" start="00:08:57.507" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""how this file has evolved over time.""" start="00:08:59.274" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""To do that, I'm going to use Magit.""" start="00:09:02.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'll pull up a log.""" start="00:09:05.340" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Look, there's only a single change.""" start="00:09:09.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to run a command""" start="00:09:11.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""called `orgit-store-link`,""" start="00:09:13.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and now I can come in here and say,""" start="00:09:16.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""&quot;It's only changed once.&quot;""" start="00:09:22.174" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Go ahead and insert that link.""" start="00:09:26.207" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, this file…""" start="00:09:30.507" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the arguments here are kind of weird,""" start="00:09:33.340" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and in fact, if I click this,""" start="00:09:35.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it will actually go to the full log of that branch.""" start="00:09:38.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""However, we can fix that pretty easily.""" start="00:09:42.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Grab the path of our file,""" start="00:09:45.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and this right here is really just the arguments""" start="00:09:49.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that are passed into the log command.""" start="00:09:53.874" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, here we go, we put that in there,""" start="00:09:56.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and there we go. We get the full file history.""" start="00:09:58.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Now, I want to actually build the program.""" start="00:10:04.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, &quot;Build the app.&quot;""" start="00:10:09.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now, I could of course run it as a shell, right.""" start="00:10:16.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""`npm ci`. The problem with that is that""" start="00:10:18.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Emacs is single-threaded. So, if I were to do that,""" start="00:10:22.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the entire time while it was running,""" start="00:10:26.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it would be locking out my Emacs.""" start="00:10:30.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Additionally, I might not actually want""" start="00:10:33.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""all that scroll--`npm ci` produces a lot of it--""" start="00:10:35.740" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""actually in my document.""" start="00:10:38.707" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So instead, what we could do is""" start="00:10:40.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""use an Emacs Lisp function,""" start="00:10:43.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and it's called `async-shell-command`.""" start="00:10:46.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And when you run something in async-shell-command,""" start="00:10:49.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it's going to a comint buffer with a process""" start="00:10:52.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""attached to it, and run it in there.""" start="00:10:58.007" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I will need to set the directory here first,""" start="00:11:00.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and since, again, this is going to be""" start="00:11:04.907" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""opening up in a new buffer.""" start="00:11:07.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I don't need to see that.""" start="00:11:08.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going to run it.""" start="00:11:09.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And what's going to happen is""" start="00:11:11.407" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""this is actually not going to work.""" start="00:11:13.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And it doesn't work,""" start="00:11:17.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Not for any particular reason I can control.""" start="00:11:18.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""It's unfortunately that the repo is broken,""" start="00:11:20.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but that is a totally valid""" start="00:11:24.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""result of our investigation.""" start="00:11:26.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""One of the things that I really love""" start="00:11:29.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to do with Org mode is to actually use it for""" start="00:11:33.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""literate programming,""" start="00:11:37.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""because Org mode has a pretty capable""" start="00:11:38.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""code generation facility built into it.""" start="00:11:43.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""It's called tangling.""" start="00:11:46.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, if I go ahead and take my document...""" start="00:11:47.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is for a little Arduino project,""" start="00:11:51.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where I was figuring out to spin things around""" start="00:11:54.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""using an old Roomba motor.""" start="00:11:56.907" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I can go ahead and write a script like this,""" start="00:12:00.074" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and then notice, I use the tangle variable""" start="00:12:05.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that is just going to determine""" start="00:12:09.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where that file gets written""" start="00:12:11.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""when we call the command `org-babel-tangle`.""" start="00:12:13.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, if I go ahead and run this,""" start="00:12:17.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you can see down in the minibuffer,""" start="00:12:20.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it's going to write to""" start="00:12:21.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""`/tmp/go-batsy-playground/go-batsy-playground.ino`.""" start="00:12:23.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That's where this right here would write,""" start="00:12:26.707" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and then I could run commands on it.""" start="00:12:29.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Then I want to start being able to use this""" start="00:12:33.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to build out a program.""" start="00:12:36.574" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I'm going ahead and writing in prose""" start="00:12:38.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and interspersing it with code.""" start="00:12:42.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, it's the inverse of code,""" start="00:12:43.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""in which you intersperse comments, [here]""" start="00:12:47.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you write prose, and then you intersperse code""" start="00:12:49.374" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where as needed.""" start="00:12:51.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Tangle is implicitly defined up at the higher level""" start="00:12:54.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""in this property block right here,""" start="00:12:58.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which I will talk about in a little bit.""" start="00:12:59.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""But if you want to see what properties""" start="00:13:02.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""are available at any given time,""" start="00:13:04.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you can hit `org-babel-view-src-block-info`""" start="00:13:07.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""right there, and you can see that tangle is enabled.""" start="00:13:10.140" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""All of these blocks have the exact same tangle.""" start="00:13:14.274" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""If I run and see what it is, it's just going to""" start="00:13:16.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""write to this directory to `go-batsy.ino`.""" start="00:13:20.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""`org-babel-tangle` is going to go ahead""" start="00:13:23.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and tangle all these source code blocks,""" start="00:13:28.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I can go ahead and look at my file""" start="00:13:30.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and here it is.""" start="00:13:33.174" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is the full Arduino file""" start="00:13:34.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that was generated from there.""" start="00:13:36.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I start writing code here,""" start="00:13:37.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and I'm basically doing it in a prose way.""" start="00:13:40.807" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""As I'm thinking about it,""" start="00:13:43.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I write down what I'm going to do.""" start="00:13:44.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now these braces, we haven't seen these before.""" start="00:13:46.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""This is an aspect of Org called `noweb`,""" start="00:13:49.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which again is not too much of a""" start="00:13:52.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""templating system too.""" start="00:13:55.374" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""But it does one thing, which is insert code,""" start="00:13:56.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which turns out to be enough.""" start="00:13:58.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, this right here basically says,""" start="00:14:00.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""take that block with that exact name""" start="00:14:03.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and just insert here.""" start="00:14:08.507" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""If you want to see exactly what a block expands to,""" start="00:14:09.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you're going to come in here.""" start="00:14:13.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""You're going to run `org-babel-expand-src-block`,""" start="00:14:15.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and there we go. That's what this block expands to.""" start="00:14:18.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That's what all those places""" start="00:14:21.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""of this little bits and pieces expand to.""" start="00:14:22.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, that becomes really useful, and notice""" start="00:14:24.807" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""basically we just take these little blocks""" start="00:14:28.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that are not going to be tangled directly""" start="00:14:29.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but it will be in this other block.""" start="00:14:32.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And we turn off their tangling.""" start="00:14:33.920" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Now that you have some sort of tangling,""" start="00:14:38.074" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you want to be able to interact with those files""" start="00:14:40.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that are written to that directory.""" start="00:14:42.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, right here I have an area""" start="00:14:46.707" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where I can do things like run a compiler.""" start="00:14:48.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Now what does that compiler do?""" start="00:14:52.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Well, this right here references""" start="00:14:55.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""a source code block that appears in another Org file.""" start="00:14:57.841" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And I find that when doing these sort of things""" start="00:15:01.874" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it can be useful to have a little""" start="00:15:04.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""utility Org directory.""" start="00:15:06.007" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, here it is, `org/ci.org`.""" start="00:15:08.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is just part of my repo.""" start="00:15:10.374" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""We open up, and here we go.""" start="00:15:11.640" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I have a compile function.""" start="00:15:14.140" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Basically, it's doing some stuff""" start="00:15:15.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to clean up things correctly.""" start="00:15:18.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""But then using that same `async-shell-command`""" start="00:15:20.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to open things up and a new buffer.""" start="00:15:23.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""In this case, named after""" start="00:15:26.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""whatever heading it was under.""" start="00:15:28.674" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And then we're going to go ahead and inside of it""" start="00:15:31.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""run Arduino CLI command to compile,""" start="00:15:35.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and pass that into `watchexec`.""" start="00:15:39.874" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which is a little Rust program""" start="00:15:43.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that watches inode[??] files for any changes,""" start="00:15:46.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and when they detect them, we will run this.""" start="00:15:49.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""If I were to, for example, add a line here,""" start="00:15:51.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and now run `org-babel-tangle`,""" start="00:15:56.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you can see watchexec immediately""" start="00:15:59.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""picks it up and restarts it.""" start="00:16:02.400" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""Now it's kind of a pain to remember""" start="00:16:04.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to run `org-babel-tangle` all the time.""" start="00:16:07.475" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, I can come here and click this button.""" start="00:16:09.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""It asks me to execute it there.""" start="00:16:13.807" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And what does that do?""" start="00:16:17.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Here you go. It's just a very simple hyperlink,""" start="00:16:18.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""but to the Elisp protocol.""" start="00:16:23.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""The Elisp protocol just adds a hook that says,""" start="00:16:25.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""whenever a document is saved, run `org-babel-tangle`.""" start="00:16:30.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And now that I've run that, I can go ahead,""" start="00:16:35.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""come in here, and delete that.""" start="00:16:37.600" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And look at that. It tangles automatically for me.""" start="00:16:39.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Because I don't want to actually have this""" start="00:16:42.340" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""playground script tangle to my real file,""" start="00:16:45.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I need this concept of""" start="00:16:49.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""some sort of workspace directory.""" start="00:16:51.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And a workspace directory""" start="00:16:52.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""what I really want is a variable that is tied to""" start="00:16:54.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""where in my document hierarchy this appears.""" start="00:16:58.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I want a dynamically scoped variable""" start="00:17:02.674" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that's scoped to my document.""" start="00:17:06.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And you can do that. For example, in this case,""" start="00:17:08.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I have in my properties""" start="00:17:12.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""a key value declared `workspace-directory`,""" start="00:17:15.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[it] goes into a temp directory.""" start="00:17:20.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And here, by running `org-get-entry`""" start="00:17:22.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""starting at the current point,""" start="00:17:24.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""find `workspace-directory`""" start="00:17:25.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""with a second parameter 1.""" start="00:17:27.507" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""You can see down in the minibuffer,""" start="00:17:28.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""goes to `/tmp/go-batsy-playground/`.""" start="00:17:31.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This right here is going to override""" start="00:17:37.174" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the `workspace-directory` at the top level,""" start="00:17:42.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which is dot. Dot means here.""" start="00:17:44.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""That's what makes sure""" start="00:17:47.607" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that the rest of these tangle to""" start="00:17:48.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that go-batsy file right relevant to here.""" start="00:17:50.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And that does mean that we need""" start="00:17:54.560" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""a little bit more complex thing here.""" start="00:17:55.740" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, we're saying go ahead and `org-entry-get`""" start="00:17:58.207" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the `workspace-directory`.""" start="00:18:01.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""If anyone hasn't seen this syntax,""" start="00:18:04.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""this dash arrow is from the dash.el library,""" start="00:18:06.807" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which is basically a big library of all""" start="00:18:16.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""the utility functions that you wish""" start="00:18:19.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Emacs Lisp had. They're well-named.""" start="00:18:20.940" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I highly, highly recommend it.""" start="00:18:22.880" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""This is the threading operator.""" start="00:18:24.480" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, we're just basically taking it,""" start="00:18:26.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""getting the `workspace-directory`,""" start="00:18:28.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""if it happens to be dot, then we're just going to""" start="00:18:29.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""return the current directory,""" start="00:18:32.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""otherwise whatever directory said.""" start="00:18:33.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""And then I want to just take a moment""" start="00:18:36.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and look at the rest of this structure.""" start="00:18:39.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, `workspace-directory` we talked about.""" start="00:18:41.280" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""`header-args` if you noticed, none of my""" start="00:18:43.080" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""code blocks for the most part""" start="00:18:46.774" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""have any header arguments.""" start="00:18:48.707" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""You can drop the `header-args` property,""" start="00:18:50.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""which is going to be header arguments""" start="00:18:53.174" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""that are added automatically""" start="00:18:55.607" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to all source code blocks under this heading.""" start="00:18:57.840" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""`header-args+`. Well,""" start="00:19:03.407" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""sometimes you don't want to type…""" start="00:19:05.407" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you have a bunch of args,""" start="00:19:06.540" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""you don't want to type them out""" start="00:19:07.507" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""in this one big line.""" start="00:19:08.240" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""So, you basically are adding a new header-arg""" start="00:19:09.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to the existing list of header.""" start="00:19:13.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And then you can have header-args that are specific""" start="00:19:15.407" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""to certain languages, like, for example,""" start="00:19:18.160" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""this `default-directory` var is going to be set""" start="00:19:20.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""for all Emacs Lisps.""" start="00:19:23.720" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""And for all Arduinos, evaluation will be disabled,""" start="00:19:25.200" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""and tangling will be automatically enabled.""" start="00:19:29.574" video="mainVideo-workflows" id="subtitle"]]
+[[!template new="1" text="""These are just some of the workflows that become""" start="00:19:32.440" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""useful when you're actually doing the coding.""" start="00:19:35.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: Oh, hello again!""" start="00:19:38.320" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Me from the six months from now.""" start="00:19:41.374" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: Cool.""" start="00:19:45.307" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: The talk got over, people liked it,""" start="00:19:49.107" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""thought the pacing was all over the place.""" start="00:19:51.000" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: Yeah, I had to cut two thirds of it,""" start="00:19:53.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""going to be filling in those gaps in the Etherpad.""" start="00:19:56.360" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: And the editing was uneven, at best.""" start="00:19:59.800" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[George]: I got way better at it""" start="00:20:03.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""as I worked on it, didn't I?""" start="00:20:05.507" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Kdenlive is pretty cool.""" start="00:20:06.680" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""But yeah, I wanted to take a shot at""" start="00:20:09.960" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""something different, and I figured if anyone can""" start="00:20:13.540" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""appreciate trying something different,""" start="00:20:16.040" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""it's EmacsConf, right?""" start="00:20:17.760" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""I hope people found it useful.""" start="00:20:20.120" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""[Future George]: Yeah, some did.""" start="00:20:21.520" video="mainVideo-workflows" id="subtitle"]]
+[[!template text="""Oh, I should tell you about the coming Orca war.""" start="00:20:22.600" video="mainVideo-workflows" id="subtitle"]]
+
+
+
+Captioner: bhavin192
+
+Questions or comments? Please e-mail [gmauer+emacsconf@gmail.com](mailto:gmauer+emacsconf@gmail.com?subject=Comment%20for%20EmacsConf%202022%20workflows%3A%20Org%20workflows%20for%20developers)
+
+
+<!-- End of emacsconf-publish-after-page -->
diff --git a/2022/info/workflows-before.md b/2022/info/workflows-before.md
new file mode 100644
index 00000000..5102cc01
--- /dev/null
+++ b/2022/info/workflows-before.md
@@ -0,0 +1,56 @@
+<!-- Automatically generated by emacsconf-publish-before-page -->
+In this talk, George Mauer demonstrates several ways that Org Mode can help people explore and develop code. Afterwards, he will handle questions via BigBlueButton.
+
+
+The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="workflows">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect stroke-width="3" x="454" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 21-min talk followed by live Q&A (done)
+Etherpad: <https://pad.emacsconf.org/2022-workflows>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T18:50:00Z" end="2022-12-04T19:15:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~1:50 PM - 2:15 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~12:50 PM - 1:15 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~11:50 AM - 12:15 PM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~10:50 AM - 11:15 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~6:50 PM - 7:15 PM UTC <br />Sunday, Dec 4 2022, ~7:50 PM - 8:15 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~8:50 PM - 9:15 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~12:20 AM - 12:45 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~2:50 AM - 3:15 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~3:50 AM - 4:15 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+# Talk
+
+<div class="vid"><video controls preload="none" id="workflows-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="workflows-mainVideo" data="""
+00:00.000 Introduction
+00:53.960 The future
+02:30.200 Org development workflows
+03:15.680 Taking notes
+04:54.600 org-capture templates
+06:10.680 Building up a dashboard
+06:49.160 org-store-links
+07:45.680 Formatting
+08:21.480 Pasting code
+08:52.200 Git
+10:04.960 async-shell-command
+11:29.040 Literate programming and tangling
+13:47.840 Noweb
+14:36.400 Running commands
+16:04.480 Buttons
+16:43.600 Workspaces
+18:04.800 dash
+18:36.000 Header arguments
+19:29.920 Conclusion
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.webm">Download --main.webm (111MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.opus">Download --main.opus (13MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/bRD59ZVoJk1zpNnchaygk4">View on Toobnix</a></li></ul></div></div>
+
+# Q&A
+
+<div class="vid"><video controls preload="none" id="workflows-qanda"><source src="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="workflows-qanda" data="""
+00:00.000 Introduction
+01:23.774 Q1 - Does it become unwieldy due to the interaction of the edit org-source to use org-mode and the virtual linear programming as the project becomes larger?
+02:38.982 Q2 - I want to take a look at the files used in your demo, are they somewhere online?
+03:16.080 Digression - some explanations about the background dinosaur :D
+04:54.960 Information about org-entry-get
+05:49.640 Are workflows as they are in your life closely tied to particular projects or are they general workflows? - Long discussion about the workflow!
+13:32.960 Wrapping up
+
+"""]]<div>Listen to just the audio:<br /><audio controls preload="none" id="workflows-qanda-audio" src="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.opus"></audio></div><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.webm">Download --answers.webm (27MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.vtt">Download --answers.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-workflows--org-workflows-for-developers--george-mauer--answers.opus">Download --answers.opus (5.9MB)</a></li></ul></div></div>
+# Description
+<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2022/info/workflows-nav.md b/2022/info/workflows-nav.md
new file mode 100644
index 00000000..a3a5989b
--- /dev/null
+++ b/2022/info/workflows-nav.md
@@ -0,0 +1,7 @@
+
+<div class="talk-nav">
+Back to the [[talks]]
+Previous by track: <a href="/2022/talks/eshell">Top 10 reasons why you should be using Eshell</a>
+Next by track: <a href="/2022/talks/async">Emacs was async before async was cool</a>
+Track: <span class="sched-track General">General</span>
+</div>
diff --git a/2022/meetings.org b/2022/meetings.org
new file mode 100644
index 00000000..e3c01a47
--- /dev/null
+++ b/2022/meetings.org
@@ -0,0 +1,21 @@
+#+OPTIONS: toc:nil
+
+#+begin_export md
+[[!meta title="Meeting notes"]]
+[[!meta copyright="Copyright &copy; 2022 Amin Bandali, Sacha Chua, David O'Toole, Corwin Brust, Leo Vivier, Daniel Gopar"]]
+<!-- Automatically generated from meetings.org -->
+#+end_export
+
+* [2022-05-28 Sat 16:00] CFP meeting
+- CFP: Should it be a call for /proposals/ or /propositions/?
+ - “Proposition” might be friendlier
+
+- Calendar
+ - We’re not going to conflict with SEAGL this year.
+ - Having it on the first week-end of December isn’t too bad. People have told us that holding the conference in December would lead to a scarcer viewership because of travelling; however, the first weekend of December should be pretty safe. If we need to get Christmassy, we will do what must be done (i.e. wear funny hats).
+ - We can still keep the earlier date as a backup in case many people complain.
+ - As a result, the official date for the next EmacsConf is (tentatively) [2022-12-03 Sat]--[2022-12-04 Sun].
+ - We’re not sure if we need more time to prepare for EmacsConf 2022.
+ - If we want a CFP that finishes earlier, the problem is that the CFP might start and finish during the Summer break.
+ - We’re having many questions about the parameters that we should consider for the calendar; since there’s no rush, we can take some extra time to consider the ramifications of our decisions.
+ - We’ve updated the times in [[cfp.org][cfp.org]].
diff --git a/2022/organizers-notebook.bash b/2022/organizers-notebook.bash
new file mode 100644
index 00000000..80af7bb9
--- /dev/null
+++ b/2022/organizers-notebook.bash
@@ -0,0 +1,10 @@
+while read p; do
+ mkdir -p "$p";
+ cd "$p";
+ wget "https://bbb.emacsverse.org/presentation/${p}/slides_new.xml" \
+ "https://bbb.emacsverse.org/presentation/${p}/video/webcams.webm" \
+ "https://bbb.emacsverse.org/presentation/${p}/deskshare.xml" \
+ "https://bbb.emacsverse.org/presentation/${p}/deskshare/deskshare.webm" \
+ "https://bbb.emacsverse.org/presentation/${p}/metadata.xml"
+ cd ..;
+done <ids.txt
diff --git a/2022/organizers-notebook.md b/2022/organizers-notebook.md
new file mode 100644
index 00000000..44837dee
--- /dev/null
+++ b/2022/organizers-notebook.md
@@ -0,0 +1,8533 @@
+<!-- organizers-notebook.md is exported from organizers-notebook/index.org, please modify that instead. -->
+[[!sidebar content=""]]
+
+This file is automatically exported from [/2022/organizers-notebook/index.org](/2022/organizers-notebook/index.org). You might prefer to navigate this as an Org file instead. To do so, [clone the wiki repository](https://emacsconf.org/edit/).
+
+
+# Table of Contents
+
+- [Overall priorities](#overall)
+- [Next comms update](#update)
+- [Projects and other long-running tasks](#projects)
+- [Ideas for next year](#maybe-projects):nextyear:
+- [Things to figure out / decisions to make](#decisions)
+- [Roles needed](#roles)
+- [Infrastructure notes](#infra)
+- [Other tasks and processes](#other)
+- [In case of](#exceptions)
+- [Task archive](#archive)
+- [Communications](#comms)
+- [Supporting code](#code)
+- [Lessons learned](#lessons)
+
+Projects and tasks:
+
+- [Harvest live talks and Q&A](#harvest)
+- [Send thanks](#thanks)
+- [Finalize the files to be used for streaming](#files)
+- [Look for ways to reduce risk](#derisk):derisk:
+- [Make checkin and Q&A process slide](#qa):sachac:
+- [Caption talks and make chapter headings](#caption)
+- [Prepare intros for the hosts to read](#host-intros)
+- [Set up talks on Toobnix and YouTube](#video-platforms):sachac:yt:toobnix:
+- [Do another run](#dry-run)
+- [Turn off file upload service on media.emacsconf.org](#upload-off):sachac:infra:
+- [Review notebook for tasks, priorities, and scheduling](#review)
+- [Use Mumble for backchannel coordination and also on-stage](#mumble)
+- [Satellite events](#satellite)
+- [Volunteer update](#volunteer-2022-11-14)
+- [Make a linear hyperlist for managing EmacsConf](#hyperlist):sachac:
+- [Record intro/outro for day-1 and day-2](#rec-intro):zaeph:
+- [Add category tags and possibly links between talks across 2022 and all previous years](#link-pages):quiliro:wiki:
+- [JS/CSS enhancement](#watch-css):emacsconf:
+- [Build up the ansible playbook](#ansible):sachac:opal:
+- [Consider breakout rooms for lunch break](#breakouts)
+- [Work on the OBS scenes](#obs-scenes):zaeph:corwin:sachac:
+- [Plan Etherpad use and hosting](#etherpad):sachac:ansible:
+- [Write about EmacsConf behind the scenes](#writing):sachac:
+
+Schedule by status: (gray: waiting, light yellow: processing, yellow: to assign, light green: captioning, green: captioned and ready) - Updated by conf.org and the wiki repository
+
+![img](schedule.svg)
+
+
+<a id="overall"></a>
+
+# Overall priorities
+
+This table makes it easier to move the slider depending on who wants
+to volunteer and how much we can get done. At some point, we&rsquo;ll figure
+out how to track our current status so we know what we need to
+scramble to do in order to get the conference off the ground. **bold**
+is our current goal. Feel free to volunteer for anything that
+interests you!
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">&#xa0;</th>
+<th scope="col" class="org-left">Good</th>
+<th scope="col" class="org-left">Better</th>
+<th scope="col" class="org-left">Best</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left"><a href="#harvest">harvesting talks &amp; Q&amp;A</a></td>
+<td class="org-left"><b>recordings trimmed if needed, published</b></td>
+<td class="org-left">chapter markers</td>
+<td class="org-left">edited transcripts</td>
+</tr>
+</tbody>
+</table>
+
+Previous priorities;
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left"><a href="#conforg">conf.org management</a></td>
+<td class="org-left">on sachac&rsquo;s laptop</td>
+<td class="org-left">S: on res.emacsconf.org</td>
+<td class="org-left"><b>DONE S/Z: other people know how to work with it</b></td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#prepare-prerec-process">prerec</a></td>
+<td class="org-left">convert to webm</td>
+<td class="org-left">normalize audio</td>
+<td class="org-left"><b><a href="#mastering">DONE Z: reduce noise</a></b></td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">DONE S: link to stream, pad, IRC</td>
+<td class="org-left"><b>S: link to prerec when live</b></td>
+<td class="org-left">embed stream, pad, IRC, prerec</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#sched-decision">schedule</a></td>
+<td class="org-left">one track</td>
+<td class="org-left"><b>DONE S: two tracks</b></td>
+<td class="org-left">aligned times, full roster</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#upload">upload</a></td>
+<td class="org-left">FTP</td>
+<td class="org-left"><b>DONE S: web-based</b></td>
+<td class="org-left">auto-encoded, preview (SReview?)</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#streaming">streaming</a></td>
+<td class="org-left">ffmpeg from computer</td>
+<td class="org-left">OBS</td>
+<td class="org-left"><b>DONE: OBS in cloud, switchable hosts</b></td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#other-streams">other streams</a></td>
+<td class="org-left">480p</td>
+<td class="org-left">+ Toobnix</td>
+<td class="org-left"><b>S: + YouTube</b></td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#coordinate-volunteers">volunteer coordination</a></td>
+<td class="org-left">ad-hoc</td>
+<td class="org-left"><b>DONE playbook</b></td>
+<td class="org-left">training meetings + recordings</td>
+</tr>
+
+
+<tr>
+<td class="org-left">BBB rooms</td>
+<td class="org-left">about 5 rooms that we cycle through</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left"><b>DONE S: one room per speaker</b></td>
+</tr>
+
+
+<tr>
+<td class="org-left">host</td>
+<td class="org-left">no host, speaker reads pad</td>
+<td class="org-left"><b>host reads pad</b></td>
+<td class="org-left">host monitors IRC and helps with BBB as well</td>
+</tr>
+
+
+<tr>
+<td class="org-left">BBB Q&amp;A</td>
+<td class="org-left">none</td>
+<td class="org-left"><b>DONE open to community</b></td>
+<td class="org-left">moderated by speaker and host</td>
+</tr>
+
+
+<tr>
+<td class="org-left">BBB Q&amp;A start</td>
+<td class="org-left">awkward silence while waiting</td>
+<td class="org-left"><b>speaker can demo a little</b></td>
+<td class="org-left">host has prepared questions just in case no one shows up</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">tracks</td>
+<td class="org-left">+ IRC</td>
+<td class="org-left"><b>DONE S: + talk info</b>, maybe even current/recent/next</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#etherpad">pad</a></td>
+<td class="org-left">one pad for conf</td>
+<td class="org-left">one pad per talk, wikimedia</td>
+<td class="org-left"><b>DONE S: one pad per talk, self-hosted</b> so we can access API</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#irc">IRC</a></td>
+<td class="org-left">#emacsconf, -org</td>
+<td class="org-left"><b>DONE #emacsconf, -gen, -dev, -org</b></td>
+<td class="org-left">IRC volunteer copying to pads; maybe even IRC bots</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">ERC commands</td>
+<td class="org-left"><b>DONE S: hook-based</b></td>
+<td class="org-left">timer-based</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#publishing-sched">sched update</a></td>
+<td class="org-left"><b>DONE S: publish at start</b></td>
+<td class="org-left">update main sched</td>
+<td class="org-left">update talk pages</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#video-platforms">other platforms</a></td>
+<td class="org-left"><b>S: Toobnix &amp; YT after event</b></td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">S: Toobnix + YT when live</td>
+</tr>
+
+
+<tr>
+<td class="org-left">schedule view</td>
+<td class="org-left">text table</td>
+<td class="org-left">imagemap fallback</td>
+<td class="org-left"><b>DONE S: interactive SVG</b></td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#caption-workflow">caption workflow</a></td>
+<td class="org-left">YT autosubs</td>
+<td class="org-left">Whisper autosubs</td>
+<td class="org-left"><b>DONE: Whisper + more granular timestamps</b></td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#wiki-design">wiki</a></td>
+<td class="org-left">plain text, markdown</td>
+<td class="org-left"><b>DONE S: some JS and CSS enrichment</b></td>
+<td class="org-left">more JS and CSS, embeds, videoplayer</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#ansible">ansible</a></td>
+<td class="org-left">none</td>
+<td class="org-left"><b>DONE S: some automation</b></td>
+<td class="org-left">comprehensive, can also work against containers</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="#intro">intro and exit</a></td>
+<td class="org-left"><b>DONE: slide on screen, host on Mumble</b></td>
+<td class="org-left">per-talk video, recorded voiceover</td>
+<td class="org-left">Emacs thing so we can display info, countdowns, IRC</td>
+</tr>
+</tbody>
+</table>
+
+
+<a id="update"></a>
+
+# Next comms update
+
+- all the Q&A videos are available
+- updated GRAIL talk, uploaded orgvm talk
+- volunteers: next step is to make chapter markers, large model VTTs are now available
+- <span class="timestamp-wrapper"><span class="timestamp">[2022-12-15 Thu] </span></span> all Q&A videos posted, large model VTTs available
+- <span class="timestamp-wrapper"><span class="timestamp">[2022-12-12 Mon] </span></span> Updated grail, updated backstage view
+- <span class="timestamp-wrapper"><span class="timestamp">[2022-12-11 Sun] </span></span> Thank-you notes sent to all the speakers with Toobnix and YouTube URLs, BBB playback info
+
+
+<a id="projects"></a>
+
+# Projects and other long-running tasks
+
+- [Harvest live talks and Q&A](#harvest)
+- [Send thanks](#thanks)
+- [Finalize the files to be used for streaming](#files)
+- [Look for ways to reduce risk](#derisk):derisk:
+- [Make checkin and Q&A process slide](#qa):sachac:
+- [Caption talks and make chapter headings](#caption)
+- [Prepare intros for the hosts to read](#host-intros)
+- [Set up talks on Toobnix and YouTube](#video-platforms):sachac:yt:toobnix:
+- [Do another run](#dry-run)
+- [Turn off file upload service on media.emacsconf.org](#upload-off):sachac:infra:
+- [Review notebook for tasks, priorities, and scheduling](#review)
+- [Use Mumble for backchannel coordination and also on-stage](#mumble)
+- [Satellite events](#satellite)
+- [Volunteer update](#volunteer-2022-11-14)
+- [Make a linear hyperlist for managing EmacsConf](#hyperlist):sachac:
+- [Record intro/outro for day-1 and day-2](#rec-intro):zaeph:
+- [Add category tags and possibly links between talks across 2022 and all previous years](#link-pages):quiliro:wiki:
+- [JS/CSS enhancement](#watch-css):emacsconf:
+- [Build up the ansible playbook](#ansible):sachac:opal:
+- [Consider breakout rooms for lunch break](#breakouts)
+- [Work on the OBS scenes](#obs-scenes):zaeph:corwin:sachac:
+- [Plan Etherpad use and hosting](#etherpad):sachac:ansible:
+- [Write about EmacsConf behind the scenes](#writing):sachac:
+
+
+<a id="harvest"></a>
+
+## Harvest live talks and Q&A
+
+
+### DONE Add audio-only options to the publishing process
+
+
+### Learn from how other conferences harvest their talks and Q&A
+
+- DebConf posts the talk video (prerecorded + in person Q&A), no transcripts or index
+ Ex: <https://debconf22.debconf.org/talks/71-sequoia-pgp-v5-openpgp-authentication-and-debian/> . They link to the video and the Etherpad.
+- FOSSDEM has directory listings by track: <https://video.fosdem.org/2022/D.conference/>
+ also embedded video and links to slides, video recording, chat room (but not logs) <https://archive.fosdem.org/2022/schedule/event/community_contributions/>
+- LibrePlanet has thumbnails:
+ <https://media.libreplanet.org/u/libreplanet/tag/libreplanet-2022-video/> . Talk page has video and links to slides, download.
+ <https://media.libreplanet.org/u/libreplanet/m/taking-back-the-web-with-haketilo/>
+- NeovimConf: YouTube playlist, lots of comments on YouTube, key moments
+- VS Code Day: link to YouTube video, edited CC captions in YouTube, links and a hashtag in the video description, key moments
+- TED: transcript button, shows transcript in a scrollable area on the right
+
+
+### DONE Publish more Q&A recordings
+
+
+#### DONE Check status
+
+ (emacsconf-collect-prop :slug
+ (seq-remove
+ (lambda (o)
+ (or (null (string-match "live" (or (plist-get o :q-and-a) "")))
+ (null (emacsconf-talk-file o "--bbb-webcams.webm"))
+ (and (emacsconf-talk-file o "--answers.webm")
+ (plist-get o :qa-public))))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+
+
+#### DONE Write code to make it easy to do so
+
+emacsconf-extract-publish-qa
+
+
+#### DONE Fetch the reencoded maint answers and post it to backstage
+
+
+### DONE Document this phase of the conference
+
+We&rsquo;re now in the harvesting phase of the conference, where we work on
+collecting the ideas that people shared in the Q&A sessions as well as
+any talks that were not available as pre-recorded videos. It&rsquo;s a great
+way to help speakers get stuff out of their heads and into a form we
+can all learn from. =)
+
+Status of talks and Q&A sessions:
+
+- All talks except for the new version of grail should now be
+ available at <https://media.emacsconf.org/2022/> and on talk pages
+- Links to the BBB playbacks and to the various BBB resources (&#x2013;bbb-\*
+ for each talk) are now in the backstage area for speakers and/or
+ volunteers to review
+- RMS Q&A audio has been uploaded (&#x2013;questions.ogg)
+- grail talk will be reuploaded by the speaker
+- IRC logs have been copied to the backstage area; see the links at
+ the top of the backstage area
+- Etherpads have been converted to Markdown and included on the talk pages
+- BBB chats have been converted to Markdown and included on the talk pages
+
+Here&rsquo;s a good/better/best scale for stuff we can do during this phase:
+
+- Good:
+ - Look at IRC log at the top of the backstage area and copy
+ anonymized questions/answers/feedback to the wiki pages as well,
+ if they weren&rsquo;t already on the page
+ - Somewhat manual because of overlapping conversations; might be
+ easier to have one volunteer do all the talks in one shift
+ (Saturday morning gen, Saturday morning dev, Saturday afternoon
+ gen, etc.), so you can e-mail to call dibs if you like. We
+ usually remove names from the public log as well. Most of the
+ conversations should be in the track-specific channels, but some
+ might have ended up in #emacsconf as well. You can check the
+ talk page to see if the questions are already there. If you&rsquo;re
+ already set up to edit the wiki or you can figure out the
+ slightly complicated setup for editing, feel free to edit the
+ page directly. If not, you can email a Markdown or Org Mode
+ snippet to emacsconf-submit@gnu.org and let me know what page to
+ put it on.
+- Better:
+ - Review the BBB recording to check if there&rsquo;s anything that needs
+ to be deleted from the recording before we publish it so that
+ people can listen to things themselves; publish the recording or
+ excerpts of it
+ - Might be easier with the transcript, but can also be done
+ without one. asmblox, async, buttons, dbus, detached, and eshell
+ have &#x2013;bbb-webcams.vtt as the autogenerated Whisper transcripts.
+- Even better than that:
+ - Make chapter markers for the Q&A recording so that people can jump
+ to the question they&rsquo;re particularly interested in. You can write
+ them in the form:
+ mm:ss text goes here
+ mm:ss more text
+ and I can turn those into chapter headings.
+- Totally awesome:
+ - Edited captions/transcripts for the Q&A
+ - Answers copied into the Q&A section, possibly with linked timestamps
+
+
+#### Process for reviewing and trimming the videos
+
+Helper function:
+
+- emacsconf-extract-publish-qa (call with C-u in order to specify a time for truncating the video)
+
+Skim the transcript and the videos to see if anything needs to be removed, and which video to use
+
+BigBlueButton gives us the webcams and audio as one video
+(\`&#x2013;bbb-webcams.webm\`) and the screenshare (if any) as another video
+(\`&#x2013;bbb-deskshare.webm\`). If the speaker shared their screen, we can
+focus on that instead of their webcam. The following ffmpeg command
+combines the audio from the webcams (which has been previously
+extracted into a separate file, \`&#x2013;bbb-webcams.opus\`) with the video
+from the screenshare.
+
+ffmpeg -i example&#x2013;bbb-webcams.opus -i example&#x2013;bbb-deskshare.webm -c copy example&#x2013;answers.webm
+
+We also want to check if people accidentally shared sensitive
+information on their screen, or if anyone said something that they
+might not have said if they remembered that thethe Q&A videos will be
+shared after the talk. Sometimes there&rsquo;s some time before we get
+around to closing the meeting at the end of the Q&A. Usually, a quick
+read of the transcript will show anything that needs to be trimmed.
+Here&rsquo;s how to stop the recording at a specified time:
+
+ffmpeg -i input.webm -to hh:mm:ss -c copy output.webm
+
+Cutting out stuff from the middle of a recording is slightly more
+complicated. It might be easier to use a nonlinear video editor such
+as kdenlive to edit the video. If you want to use ffmpeg, using
+filters to select the frames and reencode the video will probably work
+out better than splitting the file into multiple parts and then
+concatenating them without reencoding, as the latter tends to need to
+be split on keyframes. Here&rsquo;s a sample command based on this
+[StackOverflow](<https://stackoverflow.com/questions/64866231/remove-a-section-from-the-middle-of-a-video-without-concat>) answer that removes the section between 15 seconds and
+45 seconds:
+
+ffmpeg -i input.webm \\
+ -vf &ldquo;select=&rsquo;not(between(t,15,45))&rsquo;, setpts=N/FRAME\_RATE/TB&rdquo; \\
+ -af &ldquo;aselect=&rsquo;not(between(t,15,45))&rsquo;, asetpts=N/SR/TB&rdquo; \\
+ output.webm
+
+Alternatively, you can let us know what parts needs to be trimmed, and
+we can figure that part out.
+
+
+### TODO Prepare groundwork for volunteers to help
+
+
+#### CANCELLED Document IRC/pad/BBB chat extraction tasks
+
+Experience level: no technical background needed; slightly easier if you&rsquo;ve set up your computer for editing the wiki, which needs ssh and git
+
+There were lots of interesting notes and Q&A on IRC and the pad. If we can copy them to the talk page on the wiki, then we can catch any questions that hadn&rsquo;t been answered and forward feedback to the speaker. It&rsquo;s a little challenging because the IRC conversation might get mixed up when another talk starts, so it helps to read the IRC log and decide what lines to include. We usually remove names from the public log as well. Most of the conversations should be in the track-specific channels, but some might have ended up in #emacsconf as well.
+
+I&rsquo;ve added IRC chat logs to the top of the backstage page. Each talk also links to the HTML (&#x2013;pad.html) and Markdown (&#x2013;pad.md) version of the pad.
+
+You can see the 2021 talks (ex: <https://emacsconf.org/2021/talks/frownies/> , <https://emacsconf.org/2021/talks/pattern/> ) for an example of how the discussions were archived on the talk pages. Sometimes we organize them by type of comment, so it&rsquo;s easy to see Q&A vs. notes vs. feedback about the talk itself.
+
+To avoid duplicating work, maybe we can use this Etherpad to call dibs on talks to process. You can write your name or nick next to the talk(s) you&rsquo;re archiving.
+
+If you&rsquo;re already set up to edit the wiki or you can figure out the slightly complicated setup for editing, feel free to edit the page directly. If not, you can email a Markdown or Org Mode snippet to emacsconf-submit@gnu.org and let me know what page to put it on.
+
+
+### TODO Split up relevant sections from IRC logs so that volunteers can go through them
+
+
+### DONE Check duration of Q&A BBB recordings
+
+About 15 hours total
+
+ (format-seconds "%h:%.2m:%.2s"
+ (/ (apply '+
+ (seq-keep (lambda (o)
+ (and (file-exists-p (expand-file-name (concat (plist-get o :video-slug) "--bbb-webcams.opus") emacsconf-cache-dir))
+ (compile-media-get-file-duration-ms
+ (expand-file-name (concat (plist-get o :video-slug) "--bbb-webcams.opus") emacsconf-cache-dir))))
+ (emacsconf-get-talk-info)))
+ 1000)) ;; "14:52:28"
+
+around 4 hours to process asmblox: 14 minutes (/ (\* 4 60) 14.0) ~17x recorded time
+(/ (\* 17 15) 24.0) 10.625
+
+
+### DONE Get the playback links for the BBB talks
+
+Added as BBB\_PLAYBACK properties (:bbb-playback in the plist).
+on orga@res:
+
+- /data/emacsconf/2022/bbb-playbacks has the files from the web-based playback
+- /data/emacsconf/2022/bbb-raw has the raw files
+
+
+#### DONE Download all the BBB playback files
+
+ (let ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (mapconcat
+ (lambda (o)
+ (when (plist-get o :bbb-playback)
+ (let ((meeting-id (when (string-match "meetingId=\\(.+\\)"
+ (plist-get o :bbb-playback))
+ (match-string 1 (plist-get o :bbb-playback)))))
+ (concat "mkdir " (plist-get o :slug) "\n"
+ "cd " (plist-get o :slug) "\n"
+ (mapconcat
+ (lambda (file)
+ (concat
+ "wget https://bbb.emacsverse.org/presentation/"
+ meeting-id "/" file "\n")
+ )
+ '("video/webcams.webm" "metadata.xml" "deskshare/deskshare.webm" "panzooms.xml" "cursor.xml" "deskshare.xml" "captions.json" "presentation_text.json" "slides_new.xml")
+ ""
+ )
+ "cd ..\n"
+ ))
+ )
+ )
+ info
+ ""))
+
+
+#### DONE Convert to Opus in preparation for transcription
+
+find -name webcams.webm -exec bash -c &rsquo;ffmpeg -i {} -c:a copy $(echo {} | sed &rsquo;s/webm/opus/&rsquo;)&rsquo; \\;
+
+
+#### TODO Transcribe serially
+
+in bbb-whisper
+
+ for SLUG in *; do
+ echo Processing $SLUG $(date -Iseconds) | tee -a bbb-whisper.log
+ (
+ cd $SLUG;
+ if [[ ! -f webcams.txt ]]; then
+ whisper --model large --language en --verbose True webcams.opus
+ else
+ echo "Skipping, already exists"
+ fi
+ )
+ done
+
+
+### DONE Extract RMS Q&A from dump
+
+17:48 of current
+
+
+#### DONE Ffmpeg
+
+[19:26] <bandali> rsyncing the stream dumps from live0:/data/emacsconf-2022-\* into fh-vm01:~orga/live0-streams/
+[19:26] <bandali> i&rsquo;ll probably rsync a copy to my own laptop as well, for backup
+[19:29] <bandali> a reminder that the stream dumps shouldn&rsquo;t be used as-is, and should first be remuxed using ffmpeg to fix the timestamps
+[19:30] <bandali> using something like this: ffmpeg -i myfile.webm -acodec copy -vcodec copy myfile-remuxed.webm >> myfile.log 2>&1
+
+
+### DONE Extract orgvm talk
+
+
+### DONE Post IRC logs to backstage so that volunteers can split them up
+
+See links at the top of backstage
+
+
+### SOMEDAY Copy logs for analysis
+
+
+### DONE Transcribe recordings
+
+
+### DONE Collect recordings from bbb
+
+
+### DONE Back up all the pads
+
+
+### DONE Extract bbb chat and add to backstage
+
+
+### SOMEDAY Awesome Speaker Diarization | awesome-diarization
+
+<https://wq2012.github.io/awesome-diarization/>
+
+
+### SOMEDAY Document irc, bbb chat, pad tasks
+
+Experience level: no technical background needed; slightly easier if you&rsquo;ve set up your computer for editing the wiki, which needs ssh and git
+
+There were lots of interesting notes and Q&A on IRC and the pad. If we can copy them to the talk page on the wiki, then we can catch any questions that hadn&rsquo;t been answered and forward feedback to the speaker. It&rsquo;s a little challenging because the IRC conversation might get mixed up when another talk starts, so it helps to read the IRC log and decide what lines to include. We usually remove names from the public log as well. Most of the conversations should be in the track-specific channels, but some might have ended up in #emacsconf as well.
+
+I&rsquo;ve added IRC chat logs to the top of the backstage page, and each talk also links to the HTML (&#x2013;pad.html) and Markdown (&#x2013;pad.md) version of the pad.
+
+You can see the 2021 talks (ex: <https://emacsconf.org/2021/talks/frownies/> , <https://emacsconf.org/2021/talks/pattern/> ) for an example of how the discussions were archived on the talk pages. Sometimes we organize them by type of comment, so it&rsquo;s easy to see Q&A vs. notes vs. feedback about the talk itself.
+
+To avoid duplicating work, maybe we can use this Etherpad to call dibs on talks to process. You can write your name or nick next to the talk(s) you&rsquo;re archiving.
+
+If you&rsquo;re already set up to edit the wiki or you can figure out the slightly complicated setup for editing, feel free to edit the page directly. If not, you can email a Markdown or Org Mode snippet to emacsconf-submit@gnu.org and let me know what page to put it on.
+
+
+### STARTED Write some code to copy the events.xml to the backstage
+
+recording timestamp is 2022-12-03T09:41:30.888-08
+bandali user ID is w\_uwwpzp4fjtqq
+joined 2022-12-03T10:07:06.066-08
+aaaaaah, hmm. recording timestamp seems earlier, that might just be when BBB starts the whole thing.
+aha! The raw directory has the whole thing, not just the recorded part, and the recording timestamp is the beginning of the meeting. So let&rsquo;s find out where the actual recording starts.
+
+Maybe StartWebRTCShareEvent ?
+ParticipantStatusChangeEvent might be the webcam start.
+Is it DeskShareStartRTMP ?
+
+
+### TODO Improve visualization for Q&A sessions, especially when there&rsquo;s nothing else to look at
+
+
+#### SOMEDAY Consider the challenge of aligning video segments with a timeline
+
+
+#### SOMEDAY windows - Reducing command-line shortcomings caused by excessive number of FFmpeg inputs - Super User
+
+<https://superuser.com/questions/1369843/reducing-command-line-shortcomings-caused-by-excessive-number-of-ffmpeg-inputs>
+
+
+#### SOMEDAY kkroening/ffmpeg-python: Python bindings for FFmpeg - with complex filtering support
+
+<https://github.com/kkroening/ffmpeg-python>
+
+
+#### SOMEDAY Extension repository - Inkscape Wiki
+
+<https://wiki.inkscape.org/wiki/index.php/Extension_repository#Generator>
+
+
+#### SOMEDAY how to render a long text in an area with automatic wrap - Legacy ImageMagick Discussions Archive
+
+<https://www.imagemagick.org/discourse-server/viewtopic.php?t=27325>
+
+
+#### SOMEDAY svg to tex with svg package and inkscape: make the text to wrap inside a shape - TeX - LaTeX Stack Exchange
+
+<https://tex.stackexchange.com/questions/325711/svg-to-tex-with-svg-package-and-inkscape-make-the-text-to-wrap-inside-a-shape>
+
+
+#### SOMEDAY tikz API documentation
+
+<https://allefeld.github.io/pytikz/tikz/>
+
+
+#### SOMEDAY tikz pgf - Absolute positioning in beamer - TeX - LaTeX Stack Exchange
+
+<https://tex.stackexchange.com/questions/6185/absolute-positioning-in-beamer>
+
+
+#### SOMEDAY CTAN: Package textpos
+
+<https://ctan.org/pkg/textpos>
+
+
+#### SOMEDAY positioning - How do I put some text in specific position on a page horizontally with the prosper class? - TeX - LaTeX Stack Exchange
+
+<https://tex.stackexchange.com/questions/35602/how-do-i-put-some-text-in-specific-position-on-a-page-horizontally-with-the-pros>
+
+
+#### SOMEDAY Exporting LaTeX TikZ as Image Files | Baeldung on Computer Science
+
+<https://www.baeldung.com/cs/exporting-tikz-as-images>
+
+
+#### SOMEDAY OpenAI Whisper tutorial: Whisper - Transcription and diarization (speaker identification) | LabLab
+
+<https://lablab.ai/t/whisper-transcription-and-speaker-identification>
+
+
+#### TODO Consider ffmpeg to make speaker labels so that I can overlay them on webcams.webm
+
+
+#### TODO could be fancy to have an FFMPEG compose the videos with names and webcams on the right side
+
+
+#### SOMEDAY Try using the single webcam view of the speaker
+
+
+### SOMEDAY Think about how I want to format the VTT for the RMS Q&A
+
+
+#### SOMEDAY Use word data, maybe reflow based on it
+
+
+### SOMEDAY Combine webcams and deskshare
+
+
+### TODO Extract comments from IRC
+
+
+#### SOMEDAY Auto-add A: marker for speaker
+
+
+### DONE compare deskshare with webcams
+
+ (mapcar (lambda (o)
+ (cons (emacsconf-get-slug-from-string o)
+ (- (compile-media-get-file-duration-ms o)
+ (compile-media-get-file-duration-ms (replace-regexp-in-string "deskshare" "webcams" o))) )
+
+ )
+ (directory-files emacsconf-cache-dir t "-deskshare.webm"))
+
+
+### Improve segmented audio normalization
+
+
+#### SOMEDAY How to normalize the volume of an audio file in python? - Stack Overflow
+
+<https://stackoverflow.com/questions/42492246/how-to-normalize-the-volume-of-an-audio-file-in-python>
+
+
+#### SOMEDAY Execute Macro from Script - Audacity Forum
+
+<https://forum.audacityteam.org/viewtopic.php?t=121821>
+
+
+### TODO subtitle hyperorg
+
+
+### DONE Check duration
+
+ (/ (apply '+
+ (mapcar #'compile-media-get-file-duration-ms
+ (directory-files emacsconf-cache-dir t "\\(main\\|webcams\\).webm\\|rms.*ogg")))
+ 3600000.0)
+
+28.860543888888888
+
+- 29 hours including Q&A
+- 14 hours of talks, 15 hours of Q&A
+
+(\* 28 0.0075 60)
+12.6
+
+
+### SOMEDAY Copy irc, haven&rsquo;t actually done that yet
+
+
+### SOMEDAY Create harvesting etherpad if needed to track the status?
+
+
+### DONE Update task status now that I have TO\_REVIEW\_QA, TO\_INDEX\_QA, TO\_CAPTION\_QA
+
+ (with-current-buffer (find-file-noselect emacsconf-org-file)
+ (org-map-entries
+ (lambda ()
+ (if (file-exists-p (expand-file-name (concat (org-entry-get (point) "VIDEO_SLUG") "--answers.webm")
+ emacsconf-cache-dir))
+ (org-todo "TO_INDEX_QA")
+ (org-todo "TO_REVIEW_QA")))
+ "TODO=\"TO_ARCHIVE\"+SLUG={.}")
+ )
+
+ (with-current-buffer (find-file-noselect emacsconf-org-file)
+ (org-map-entries
+ (lambda ()
+ (unless (file-exists-p (expand-file-name (concat (org-entry-get (point) "VIDEO_SLUG") "--bbb-webcams.webm")
+ emacsconf-cache-dir))
+ (org-todo "TO_ARCHIVE")))
+ "TODO=\"TO_REVIEW_QA\"+SLUG={.}")
+ )
+
+
+### TODO consider number-anonymizing the IRC chat
+
+
+### TODO switch to resources view
+
+
+### TODO Harvest the closing remarks
+
+
+### TODO Check normalization of answers
+
+<https://stackoverflow.com/questions/42492246/how-to-normalize-the-volume-of-an-audio-file-in-python>
+
+
+#### SOMEDAY Scripting - Audacity Manual
+
+<https://manual.audacityteam.org/man/scripting.html>
+
+
+### SOMEDAY Post transcripts, start working on chapter workflow
+
+
+### SOMEDAY Add audio-only handler for media card
+
+
+### SOMEDAY How to chunk text into paragraphs using python | by N Polovinkin | Medium
+
+<https://medium.com/@npolovinkin/how-to-chunk-text-into-paragraphs-using-python-8ae66be38ea6>
+
+
+### STARTED Figure out ways to make sense of IRC logs
+
+ssh
+Possible: thread speaker messages?
+Manual:
+
+- search backward to find the lines, put something under
+- avy to indent it under that line
+- use properties to suggest lines
+- copy everything, use Emacs News code to refile entries
+- anonymize after
+
+
+### TODO improve nil note for missing resources
+
+
+### CANCELLED Trim grail if needed
+
+
+### DONE I uploaded the Q&A sessions to Toobnix. :sachac:
+
+Least extra work if I do it after chapter markers, but I can just do them now and then update them later
+
+ (mapc (lambda (o)
+ (let ((default-directory "~/vendor/PeerTube/"))
+ (when (emacsconf-publish-upload-answers o 'toobnix)
+ (emacsconf-go-to-talk o)
+ (shell-command "xdotool mousemove 1782 370 click 1 sleep 1 key Ctrl+r sleep 4 mousemove 1584 546 click 3 sleep 1 mousemove 1664 746 click 1 mousemove 1584 546 sleep 1 key Alt+Tab sleep 1")
+ (org-entry-put
+ (point) "QA_TOOBNIX"
+ (read-string (format "URL for %s: "
+ (org-entry-get (point) "SLUG")))))))
+ (seq-remove
+ (lambda (o)
+ (or (null (emacsconf-talk-file o "--answers.webm"))
+ (plist-get o :qa-toobnix)))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+
+
+### DONE Upload answers to Youtube :sachac:
+
+Set eval to yes and work carefully.
+
+ (defun emacsconf-publish-answers-python (talk)
+ (interactive)
+ (concat "filename = \"\"\"" (emacsconf-talk-file talk "--answers.webm") "\"\"\"\n"
+ "title = \"\"\"" (emacsconf-publish-answers-title talk 100) "\"\"\"\n"
+ "description = \"\"\"" (emacsconf-publish-answers-description talk 'youtube) "\"\"\"\n"))
+ (plist-get
+ (seq-find (lambda (talk)
+ (not (or (null (emacsconf-talk-file talk "--answers.webm"))
+ (plist-get talk :qa-youtube))))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info)))
+ :slug)
+
+:end:
+
+quota, continue tomorrow
+
+
+#### Setup
+
+ from playwright.sync_api import Playwright, sync_playwright, expect
+ from pathlib import Path
+ import json
+
+ playwright = sync_playwright().start()
+ browser = playwright.firefox.launch(headless=False)
+ context = browser.new_context()
+ page = context.new_page()
+ context.add_cookies(json.loads(Path("cookies.json").read_text()))
+ page.goto("https://studio.youtube.com/")
+
+Save the cookies after it&rsquo;s all set up
+
+ Path("cookies.json").write_text(json.dumps(cookies))
+
+ context.add_cookies(json.loads(Path("cookies.json").read_text()))
+ page.goto("https://studio.youtube.com/channel/UCwuyodzTl_KdEKNuJmeo99A")
+
+1. Upload the file
+
+ #page.get_by_role("dialog", name="Video processing").get_by_role("button", name="Close").click()
+ page.locator("#create-icon").click()
+ page.get_by_text("Upload videos").click()
+ page.get_by_role("button", name="Select files").click()
+ nil
+
+1. Set the talk details and copy the URL.
+
+ (save-window-excursion
+ (emacsconf-go-to-talk (emacsconf-resolve-talk slug))
+ (org-entry-put (point) "QA_YOUTUBE" url))
+
+
+##### Background code
+
+ (let ((talk (emacsconf-resolve-talk slug)))
+ (kill-new (emacsconf-talk-file talk "--answers.webm"))
+ (emacsconf-publish-answers-python talk))
+
+ nil
+ page.locator("#title-textarea").click()
+ page.keyboard.press("Control+KeyA")
+ page.keyboard.press("Delete")
+ page.keyboard.type(title)
+ page.locator("#description-textarea #textbox").fill(description)
+ page.locator('ytcp-video-metadata-playlists .dropdown-trigger-text').click()
+ page.get_by_role("dialog", name="Choose playlists").get_by_text("EmacsConf 2022").click()
+ page.get_by_role("button", name="Done").click()
+ page.get_by_role("button", name="Show more").click()
+ page.get_by_placeholder("Add tag").fill("emacs, emacsconf, answers")
+ page.get_by_placeholder("Add tag").click()
+ href = page.locator('a.ytcp-video-info').get_attribute('href')
+ page.locator("#step-badge-3").click()
+ page.locator(".ytcp-video-visibility-select[name=PUBLIC]").click()
+ page.get_by_role("button", name="PUBLISH").click()
+ print(href)
+
+<https://youtu.be/Q453L_whGEc>
+
+
+### TODO Add links to Q&A to Youtube video descriptions
+
+
+### SOMEDAY Make a podcast feed of the talks
+
+
+### TODO Check that webms have latest vtts
+
+
+### TODO Break autocaptions every 5 minutes or so, so that they can be included on the webpage
+
+
+### DONE Add maint chapter markers to Toobnix and Youtube, automate it
+
+ (setq talk (emacsconf-resolve-talk "maint"))
+ (replace-regexp-in-string
+ "\\\\" "\\\\\\\\"
+ (json-encode
+ (list
+ :qa-youtube (plist-get talk :qa-youtube)
+ :qa-toobnix (plist-get talk :qa-toobnix)
+ :slug (plist-get talk :slug)
+ :answers-description-youtube (emacsconf-publish-answers-description talk 'youtube)
+ :answers-description-toobnix (emacsconf-publish-answers-description talk 'youtube))))
+
+Update YouTube
+
+ from playwright.sync_api import Playwright, sync_playwright, expect
+ from pathlib import Path
+ import json
+ import re
+
+ talk = json.loads("""nil""")
+ playwright = sync_playwright().start()
+ browser = playwright.firefox.launch(headless=False)
+ context = browser.new_context()
+ page = context.new_page()
+ context.add_cookies(json.loads(Path("cookies.json").read_text()))
+ m = re.search("[^/=]+$", talk['qa-youtube'])
+ page.goto("https://studio.youtube.com/video/" + m.group(0) + "/edit")
+ page.locator("#description-textarea #textbox").fill(talk['answers-description-youtube'])
+ page.get_by_role('button', name="Save").click()
+
+Update Toobnix:
+
+ talk = json.loads("""nil""")
+ m = re.search("[^/=]+$", talk['qa-youtube'])
+ page.goto("https://toobnix.org/videos/update/" + m.group(0))
+ page.locator("#description").fill(talk['answers-description-toobnix'])
+ page.locator('.orange-button').click()
+
+
+<a id="thanks"></a>
+
+## TODO Send thanks
+
+
+### TODO Send thank-you notes to speakers
+
+Dependencies:
+
+- youtube, toobnix urls
+- bbb playback urls
+- pads copied
+
+ (defvar emacsconf-mail-thank-speaker-open-youtube t
+ "If non-nil, browse to the YouTube page so we can mention views and stuff.")
+
+ (defun emacsconf-mail-thank-speaker (group &optional template)
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (delete-other-windows)
+ (with-selected-window
+ (split-window-right)
+ (emacsconf-edit-wiki-page (plist-get (cadr group) :slug))
+ (when (> (length (cdr group)) 1)
+ (mapc
+ (lambda (talk)
+ (with-selected-window (split-window-below)
+ (emacsconf-edit-wiki-page (plist-get talk :slug))))
+ (cddr group))
+ (balance-windows)))
+ (let ((with-bbb (seq-filter (lambda (talk) (plist-get talk :bbb-playback)) (cdr group))))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "thanks-speaker"))
+ (car group)
+ (list
+ :email (car group)
+ :conf-name emacsconf-name
+ :year
+ emacsconf-year
+ :plural
+ (if (= (length (cdr group)) 1) "" "s")
+ :video-is
+ (if (= (length (cdr group)) 1) "video is" "videos are")
+ :bbb-note
+ (if with-bbb
+ (concat
+ " We'd like to publish the audio (and possibly the video as well)
+ with chapter markers and maybe even captions, depending on
+ volunteers. In case you want to revisit your Q&A session in
+ order to remember anything particularly cool that you'd like to
+ follow up on (or anything particularly sensitive/embarrassing
+ that you'd like us to omit), you can view the BigBlueButton
+ playback at " (mapconcat (lambda (talk) (plist-get talk :bbb-playback)) with-bbb " , ") " . Volunteers will be working on harvesting the Q&A over the next few weeks/months. If you'd like to help with the processing, I've added the files
+ to ${backstage} and documented our harvesting process at
+ https://emacsconf.org/harvesting/ . The files start with --bbb in the backstage area. This is
+ totally optional and just there in case you feel like taking advantage
+ of it. =)")
+ "")
+ :backstage
+ (mapconcat (lambda (talk)
+ (concat "https://media.emacsconf.org/" emacsconf-year "/backstage/#" (plist-get talk :slug)))
+ (cdr group) " , ")
+ :urls
+ (mapconcat (lambda (talk)
+ (plist-get talk :absolute-url))
+ (cdr group) " , ")
+ :toobnix-url
+ (mapconcat (lambda (talk)
+ (plist-get talk :toobnix-url))
+ (cdr group) " , ")
+ :youtube-url
+ (mapconcat (lambda (talk)
+ (plist-get talk :youtube-url))
+ (cdr group) " , ")
+ :speakers-short (plist-get (cadr group) :speakers-short)))
+ (when emacsconf-mail-thank-speaker-open-youtube
+ (mapc (lambda (talk)
+ (when (plist-get talk :youtube-url)) (browse-url (plist-get talk :youtube-url)))
+ (cdr group)))))
+
+
+#### Template
+
+Hi, ${speakers-short}!
+
+Thank you so much for being part of EmacsConf ${year}! Hundreds of
+people enjoyed it, and I&rsquo;m sure even more will come across the videos
+in the days to follow.
+
+Your ${video-is} available on the talk page${plural} at ${urls} , and
+we&rsquo;ve added the discussions from Etherpad/IRC.${bbb-note}${wrap}
+
+We&rsquo;ve also uploaded your talk video${plural} to Toobnix (a PeerTube
+instance) at ${toobnix-url} and YouTube at ${youtube-url} . If you
+want to reupload the video to your own channel, please feel free to do
+so. If you let me know where you&rsquo;ve uploaded it, I think I can switch
+our playlist to include your version of the video instead. That way,
+it might be easier for you to respond to comments on videos.${wrap}
+
+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!
+
+Sacha
+
+
+### TODO Send thank-you notes to volunteers
+
+
+<a id="files"></a>
+
+## STARTED Finalize the files to be used for streaming
+
+Verify that all the files load
+
+ (let ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (mapconcat
+ (lambda (track)
+ (concat "- " (plist-get track :name) "\n"
+ (mapconcat
+ (lambda (talk)
+ (if (plist-get talk :video-file)
+ (format " - [ ] [[elisp:(emacsconf-stream-play-talk-on-change \"%s\")][Play %s]]\n"
+ (plist-get talk :slug) (plist-get talk :slug))
+ ""))
+ (emacsconf-filter-talks-by-track track info))))
+ emacsconf-tracks))
+
+How about the ones that might be live
+
+ (let ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (mapconcat
+ (lambda (track)
+ (concat "- " (plist-get track :name) "\n"
+ (mapconcat
+ (lambda (talk)
+ (if (null (plist-get talk :video-file))
+ (format " - [ ] [[elisp:(emacsconf-stream-play-talk-on-change \"%s\")][Play %s]]\n"
+ (plist-get talk :slug) (plist-get talk :slug))
+ ""))
+ (emacsconf-filter-talks-by-track track info))))
+ emacsconf-tracks))
+
+
+### TODO Fix my audio volume for intros
+
+
+### DONE Remove first eight seconds of Jupyter if possible, and the last 16 seconds or so
+
+screen -S jupyter-trim ffmpeg -y -ss 8 -to 00:16:40 -i emacsconf-2022-jupyter&#x2013;edit-live-jupyter-notebook-cells-with-emacs&#x2013;blaine-mooers&#x2013;final.webm emacsconf-2022-jupyter&#x2013;edit-live-jupyter-notebook-cells-with-emacs&#x2013;blaine-mooers&#x2013;trimmed.webm
+
+
+### TODO Regenerate overlays to accommodate different layout
+
+
+<a id="derisk"></a>
+
+## Look for ways to reduce risk :derisk:
+
+<https://pad.emacsconf.org/premortem>
+
+
+### DONE Click on stuff with xdotool
+
+(emacsconf-stream-bbb &ldquo;journalism&rdquo;)
+(emacsconf-stream-xdotool-set-up-bbb &ldquo;journalism&rdquo;)
+;; get into backstage area
+xdotool mousemove 806 385 click 1
+
+(progn
+)
+
+(let ((pos (emacsconf-stream-xdotool &ldquo;General&rdquo; &ldquo;getmouselocation&rdquo;)))
+ (when (string-match &ldquo;x:\\$[0-9]+\$ y:\\$[0-9]+\$&rdquo; pos)
+ (insert (format &ldquo;(emacsconf-stream-xdotool \\&rdquo;General\\&ldquo; \\&rdquo;mousemove %s %s click 1\\&ldquo;)\n&rdquo; (match-string 1 pos) (match-string 2 pos)))))
+
+(emacsconf-stream-track-ssh
+ (emacsconf-get-track &ldquo;General&rdquo;)
+ (split-string &ldquo;xdotool &rdquo;))
+
+xdotool mousemove 253 176 click 1
+xdotool mousemove 215 164 click 1
+xdotool key f11
+
+
+### DONE Make copyable version of bbb redirect :derisk:
+
+
+### DONE Make sure all the important tasks are scheduled over the next two weeks
+
+ (defun emacsconf-prep-agenda ()
+ (interactive)
+ (let* ((notebook (expand-file-name "index.org" (expand-file-name "organizers-notebook" (expand-file-name emacsconf-year emacsconf-directory))))
+ (org-agenda-custom-commands
+ `(("a" "Agenda"
+ ((tags-todo "-PRIORITY=\"C\"-SCHEDULED={.}-nextyear"
+ ((org-agenda-files (list ,notebook))))
+ (agenda ""
+ ((org-agenda-files (list ,notebook))
+ (org-agenda-span 7)))
+ )))))
+ (org-agenda nil "a")))
+
+
+### DONE Try a reboot before the resize :sachac:
+
+- After rebooting live0, we should still be able to:
+ - [X] SSH to it
+ - [X] Stream gen to it
+ - [X] Start up the fallbacks: screen-fallbacks
+ - test: mpv <https://live0.emacsconf.org/gen-fallback.webm>
+ - [X] Play gen stream: mpv <https://live0.emacsconf.org/gen.webm>
+ - [X] Play gen 480p stream: mpv <https://live0.emacsconf.org/gen-480p.webm>
+ - [X] Go to watch page for gen:
+ - <https://emacsconf.org/2022/watch/gen/>
+ - <https://live.emacsconf.org/2022/watch/gen/>
+ - [X] Start test restream to toobnix
+ - screen-restream-test-toobnix.sh
+ - <https://toobnix.org/w/dmibQFkBTNcJyTVVQTyd5C>
+ - Test dev as well (optional)
+ - [X] Stream dev to it
+ - [X] Play dev stream
+ - [X] Play dev 480p stream
+ - [X] Go to watch page for dev
+- After rebooting front0, we should still be able to:
+ - [X] View the wiki <https://emacsconf.org/2022/>
+ - [X] Update the status page [edit](file://ssh:front0.emacsconf.org:/var/www/status.emacsconf.org/index.html) <https://status.emacsconf.org>
+ - [ ] Go to the pad: <https://pad.emacsconf.org/2022>
+
+
+### DONE icecast fallback :derisk:sachac:
+
+
+#### Creating the files
+
+ffmpeg -y -f lavfi -i anullsrc=channel\_layout=stereo:sample\_rate=48000 -loop 1 -r 20 -t 10 -i sorry.png -c:v libvpx -c:a libvorbis -color\_primaries 1 -color\_trc 1 -colorspace 1 -crf 30 -g 120 -minrate 1.5M -b:v 1500 -g 120 -maxrate 1.5M -cluster\_time\_limit 5100 -shortest sorry.webm
+
+ffmpeg -y -f lavfi -i anullsrc=channel\_layout=stereo:sample\_rate=48000 -loop 1 -r 20 -t 10 -i sorry.png -vf scale=854:480 -c:v libvpx -c:a libvorbis -color\_primaries 1 -color\_trc 1 -colorspace 1 -crf 30 -g 120 -minrate 1.5M -b:v 1500 -g 120 -maxrate 1.5M -cluster\_time\_limit 5100 -shortest sorry-480p.webm
+
+icecast 2.4.4
+ Stream #0:0: Video: vp8, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 20 fps, 20 tbr, 1k tbn, 1k tbc (default)
+ Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
+
+Okay. I can ffmpeg to /gen-sorry.webm with
+orga@live0:/usr/share/icecast2/web$ ffmpeg -r 20 -re -stream\_loop -1 -i gen-fallback.webm -f webm -content\_type video/webm -c:a copy -c:v copy icecast://https://emacsconf.org/2022/talks/$PASSWORD@localhost:8001/gen-sorry.webm
+
+
+##### TODO Add test pattern to part of the screen
+
+
+##### gen
+
+Input #0, matroska,webm, from &rsquo;http://live0.emacsconf.org:8001/gen.webm&rsquo;:
+ Metadata:
+ ENCODER : Lavf58.20.100
+ icy-pub : 0
+ icy-metadata : 1
+ Duration: N/A, start: 39.061000, bitrate: N/A
+ Stream #0:0: Video: vp8, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 20 fps, 20 tbr, 1k tbn, 1k tbc (default)
+ Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
+
+
+##### fallback
+
+Input #0, matroska,webm, from &rsquo;http://live0.emacsconf.org:8001/gen.webm&rsquo;:
+ Metadata:
+ ENCODER : Lavf58.20.100
+ icy-pub : 0
+ icy-metadata : 1
+ Duration: N/A, start: 19.473000, bitrate: N/A
+ Stream #0:0: Video: vp8, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 20 fps, 20 tbr, 1k tbn, 1k tbc (default)
+ Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
+
+
+#### DONE Create fallback for 480p as well
+
+
+#### DONE Create fallback video
+
+
+#### DONE Add more ffmpeg options from the OBS profile to try to get them to match as closely as possible
+
+
+#### DONE Detect fallback and reload the video player
+
+<https://stackoverflow.com/questions/36280764/audio-stops-playing-while-moving-to-fallback-mount-using-icecast#36332739>
+
+ // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0
+ // Copyright (c) 2022 Sacha Chua - CC0 Public Domain
+ var video = document.querySelector('video.reload');
+ if (video) {
+ var myVar = setInterval(reloadAsNeeded, 1000);
+ var oldTime = '';
+ function reloadAsNeeded() {
+ if ((video.paused != true && (video.currentTime - oldTime) == 0 && video.currentTime != 0)) {
+ var source = video.querySelector('source');
+ var oldVideo = source.src;
+ source.src = '';
+ source.src = oldVideo;
+ video.load();
+ video.play();
+ }
+ oldTime = video.currentTime;
+ };
+ }
+ // @license-end
+
+
+### DONE Make sure things are okay for me to handle both streams :sachac:
+
+
+#### DONE Add keyboard shortcuts
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">S-g</td>
+<td class="org-left">gen VNC</td>
+</tr>
+
+
+<tr>
+<td class="org-left">S-d</td>
+<td class="org-left">dev VNC</td>
+</tr>
+
+
+<tr>
+<td class="org-left">S-G</td>
+<td class="org-left">gen console</td>
+</tr>
+
+
+<tr>
+<td class="org-left">S-D</td>
+<td class="org-left">dev console</td>
+</tr>
+
+
+<tr>
+<td class="org-left">S-o</td>
+<td class="org-left">orga@res console</td>
+</tr>
+</tbody>
+</table>
+
+
+#### DONE figure out left/right to keep track of both streams
+
+I&rsquo;m just going to do this with pavucontrol so that it&rsquo;s not too complicated
+
+
+#### CANCELLED Tweak my audio setup for push-to-talk?
+
+<https://news.ycombinator.com/item?id=23160101>
+<https://gist.github.com/zouppen/bdd40a42c77ca387fae8bace0f2ed3e0>
+
+
+#### DONE Guard against over-announcing by paying attention to erc
+
+Goal: Don&rsquo;t spam the channel with talk announcements
+
+If it was announced in the last 5 minutes, don&rsquo;t reannounce it as part
+of the hook, but allow reannouncements if called manually.
+
+How to detect announcements:
+
+If it was the most recently announced talk in the channel, don&rsquo;t re-announce it
+
+(with-eval-after-load &rsquo;erc (add-hook &rsquo;erc-insert-pre-hook &rsquo;emacsconf-erc-notice-announcements))
+
+
+<a id="qa"></a>
+
+## CANCELLED Make checkin and Q&A process slide :sachac:
+
+Low-priority because people were able to manage fine last year
+Even better if we can add in-between slides (ex:
+<https://media.emacsconf.org/2022/in-between/journalism>) for slide #2
+
+asked corwin about access to bbb.emacsverse.org because uploading
+presentations seems to not work on our instance. In the meantime, we
+can paste in <https://emacsconf.org/2022/qa/> for tips.
+
+
+<a id="caption"></a>
+
+## Caption talks and make chapter headings
+
+
+### DONE Nudge volunteers to e-mail me captions by Dec 1 :mail:sachac:
+
+
+### DONE Copy chapter headings for mail talk :emacsconf:captions:
+
+
+### DONE Caption the new talks :sachac:
+
+
+<a id="host-intros"></a>
+
+## Prepare intros for the hosts to read
+
+<https://pad.emacsconf.org/intros>
+also in :INTRO\_NOTE: in conf.org so that we can plop it into the hyperlists.
+
+
+### DONE Write intros for all the other talks
+
+so that people on other platforms can come across EmacsConf
+
+
+### DONE Record a few sample intros to test the workflow
+
+mogrify -alpha off file.png
+
+
+### DONE Write the restreaming shell scripts
+
+
+### DONE Create the events and save the keys :sachac:
+
+[Other platforms](file:///home/sacha/proj/emacsconf/private/conf.md)
+
+$1 is of the form rtmp://&#x2026;/stream\_key
+
+ 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
+
+Creating the events
+
+- YouTube: Create - Go Live - Schedule Stream - Streaming Software
+- Toobnix: Publish - Go live
+ - max live is 5 hours
+
+
+##### EmacsConf 2022 - General track
+
+This is for the general track of EmacsConf, the conference about the joy of Emacs and Emacs Lisp.
+
+Schedule:
+Saturday Dec 3, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+Sunday Dec 4, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+
+Watch using free/open source software: <https://live.emacsconf.org/2022/watch/gen/>
+Conference info: <https://emacsconf.org/2022/>
+Schedule: <https://emacsconf.org/2022/talks/>
+Chat on #emacsconf-dev via <https://chat.emacsconf.org> or irc.libera.chat
+Etherpad: <https://pad.emacsconf.org/2022>
+
+Videos are shared under the terms of the Creative Commons Attribution-ShareAlike 4.0
+International (CC BY-SA 4.0) license. Please observe the guidelines for conduct: <https://emacsconf.org/conduct/>
+
+
+##### EmacsConf 2022 - Development track
+
+This is for the development track of EmacsConf, the conference about the joy of Emacs and Emacs Lisp.
+
+Schedule:
+Saturday Dec 3, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+Sunday Dec 4, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+
+Watch using free/open source software: <https://live.emacsconf.org/2022/watch/dev/>
+Conference info: <https://emacsconf.org/2022/>
+Schedule: <https://emacsconf.org/2022/talks/>
+Chat on #emacsconf-dev via <https://chat.emacsconf.org> or irc.libera.chat
+Etherpad: <https://pad.emacsconf.org/2022>
+
+Videos are shared under the terms of the Creative Commons Attribution-ShareAlike 4.0
+International (CC BY-SA 4.0) license. Please observe the guidelines for conduct: <https://emacsconf.org/conduct/>
+
+
+### DONE Test start restream on a timer :emacsconf:
+
+ssh live0.emacsconf.org
+confirm that Toobnix test stream isn&rsquo;t playing
+
+echo &rsquo;/bin/bash /home/orga/screen-restream-test-toobnix.sh&rsquo; | at &rsquo;now + 1 minute&rsquo;
+echo &rsquo;/bin/bash /home/orga/screen-restream-test-toobnix.sh&rsquo; | at 8:30
+
+
+### TODO Process the other intros
+
+
+### DONE Record more intros :zaeph:
+
+
+### DONE Record two-part introduction for RMS talk
+
+Before Richard Stallman shares what he&rsquo;d like to see in Emacs, we will first play Richard Stallman&rsquo;s 2014 TEDx talk called &ldquo;Free Software, Free Society&rdquo;. The TEDx talk is licensed under the Creative Commons Attribution - No Derivative Works 3.0 license.
+
+The next talk is called &ldquo;What I&rsquo;d like to see in Emacs,&rdquo; by Richard Stallman. This talk will be under the Creative Commons Attribution - ShareAlike license like the other talks at EmacsConf. Afterwards, he will answer questions via a moderated Q&A, so please put your questions in the Etherpad or IRC.
+
+
+### DONE Add images to zaeph&rsquo;s intros :sachac:
+
+
+### DONE Add subtitles to intros
+
+
+### DONE rerecord zachary, pronunciation
+
+
+### DONE rerecord buddy, got mixed up with meetups
+
+
+### DONE redo visual for health, changed the title case
+
+
+### DONE rerecord indieweb, accent on the wrong syllable
+
+
+### DONE rerecord jupyter intro, repetitive
+
+
+### TODO consider rerecording meetups to add
+
+Spanish subtitles are also available for this talk.
+
+You can find them on the talk page.
+
+
+### TODO Contextualize journalism talk
+
+
+<a id="video-platforms"></a>
+
+## DONE Set up talks on Toobnix and YouTube :sachac:yt:toobnix:
+
+so that people can find the videos on other video platforms
+waiting for prerecs
+
+category 15: science and technology
+license 2: attribution - share alike
+language: en
+privacy 2: unlisted
+tags: emacs,emacsconf
+
+
+### DONE Add toobnix url on schedule
+
+
+### Upload to YouTube
+
+ (insert
+ (string-join
+ (seq-take
+ (seq-keep
+ (lambda (o)
+ (when (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :youtube-url)))
+ (format "./youtube-upload --client-secrets=../../client_secret.json --title=%s --description=%s --category=%s --tags=emacs,emacsconf --recording-date=%s --default-language=en --default-audio-language=en --embeddable=True %s"
+ (shell-quote-argument
+ (concat emacsconf-name " " emacsconf-year ": " (plist-get o :title) " - " (plist-get o :speakers-with-pronouns)))
+ (shell-quote-argument
+ (emacsconf-publish-video-description o))
+ (shell-quote-argument "Science & Technology")
+ (format-time-string "%Y-%m-%dT%H:%M:%S.0Z" (plist-get o :start-time) t)
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir)
+ )))
+ (emacsconf-get-talk-info)) 1)
+ "\n"))
+ ./youtube-upload --client-secrets=../../client_secret.json --title=EmacsConf\ 2022\:\ Writing\ and\ organizing\ literature\ notes\ for\ scientific\ writing\ -\ Vidianos\ Giannitsis --description=https\://emacsconf.org/2022/talks/science'
+ ''
+ '00\:00\:00\ My\ second\ brain'
+ '00\:28\ Contents\ of\ the\ talk'
+ '01\:40\ Bibliography\ management'
+ '02\:35\ Creating\ literature\ notes\:\ ivy-bibtex-edit-notes'
+ '03\:04\ org-roam\ reference\ template'
+ '04\:40\ Demo'
+ '05\:40\ Annotating\ with\ org-noter'
+ '06\:44\ Annotating\ in\ English'
+ '07\:02\ Afterthoughts\ on\ an\ article'
+ '07\:30\ Adding\ a\ note'
+ '08\:21\ Creating\ permanent\ notes\ from\ reference\ material'
+ '09\:01\ The\ organization\ problem'
+ '09\:21\ zetteldesk.el'
+ '10\:43\ The\ zetteldesk-desktop'
+ '11\:45\ Filtering\ with\ ivy-bibtex'
+ '12\:09\ Inserting\ literature'
+ '13\:46\ Composing\ the\ final\ article'
+ '15\:19\ Thanks'
+ ''
+ 'You\ can\ view\ this\ and\ other\ resources\ using\ free/libre\ software\ at\ https\://emacsconf.org/2022/talks/science\ .'
+ 'This\ video\ is\ available\ under\ the\ terms\ of\ the\ Creative\ Commons\ Attribution-ShareAlike\ 4.0\ International\ \(CC\ BY-SA\ 4.0\)\ license. --category=Science\ \&\ Technology --tags=emacs,emacsconf --recording-date=2022-12-03T15:45:00.0Z --default-language=en --default-audio-language=en --embeddable=True /home/sacha/proj/emacsconf/cache/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--final.webm
+
+
+### Toobnix
+
+ (insert
+ (string-join
+ (seq-keep
+ (lambda (o)
+ (when (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--main.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :toobnix-url)))
+ (format "cd ~/vendor/PeerTube; node dist/server/tools/peertube.js upload -f %s -n %s -l 2 -c 15 -P 2 -t emacs,emacsconf -L en -C emacsconf -d %s"
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--main.webm")
+ emacsconf-cache-dir)
+ (shell-quote-argument
+ (concat emacsconf-name " " emacsconf-year ": " (plist-get o :title) " - " (plist-get o :speakers-with-pronouns)))
+ (shell-quote-argument
+ (emacsconf-publish-video-description o)))))
+ (emacsconf-get-talk-info))
+ "\n"))
+
+
+### DONE Upload the rest of the talks to Toobnix
+
+
+### DONE Add Toobnix talks to a playlist
+
+ (mapc (lambda (o)
+ (when (plist-get o :toobnix-url)
+ (browse-url (plist-get o :toobnix-url))
+ (shell-command "xdotool sleep 5 mousemove 1815 1030 click 1 sleep 2 mousemove 1684 799 click 1 key Alt+Tab")
+ (read-string "Continue?")))
+ (let ((talks (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (seq-drop talks
+ (1+ (seq-position talks
+ (seq-find (lambda (o) (string= (plist-get o :slug) "haskell")) talks)))))
+ )
+
+
+### DONE Add Youtube talks to a playlist
+
+
+### DONE Upload talks to YouTube
+
+ (seq-keep
+ (lambda (o)
+ (when (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :youtube-url)))
+ (concat (plist-get o :video-slug) "--final.webm")))
+ (emacsconf-get-talk-info))
+
+ ;; This buffer is for text that is not saved, and for Lisp evaluation.
+ ;; To create a file, visit it with C-x C-f and enter text in its buffer.
+
+ (let ((pos (shell-command-to-string "xdotool getmouselocation")))
+ (when (string-match "x:\\([0-9]+\\) y:\\([0-9]+\\)" pos)
+ (insert (format "(shell-command \"xdotool mousemove %s %s click 1\")\n" (match-string 1 pos) (match-string 2 pos)))))
+
+ (setq list (seq-filter (lambda (o)
+ (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :youtube-url))))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (setq list (cons talk list))
+
+ (while list
+ (progn
+ (shell-command "xdotool mousemove 707 812 click 1 sleep 2")
+
+ (setq talk (pop list))
+ ;; click create
+ (shell-command "xdotool mousemove 843 187 click 1 sleep 1")
+ ;; video
+ (shell-command "xdotool mousemove 833 217 click 1 sleep 1")
+ ;; select files
+ (shell-command (concat "xdotool mousemove 491 760 click 1 sleep 4 type "
+ (shell-quote-argument (concat (plist-get talk :video-slug) "--final.webm"))))
+ ;; open
+ (shell-command "xdotool mousemove 1318 847 click 1 sleep 5")
+
+ (kill-new (concat
+ emacsconf-name " "
+ emacsconf-year ": "
+ (plist-get talk :title)
+ " - "
+ (plist-get talk :speakers-with-pronouns)))
+ (shell-command "xdotool sleep 1 mousemove 331 440 click :1 key Ctrl+a Delete sleep 1 key Ctrl+Shift+v sleep 2")
+
+ (kill-new (emacsconf-publish-video-description talk t))
+ (shell-command "xdotool mousemove 474 632 click 1 sleep 1 key Ctrl+a sleep 1 key Delete sleep 1 key Ctrl+Shift+v"))
+ (read-string "Press a key once you've pasted in the description")
+
+ ;; next
+ (when (emacsconf-captions-edited-p (expand-file-name (concat (plist-get talk :video-slug) "--main.vtt") emacsconf-cache-dir))
+ (shell-command "xdotool mousemove 352 285 click 1 sleep 1")
+
+ ;; add captions
+ (shell-command "xdotool mousemove 877 474 click 1 sleep 3")
+ (shell-command "xdotool mousemove 165 408 click 1 sleep 1")
+ (shell-command "xdotool mousemove 633 740 click 1 sleep 2")
+ (shell-command (concat "xdotool mousemove 914 755 click 1 sleep 4 type "
+ (shell-quote-argument (concat (plist-get talk :video-slug) "--main.vtt"))))
+ (read-string "Press a key once you've loaded the VTT")
+ (shell-command "xdotool mousemove 910 1037 sleep 1 click 1 sleep 4")
+ ;; done
+ (shell-command "xdotool mousemove 890 297 click 1 sleep 3")
+ )
+
+
+ (progn
+ ;; visibility
+ (shell-command "xdotool mousemove 810 303 click 1 sleep 2")
+ ;; public
+ (shell-command "xdotool mousemove 119 614 click 1 sleep 2")
+ ;; copy
+ (shell-command "xdotool mousemove 882 669 click 1 sleep 1")
+ ;; done
+ (shell-command "xdotool mousemove 908 1089 click 1 sleep 5 key Alt+Tab")
+
+ (emacsconf-with-talk-heading talk
+ (org-entry-put (point) "YOUTUBE_URL" (read-string "URL: "))
+ ))
+ )
+
+ ;; (shell-command "xdotool mousemove 165 408 click 1 sleep 1")
+ ;; (shell-command "xdotool mousemove 2312 1483 click 1 sleep 1")
+ ;; ;; schedule
+ ;; (shell-command "xdotool mousemove 1527 752 click 1")
+ ;; (message "%s" (format-time-string "%Y-%m-%d %I:%M %p" (plist-get talk :start-time)
+ ;; emacsconf-timezone))))
+ ;; ;; (shell-command (concat "xdotool mousemove 1695 611 click 1 key Shift+PgDn Ctrl+a Del type "
+ ;; ;; (format-time-string "%I:%M %p"
+ ;; ;; (plist-get talk :start-time)
+ ;; ;; emacsconf-timezone)))
+ ;; ;; copy link
+
+ ;; (progn
+ ;; (shell-command "xdotool mousemove 2284 668 click 1 sleep 1 click 1")
+ ;; ;; schedule
+ ;; (shell-command "xdotool mousemove 2324 1498 click 1 sleep 3")
+
+ ;; ;; close
+ ;; (shell-command "xdotool mousemove 2100 996 click 1")
+ ;; )
+
+
+### DONE upload the rest of the files onto Toobnix
+
+
+### TODO Upload more Toobnix and YouTube talks
+
+
+<a id="dry-run"></a>
+
+## DONE Do another run
+
+Summary:
+
+- bandali will stream from his computer; confirmed can stream to dev
+- corwin will probably connect to gen by VNC; confirmed can connect to VNC and click around, need to become more familiar with setup after trip
+- sachac will be backup streamer if bandali or corwin are unavailable
+
+Goals:
+
+- Good: Streamers are set up to broadcast from their own OBS if needed (could be a backup plan, could be the main plan)
+- Better: Streamers can connect to the VNC session for their track, manage OBS, start videos (with overlays), and browse the Q&A links
+- Best: Streamers can connect via emacsclient in orga@res.emacsconf.org, manage the task status, and have everything working
+
+Agenda:
+
+- Get familiar with the setup
+- Consider whether we want to prioritize local OBS (more screen real estate) or stream OBS (easier swapping, can be controlled remotely)
+- Consider whether we want mumble to be able to quickly add audio; how do we want to set it up scene-wise?
+
+
+### Checklist for later dry run
+
+1. Streams
+ - [ ] General stream
+ - [ ] Development stream
+ - [ ] 480p streams
+2. Scenes
+ - [ ] Intro
+ - [ ] Prerec
+ - [ ] Q&A: live
+ - [ ] Q&A: IRC
+ - [ ] Q&A: pad
+3. [ ] IRC channels
+ - [ ] Announce
+ - [ ] Question handling
+ - [ ] Timers
+4. [ ] Watching pages
+ - [ ] Before launch
+ - [ ] Streaming
+ - [ ] Emergency announcement
+5. [ ] Pads
+6. [ ] Wiki
+ - [ ] Schedule update
+ - [ ] Message on the schedule
+ - [ ] Prerec live
+7. [ ] Wind everything down
+
+Later on
+
+- [ ] Toobnix stream
+- [ ] YouTube stream
+
+
+### Create test
+
+gst-launch-1.0 compositor name=mix sink\_1::xpos=1180 sink\_1::ypos=470 ! videoconvert ! autovideosink filesrc location=community-title.svg ! rsvgdec ! imagefreeze num\_buffers=100 ! mix. videotestsrc ! video/x-raw,width=400,height=300 ! mix. audiotestsrc freq ! autoaudiosink
+
+gst-launch-1.0 compositor name=mix sink\_1::xpos=1200 sink\_1::ypos=600 ! videoconvert ! autovideosink \\
+filesrc location=community-title.svg ! rsvgdec ! imagefreeze num\_buffers=100 ! mix. \\
+filesrc location=background.opus ! oggdemux ! opusdec ! audioconvert ! audioresample ! mix.
+videotestsrc ! video/x-raw,width=400,height=300,framerate=25/1 num\_buffers=(25 \* (4 \* 60 + 5)) ! mix.
+
+gst-launch-1.0 webmmux name=mux ! filesink location=community.webm \\
+compositor name=mix sink\_1::xpos=1200 sink\_1::ypos=600 ! videoconvert ! vp8enc ! queue ! mux.video\_0 \\
+filesrc location=community-title.svg ! rsvgdec ! imagefreeze num\_buffers=2450 ! mix. \\
+filesrc location=background.opus ! oggdemux ! opusdec ! audioconvert ! audioresample ! vorbisenc ! queue ! mux.audio\_0 \\
+videotestsrc num\_buffers=2450 ! video/x-raw,width=400,height=300,framerate=10/1 ! mix.
+
+1251,/home/sacha/proj/emacsconf/private/assets/titles% find -name community-title.svg -exec inkscape &#x2013;export-type=png &#x2013;export-width=1280 &#x2013;export-height=720 &#x2013;export-background-opacity=0 {} \\;
+
+
+### DONE Do mini dry run
+
+
+#### DONE Revisit OBS and streaming setup to prepare for the dry run next weekend
+
+
+#### DONE Make mini dry run hyperlist with buttons
+
+- hh:mm slug
+ - hyperlist note
+ - set talk playing
+ - play intro
+ - play talk
+ - set talk closed q
+ - join bbb
+ - set talk open q
+ - set talk to archive
+
+(emacsconf-hyperlist-show-streamer-day &ldquo;2022-12-03&rdquo;)
+(emacsconf-hyperlist-show-streamer-day &ldquo;2022-12-04&rdquo;)
+
+Testing:
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">intro</td>
+<td class="org-left">talk</td>
+<td class="org-left">Q&amp;A</td>
+<td class="org-left">Expected</td>
+</tr>
+
+
+<tr>
+<td class="org-left">journalism</td>
+<td class="org-left">recorded</td>
+<td class="org-left">live</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">school</td>
+<td class="org-left">recorded</td>
+<td class="org-left">recorded</td>
+<td class="org-left">IRC</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">handwritten</td>
+<td class="org-left">recorded</td>
+<td class="org-left">recorded</td>
+<td class="org-left">BBB</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">treesitter</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">health</td>
+<td class="org-left">live</td>
+<td class="org-left">recorded</td>
+<td class="org-left">BBB</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">jupyter</td>
+<td class="org-left">live</td>
+<td class="org-left">live</td>
+<td class="org-left">BBB</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+</tbody>
+</table>
+
+- journalism: recorded intro, recorded talk, live
+
+(emacsconf-hyperlist-show-streamer-day &ldquo;2022-12-03&rdquo; nil
+(list &ldquo;journalism&rdquo; &ldquo;school&rdquo; &ldquo;treesitter&rdquo; &ldquo;handwritten&rdquo; &ldquo;health&rdquo; &ldquo;jupyter&rdquo;))
+
+
+### DONE Do a dry run for the dry run
+
+
+<a id="upload-off"></a>
+
+## TODO Turn off file upload service on media.emacsconf.org :sachac:infra:
+
+so that nginx can have more memory and we don&rsquo;t risk slowdowns
+
+
+<a id="review"></a>
+
+## DONE Review notebook for tasks, priorities, and scheduling
+
+
+### TODO Review tasks
+
+
+<a id="mumble"></a>
+
+## Use Mumble for backchannel coordination and also on-stage
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-11-19 Sat] </span></span> sachac: Confirmed that you can join the emacsconf-dev or emacsconf-gen channel if you have access, and you can speak on air in just that channel
+
+
+### DONE Update the Mumble setup :bandali:
+
+- [X] Add emacsconf-gen and emacsconf-dev channels
+- [X] Give the emacsconf-gen and emacsconf-dev users access to them
+- [X] Give the other organizers access to emacsconf-gen, emacsconf-dev, and org-private
+- [X] Get emacsconf-gen and -dev to join the right channels
+
+
+### DONE E-mail volunteers and help them get on Mumble :bandali:
+
+
+#### Template
+
+We plan to use Mumble as a virtual walkie-talkie during the conference
+so that we can quickly talk to each other as needed. It can also be a
+way for us to add our audio to the streams. Please set up your system
+as follows:
+
+1. Install a Mumble client on the device you want to use to connect to
+ the voice channel. It can be your computer or phone. You can choose
+ the username that you would like to log in with.
+2. Create and backup your certificate. (This is part of the wizard for
+ the desktop client, and it might be automatic on a phone client.)
+3. Connect to mumble.emacsconf.org with your desired username.
+4. Register your account on the server using the `Self > Register`
+ command. This reserves your username using your certificate and
+ allows me to add you to ACLs.
+5. Let me know (sachac on #emacsconf-org in IRC or
+ sacha@sachachua.com) when you&rsquo;ve registered so that I can add you
+ to the access control lists for the private channels. If I&rsquo;m around
+ on mumble (sachac), you can say hi to me there and confirm that
+ it&rsquo;s working.
+
+You can enter a channel by double-clicking on it. (On Mumla for
+Android, entering a channel is instead done by clicking on the arrow
+to the right of the channel.) Then your audio will go to that channel,
+and you can hear audio from that channel. We can use the
+`emacsconf-gen` and `emacsconf-dev` channels to speak on air, and we
+can use the `backstage` channel for coordination.
+
+Looking forward to hearing from you!
+
+Sacha
+
+
+### DONE Generate certificates, add them to conf.org, and register the users :sachac:
+
+
+### DONE Set up Mumble and bring the volunteers on board
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">&#xa0;</th>
+<th scope="col" class="org-left">Emailed</th>
+<th scope="col" class="org-left">Onboarded</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">FlowyCoder</td>
+<td class="org-left">X</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2022-11-19 Sat] </span></span> access granted, briefed</td>
+</tr>
+
+
+<tr>
+<td class="org-left">jman</td>
+<td class="org-left">X</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2022-11-21 Mon] </span></span> access granted, briefed</td>
+</tr>
+
+
+<tr>
+<td class="org-left">vetrivln</td>
+<td class="org-left">X</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2022-11-19 Sat] </span></span> access granted, briefed</td>
+</tr>
+</tbody>
+</table>
+
+
+### DONE set up Mumble channels for host-dev and host-gen?
+
+zaeph wants to make it easy to talk to the host without distracting them all the time
+
+
+### DONE add dry-run check of whispering to hosts
+
+
+<a id="satellite"></a>
+
+## Satellite events
+
+
+### Zurich
+
+
+#### DONE Link to satellite events on the wiki :bandali:
+
+<https://200ok.ch/posts/2022-11-01_emacsconf__with_a_new_physical_venue.html>
+
+on the watch page
+
+
+#### DONE announce on the emacsconf-discuss mailing list :bandali:
+
+
+<a id="volunteer-2022-11-14"></a>
+
+## Volunteer update
+
+- talk banners, akshay
+
+
+<a id="hyperlist"></a>
+
+## Make a linear hyperlist for managing EmacsConf :sachac:
+
+Goal:
+
+- Volunteers should be able to coordinate everything by stepping through a linear list of things to do
+- The hyperlist will primarily live on orga@res.emacsconf.org and be accessed through emacsclient. (Maybe sat.org and sun.org)
+- Volunteers should be able to take breaks as needed
+
+emacsconf-hyperlist-show-streamer-day
+
+[How do we want to coordinate during the conference itself?](#coordination)
+
+
+### DONE Try writing it to an Etherpad
+
+
+### DONE Revisit the hyperlists to make sure they make sense
+
+
+### DONE Add intro notes and specific talk notes to the hyperlist
+
+
+### DONE Make a hyperlist for checking people in for easier copying and pasting
+
+
+### DONE Send FlowyCoder hyperlist for checking people in :mail:
+
+[Use Mumble for backchannel coordination and also on-stage](file:///home/sacha/proj/emacsconf/wiki/2022/organizers-notebook/index.md)
+
+
+#### DONE make sure live talks are on the checkin list
+
+
+### DONE Make backstage redirects for pad and qa so that hosts and streamers can have an easier time
+
+ex:
+<https://media.emacsconf.org/2022/backstage/current/pad/journalism>
+<https://media.emacsconf.org/2022/backstage/current/room/journalism>
+
+Pattern:
+<https://media.emacsconf.org/2022/backstage/current/slug/pad>
+<https://media.emacsconf.org/2022/backstage/current/slug/room>
+<https://media.emacsconf.org/2022/backstage/current/pad/slug>
+<https://media.emacsconf.org/2022/backstage/current/room/slug>
+
+
+### CANCELLED Regenerate hyperlist if sched changes
+
+
+### CANCELLED Put shell commands on a separate line so they&rsquo;re easy to select and run
+
+
+### DONE Make a hyperlist for hosts
+
+
+### DONE Update etherpad hyperlist
+
+
+### DONE Adjust audio levels from hyperlist
+
+
+### TODO Adjust audio levels from hyperlist with a repeat-mode keymap
+
+
+### DONE Link pamix to a konsole ssh
+
+
+### DONE Add monitoring the streams to the hyperlist / shortcuts
+
+
+### TODO Test hyperlist on obs and record quick demos
+
+
+<a id="rec-intro"></a>
+
+## TODO Record intro/outro for day-1 and day-2 :zaeph:
+
+- Opening remarks Sat
+ - Welcome to EmacsConf 2022
+ - What&rsquo;s new at EmacsConf?
+ - This year, we have two tracks: General and Development.
+ - Prerecorded videos will be published as soon as possible (aiming
+ for publishing them as the talks stream), so you can check the
+ talk page for the video and the transcript a few minutes after the
+ talk starts.
+ - How to participate
+ - You can watch at live.emacsconf.org using free and open source software.
+ - Select the stream you&rsquo;re interested in.
+ - There are quick shortcuts on the watch page so that you can
+ open the Etherpad, Q&A, or IRC.
+ - We recommend adding notes asking questions in the Etherpad
+ for the talk. That way, it&rsquo;s easier to organize the
+ questions and answers, and the host can read questions out
+ to the speaker as needed.
+ - You can also use the track-specific IRC channels
+ (#emacsconf-gen and #emacsconf-dev).
+ - You can look at the schedule to see what else is going on.
+ - IRC:
+ - You can use #emacsconf for hallway conversations.
+ - If you need to reach conference organizers, you can use the
+ \#emacsconf-org IRC channel or e-mail sacha@sachachua.com .
+ - General feedback in pad.emacsconf.org/2022
+ - Accessibility
+ - Streaming with open captions thanks to speakers and volunteers
+ - Talks indicated with &ldquo;captioned&rdquo; on the schedule
+ - Transcript available on talk pages
+ - Encourage people to add notes, questions, and answers to the
+ Etherpad, which will be archived as plain text on the talk
+ pages after the conference
+ - If you need additional support, ask in #emacsconf-accessible or #emacsconf-org
+- Closing remarks Sat
+ - Thanks
+ - Thank you to all the speakers and participants.
+ - This year&rsquo;s conference will be hosted by zaeph, bandali, and
+ vetrivln, and streamed by corwin, bandali, and jman.
+ - Thanks to our captioning volunteers: sachac, bhavin192, Tom
+ Purl, Hannah Miller, triko, and anush, and also to the speakers
+ who captioned their own talks. Thanks to quiliro for translating
+ the meetups talk into Spanish. and to Akshay Gaikwad for
+ contributing some designs.
+ - Thanks to the Free Software Foundation for the mailing
+ lists. Thanks to Ry P for the server that we&rsquo;re using for OBS
+ streaming and for processing videos.
+ - Come back tomorrow
+- Closing remarks Sun
+ - Thanks
+ -
+
+
+### DONE Review opening remarks from last year
+
+<https://emacsconf.org/2021/talks/day1-open/>
+
+
+<a id="link-pages"></a>
+
+## TODO Add category tags and possibly links between talks across 2022 and all previous years :quiliro:wiki:
+
+- Prerequisite: Can edit wiki pages (<https://emacsconf.org/edit/>)
+- Goal: Make it easier for people to discover interesting related talks
+
+- List of talks for EmacsConf 2022: <https://emacsconf.org/talks/>
+- List of talks: <https://emacsconf.org/talks/>
+- List of categories: <https://emacsconf.org/CategoryCategory/>
+- To add something to a category, add `\[[!taglink CategoryName]]` to the bottom of its talk page (ex: 2022/talks/maint.md is in CategoryCommunity)
+- You can create new categories by making up new CategoryNames.
+- You can also link to a talk with a link like this: `\[[/2022/talks/maint|Maintaining the Maintainers: Attribution as an Economic Model for Open Source]]`
+ You can make a new heading called `# Related talks`
+
+
+<a id="watch-css"></a>
+
+## TODO JS/CSS enhancement :emacsconf:
+
+
+### TODO Add start and end attributes to the brief stuff for possible JS/CSS
+
+
+### TODO Consider putting the subtitles outside the video <https://stackoverflow.com/questions/61826237/is-there-a-simple-way-to-position-subtitles-below-the-hlml5-video> :emacsconf:
+
+<file:///home/sacha/sync/orgzly/Inbox.md>
+
+
+### SOMEDAY Make video sticky and move it to the right :js:css:nextyear:
+
+<https://webdesign.tutsplus.com/tutorials/how-to-create-a-sticky-floating-video-on-page-scroll--cms-28342>
+
+
+<a id="ansible"></a>
+
+## TODO Build up the ansible playbook :sachac:opal:
+
+git@git.emacsconf.org:pub/emacsconf-ansible
+
+Goals:
+
+Playbook will be able to reproduce:
+
+- [Etherpad](#etherpad): probably okay to deploy on VPS
+- web-based file upload: probably in a docker
+- publishing environment for schedule etc.
+
+in prod or docker container
+
+
+### DONE restreamers on live0
+
+[Set up stream events on Toobnix and YouTube](#other-streams)
+
+
+### DONE icecast on live0
+
+(find-file &ldquo;/ssh:live|sudo::/etc/icecast2/icecast.xml&rdquo;)
+
+
+#### DONE Set up watch/gen-480p
+
+
+### DONE publishing environment
+
+
+### DONE Get ansible to run against a clean docker
+
+
+### DONE Set up Etherpad with MySQL
+
+
+### TODO Make the upload ansible configuration controllable via a variable
+
+
+<a id="breakouts"></a>
+
+## SOMEDAY Consider breakout rooms for lunch break
+
+
+<a id="obs-scenes"></a>
+
+## CANCELLED Work on the OBS scenes :zaeph:corwin:sachac:
+
+- [ ] corwin is out from Nov 11-20, and we should start working on them before then.
+
+
+<a id="etherpad"></a>
+
+## INPROGRESS Plan Etherpad use and hosting :sachac:ansible:
+
+- Relevant links:
+ - Per-pad, nicely structured info with abstract, watching information, etc. CarpentryCon 2022 Schedule • CarpentryCon 2022 <https://2022.carpentrycon.org/>
+ - One pad per session: <https://meta.wikimedia.org/wiki/Arctic_Knot_Conference_2021/Program#Friday,_June_25th>
+ - [Etherpad integration in Jitsi ](https://community.jitsi.org/t/tutorial-etherpad-integration-in-jitsi-meetings/99697)
+
+- Good: One pad per session
+- Better: Some kind of monitoring so that we can link to the pads or embed
+ the pads even before the conference starts while not risking too
+ much vandalism
+- Best:
+ - Pad can be easily regenerated from Emacs Lisp with a check to see if people have been adding to it
+ - Pad links to next talks
+
+Where should we host this?
+
+- live0: gets scaled up the most, lots of people connect to it for the conference, didn&rsquo;t hit performance constraints last time
+- front0: lower risk of interfering with stream
+- bbb: will already be put on strain with the concurrent streams (test showed it was stable with up to 10 concurrent video streams and 40 total participants)
+- opal’s: no news from owner, but beefy server that we used for reencode last year
+- new Linode (probably 4GB or 8GB shared CPU): can easily be spun up, yay Ansible
+
+[Ansible notes](#ansible)
+
+Consider if we need extra scaling beyond being on a beefy live0?
+
+- Scale calculator: <https://scale.etherpad.org/>
+ - assuming 3 concurrent authors, 100 lurkers per pad, 3 concurrent pads
+ - 1 core, 4GB RAM, bandwidth Mb/s: 7.488
+- <https://mclear.co.uk/2021/09/08/deploying-etherpad-at-scale-in-one-minute/>
+- <https://github.com/ether/etherpad-load-test>
+
+Will need to try this again when we resize nodes. Probably just the extra memory will be enough and the CPU use from node won&rsquo;t step on the streaming, but not sure
+
+
+### DONE Use the API to create pages based on all the slugs
+
+
+### CANCELLED Figure out monitoring; maybe get everything daily and commit to git repo?
+
+History or regeneration will be fine. We&rsquo;ll probably link to it shortly before the event, and we can also turn off the service until we&rsquo;re ready.
+
+
+### DONE Generate talk-specific pad content
+
+
+### DONE Set up nginx reverse proxy
+
+
+### DONE Load-test
+
+tl;dr: Either a separate 4GB Linode or being on live0 will probably be
+okay, but I&rsquo;m not 100% sure due to the limitations of my load-testing
+setup. I don&rsquo;t know if we need to shard by pad.
+
+It looks like etherpad-load-test tends to max out at ~40 connections
+on a specific node. I used GNU Parallel to run the loadtesting tool
+against a 4GB Linode instance (shared CPU) from five nodes at the same
+time (my X220, my 2GB Linode instance, front0, and the node with the
+pad), and they all reached about 35-45 clients before failure (not
+updating within 100ms).
+
+ echo 'node node_modules/etherpad-load-test/app.js http://170.187.195.5:9001 -d 120 > ~/output.txt' | parallel -J loadtest -j 1 --onall --verbose --tag
+
+ echo 'grep Local ~/output.txt | tail -1' | parallel -J loadtest -j 1 --onall --tag
+
+Files were created at roughly the same time, so the max loads probably
+overlapped. It would be good to have finer control over the
+etherpad-load-test tool. Haven&rsquo;t figured out how to properly use `-l`
+and `-a` yet.
+
+ echo 'stat -c %y ~/output.txt' | parallel -J loadtest -j 1 --onall --tag
+
+CPU graph went only up to 5%. Network max was 2.36 Mb/s in, 1.25 Mb/s out.
+looking at top, CPU seems to go only up to about 12% or so.
+
+
+### DONE Set up pad.emacsconf.org to point to live0.emacsconf.org :bandali:
+
+
+### DONE Set up letsencrypt
+
+Waiting for DNS
+add to /etc/dehydrated/domains.txt
+sudo sh -x /etc/cron.daily/renew-https-cert-local
+
+
+### DONE Link to pad from talk page
+
+
+### DONE Add links to general conference pad
+
+for collecting feedback
+
+
+### TODO Prototype shift pads for easier scrolling
+
+if we can get the anchor plugin
+
+
+### DONE Be able to fall back to wikimedia if necessary, maybe with nginx redirects
+
+
+### DONE Export pad initial content HTML to make it easier to reimport into wikimedia or elsewhere
+
+`emacsconf-pad-export-initial-content-for-all-talks`
+
+
+### SOMEDAY Cache pad times in a json or el :emacsconf:
+
+
+### DONE Confirm that we can use the time slider to move back in time
+
+
+### TODO Consider monospace font for Etherpad? :nextyear:
+
+
+<a id="writing"></a>
+
+## TODO Write about EmacsConf behind the scenes :sachac:
+
+
+### TODO Write about scheduling and tracks
+
+
+### TODO Write about scheduling and summing up properties
+
+
+### TODO Write about scheduling and SVG
+
+
+### TODO Write about timers and todo state change hooks
+
+
+### TODO Write about TRAMP and workaround of shifting talks
+
+
+### TODO Write about OBS on VNC
+
+
+### TODO Write about BBB redirects and opening things up
+
+
+### TODO Write about ERC announcements
+
+
+### TODO Write about copying files to backstage
+
+
+### TODO Write about captions
+
+
+### SOMEDAY Write about setup for vnc
+
+
+### SOMEDAY Write about setting org properties from a region, looking at tables, summing it up
+
+
+### SOMEDAY Record animation of changing the schedule
+
+
+### SOMEDAY Write about mail merge
+
+
+### #EmacsConf behind the scenes: Testing the schedule with SVGs
+
+> Org mode allows you to have inline images, and you can return them as the results of Org Babel
+> blocks. I wanted to test different #EmacsConf scheduling strategies quickly. I used Emacs&rsquo;s XML and
+> SVG support to create the SVGs based on the scheduling data I gave it. Splitting my window made it
+> easy to change the schedule, use \`C-c C-c\` to execute the block, and see the schedule image
+> (including any validation notes) in the other window. The code is in
+> <https://git.emacsconf.org/emacsconf-el/tree/emacsconf-schedule.el> .
+>
+> [Screenshot of how I tested #EmacsConf scheduling strategies using inline images in an Org file](https://emacs.ch/system/media_attachments/files/109/485/992/555/721/586/original/7bf3ab2a89fdcaec.png)
+
+<https://emacs.ch/@sachac/109486006078029919>
+
+
+### SOMEDAY <https://graz.social/@publicvoit/109496340869869181>
+
+publicvoit@graz.social - Organizers of online #video #conferences: take a look at the amazing work the organizers of #EmacsConf are doing with the pre- and post-processing of a 9 minute demo #video: <https://emacsconf.org/2022/talks/orgsuperlinks/>
+
+Subtitles, transcript, (Q&A from the live discussion are following), chapter marks, discussion thread from the #Etherpad used, &#x2026;
+
+I only wrote the &rsquo;Description&rsquo; section and contributed the raw video file. It&rsquo;s really impressive what @sachac and the other organizers + volunteers are doing here.  
+
+
+<a id="maybe-projects"></a>
+
+# Ideas for next year :nextyear:
+
+
+## Possible talks
+
+
+### SOMEDAY Is eMacs worth using/learning for non programmers? I.e are there non programming applications for it?
+
+<https://www.reddit.com/r/emacs/comments/107y169/is_emacs_worth_usinglearning_for_non_programmers/>
+Interesting comments
+
+
+## SOMEDAY <https://www.reddit.com/r/i3wm/comments/b1hgxm/i3wm_over_vnc_with_dual_monitors/?utm_source=share&utm_medium=android_app&utm_name=androidcss&utm_term=2&utm_content=share_button> might be interesting to have dual monitors next year
+
+
+## SOMEDAY Suggest public submissions next time
+
+would it be interesting to see if other people can build on what&rsquo;s submitted?
+
+
+## SOMEDAY Match /names with speakers, maybe make a page with people currently online
+
+
+## SOMEDAY EmacsWiki: Erc Robot
+
+<https://www.emacswiki.org/emacs/ErcRobot>
+
+After I get ikiwiki sorted out, I can use Erc to control it so that I can test it a lot before letting it mess with the real thing
+
+Goals:
+Update schedule
+Publish prerec when talk is playing
+
+
+### SOMEDAY Irc bot for opening
+
+notice the message
+open the Q&A specified by slug, or look it up from the channel
+
+
+## TODO Consider making a bot to support announcing, updating, publishing, who&rsquo;s here, announcing when speakers are here
+
+<https://salsa.debian.org/rhonda/schedulebot>
+
+- announces:
+ - $talk will start in $min minutes
+ - $talk has just begun
+ - $talk has just finished
+- seen
+
+
+## SOMEDAY indentation - CSS - successive indenting of siblings after headings - Stack Overflow
+
+<https://stackoverflow.com/questions/31872535/css-successive-indenting-of-siblings-after-headings>
+
+
+## SOMEDAY html - Indent everything after h1, h2, etc. before the next, one, while stacking the indents, with CSS - Stack Overflow
+
+<https://stackoverflow.com/questions/69711847/indent-everything-after-h1-h2-etc-before-the-next-one-while-stacking-the-in>
+
+
+## Video
+
+
+### SOMEDAY infrastructure/source-recording.sh at master · FOSDEM/infrastructure
+
+<https://github.com/FOSDEM/infrastructure/blob/master/ansible/playbooks/roles/video-bbb/files/scripts/source-recording.sh>
+
+
+### SOMEDAY c3voc/voctomix - Docker Image | Docker Hub
+
+<https://hub.docker.com/r/c3voc/voctomix/>
+
+
+### SOMEDAY DebConf video team / vogol · GitLab
+
+<https://salsa.debian.org/debconf-video-team/vogol>
+
+
+### SOMEDAY roles/vogol · master · DebConf video team / ansible · GitLab web interface for voctomix
+
+<https://salsa.debian.org/debconf-video-team/ansible/-/tree/master/roles/vogol>
+
+
+### SOMEDAY CarlFK/veyepar: Video Eyeball Processor and Review
+
+<https://github.com/CarlFK/veyepar>
+
+
+### SOMEDAY timvideos/streaming-system: Tim Video&rsquo;s - Live Streaming for user groups and other events.
+
+<https://github.com/timvideos/streaming-system>
+
+
+### SOMEDAY <no title> — DebConf Videoteam Ansible documentation
+
+<https://debconf-video-team.pages.debian.net/ansible/ansible_roles/etherpad.html>
+
+
+### SOMEDAY DebConf video team / ansible · GitLab
+
+<https://salsa.debian.org/debconf-video-team/ansible>
+
+
+## SOMEDAY handprint · PyPI
+
+<https://pypi.org/project/handprint/>
+That might be interesting for reviewing text recognition output
+
+
+## TODO Update websocket
+
+
+## TODO Idea for next year: save talk details in an org note so that I can easily send e-mails comparing previous with current
+
+<file:///home/sacha/proj/emacsconf/wiki/2022/speakers.md>
+
+
+## DONE What ideas do we want to borrow from other conferences?
+
+- FOSDEM had a conference track
+ - <https://archive.fosdem.org/2022/schedule/track/conference_organisation/>
+- DebConf
+ - Thorough documentation at <https://debconf-video-team.pages.debian.net/docs/>
+ - <https://debconf-video-team.pages.debian.net/docs/online_volunteer_roles.html>
+ - Ansible: <https://salsa.debian.org/debconf-video-team/ansible> , <https://debconf-video-team.pages.debian.net/ansible>
+ - SReview for cutting videos?
+ - <https://wiki.debian.org/Teams/DebConf/Video/Subtitles>
+ - Pentabarf <https://lists.debian.org/debconf-team/2008/08/msg00147.html>
+ - Schedule shows local time and DebConf time: <https://debconf21.debconf.org/schedule/>
+- LibrePlanet <https://libreplanet.org/2022/>
+
+ - libreadventure, minetest?
+
+ - <https://www.collabmagazine.com/organizing-a-multi-track-virtual-conference-with-microsoft-teams-live-events-a-technical-playbook-and-lessons-learned/> : 4-person team, post-prod, break commercials
+
+
+### SOMEDAY virtual-conf-resources/foss-north.md at master · e8johan/virtual-conf-resources
+
+<https://github.com/e8johan/virtual-conf-resources/blob/master/foss-north.md>
+
+
+### SOMEDAY e8johan/virtual-conf-resources: Resources for virtual conferences
+
+<https://github.com/e8johan/virtual-conf-resources>
+
+
+## TODO Consider hosting reveal.js for EmacsConf
+
+
+## TODO back up media and bbb
+
+
+## TODO figure out how zaeph can run ansible
+
+
+## TODO Check that the restreams can handle hiccups
+
+<https://toobnix.org/w/dmibQFkBTNcJyTVVQTyd5C>
+
+ugh might need to restart restreams
+PTS 233286211, next:63716000 invalid dropping st:0
+DTS 233286223, next:63828674 st:1 invalid dropping
+
+screen -S restream-test-toobnix -X quit; screen-restream-test-toobnix.sh
+screen -S restream-test-youtube -X quit; screen-restream-test-youtube.sh
+screen -S restream-gen-toobnix -X quit; screen-restream-gen-toobnix.sh
+screen -S restream-gen-youtube -X quit; screen-restream-gen-youtube.sh
+screen -S restream-dev-toobnix -X quit; screen-restream-dev-toobnix.sh
+screen -S restream-dev-youtube -X quit; screen-restream-dev-youtube.sh
+
+ugh sound timestamps get all messed up
+
+
+## TODO Figure out how to have a test talk for publishing
+
+
+## TODO figure out back button
+
+<bandali> hmm, for some reason with firefox the back button doesn&rsquo;t seem to
+ work as expected on after clicking on one of the tracks on
+ live.emacsconf.org [21:44]
+<bandali> seems like there&rsquo;s an additional redirect or something. doesn&rsquo;t
+ matter too much tho [21:45]
+
+
+## TODO Erc bot so bandali and zaeph can check time remaining
+
+
+## TODO make hotkeys for kicking the 480p streams
+
+
+## SOMEDAY Add timezones to all schedules
+
+
+## SOMEDAY <https://social.coop/@jotaemei/109456544613400591>
+
+jotaemei@social.coop - This year’s #Emacs Conference is taking place right now; its official website is naturally RMS/FSF/MIT flavored. The video feed is not working on my mobile phone browser. So, the alternative instructions are to open a link in MPV (will VLC work?) on a desktop. The event times that are given in the schedule do not display a timezone. And presentation notes and collection of audience questions are provided via Etherpad. 😆 I hope the recordings will be available. ☺️ <https://emacsconf.org/2022/watch/dev/>
+
+
+## SOMEDAY Consider idle timer for wiki publishing the wiki, at for running things
+
+
+## SOMEDAY Re: How to avoid the user triggering &ldquo;Forbidden reentrant call of Tramp&rdquo;
+
+<https://lists.gnu.org/archive/html/tramp-devel/2021-04/msg00036.html>
+
+
+## TODO Make it easier to ship a last-minute update
+
+1. Upload file to backstage
+2. make all
+3. Copy to orga@res:~/stream
+4. Sync it to orga@res:~/cache
+
+
+## SOMEDAY Add timezone note above every schedule table
+
+
+## TODO Braindump things that worked well and things I&rsquo;m looking forward to tweaking
+
+
+## TODO Incorporate zaeph&rsquo;s braindump
+
+
+## SOMEDAY <https://social.coop/@jotaemei/109468491432592197>
+
+jotaemei@social.coop - @sachac I like this idea of a timezone converter for people displayed on (or by) the listing. For me, the cause was that I was trying to find my way around the site at the last second and was afraid I’d missed a presentation I saw someone post earlier about coming up, but I think it was just that the speakers were running a little behind schedule.
+
+
+## SOMEDAY Add export/txt to the pad announcements next year - dto
+
+
+## TODO Learn from other conferences
+
+
+### Neovimconf
+
+
+### SOMEDAY Normconf: The Normcore Tech Conference
+
+<https://normconf.com/>
+
+
+## SOMEDAY Look into properly streaming to YouTube, Toobnix, and 480p
+
+
+## TODO Consider practising with ffmpeg in the cloud so that we can handle last-minute submissions
+
+<https://cloud.google.com/functions/docs/console-quickstart-1st-gen>
+<https://aws.amazon.com/marketplace/pp/prodview-ixe3igo3gsu24#pdp-pricing>
+or a VM
+
+
+### TODO <https://github.com/tuomastik/ffmpeg-google-cloud>
+
+<https://cloud.google.com/functions/docs/console-quickstart-1st-gen>
+
+
+### SOMEDAY Investigate bacalhau compute over data
+
+
+### SOMEDAY Using video transcoding on Amazon ECS - Amazon Elastic Container Service
+
+<https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-vt1.html>
+
+
+## SOMEDAY Add timer for 5 minute and 2 minute warnings to go to emacsconf-org
+
+
+## TODO make the Org agenda versions more visible
+
+
+## SOMEDAY Explore idea of OBS virtual webcam showing the question vs screenshare
+
+
+## SOMEDAY Ideas for people to reach out to for talks?
+
+
+### Using emacs mail to prefilter mail
+
+<https://www.reddit.com/r/emacs/comments/zp0qn6/a_tragic_story_of_emacs_lover/j0r7i1f/>
+
+
+## SOMEDAY Check ffmpeg benchmarks and recommendations; can we speed up our encoding for last-minute submissions?
+
+
+### SOMEDAY <https://www.reddit.com/r/AV1/comments/k7colv/encoder_tuning_part_1_tuning_libvpxvp9_be_more/?utm_source=share&utm_medium=android_app&utm_name=androidcss&utm_term=2&utm_content=share_button>
+
+
+## TODO <https://owncast.online/faq/>
+
+instead of Icecast? uses RTMP
+
+
+## STARTED Jingle
+
+[02:38] <dto> tweaked it <https://usercontent.irccloud-cdn.com/file/akHATPq3/emacsconf.ogg>
+
+
+<a id="decisions"></a>
+
+# Things to figure out / decisions to make
+
+- [Do we want to drop talks?](#drop)
+- [How do we want to coordinate during the conference itself?](#coordination)
+- [How do we want to make the full schedule more manageable?](#sched-decision)
+- [Do we want to skip the closed Q&A and go straight to open?](#closed)
+- [How much do we want to enrich the wiki with JS?](#wiki-design)
+- [How do we want to make better use of Etherpad?](#pad-decision)
+- [Can we nudge people to ask IRC questions in a way that will make it easier for us to follow them?](#irc-markers)
+- [Do we want people to advertise any openings with their companies or any work that they&rsquo;re looking for?](#advertising)
+- [Decision archive](#decision-archive)
+- [Think about what to do with schedule gaps due to cancelled talks](#schedule-gaps):thoughts:
+- [Split rms into two talks?](#rmstedsplit)
+
+
+<a id="drop"></a>
+
+## Do we want to drop talks?
+
+- **Keep the slot open, allow people to speak live**
+ - If they don&rsquo;t show up, continue with previous Q&A or have an open room
+
+
+<a id="coordination"></a>
+
+## How do we want to coordinate during the conference itself?
+
+- Considerations:
+ - Good to have something that the hosts and streamers can walk through step by step
+ - Do we want the check-in volunteer to also keep something
+ - Announcing and publishing are easier if the task states are updated
+
+- Mumble for walkie-talkie communications?
+ - Can we keep it off the stream more reliably, but still be able to choose to put it on the stream?
+ - We can keep it in the combined sink and then manually go to that
+ channel in our clients when we want to talk on stream
+ - Should we have a Gen channel and a Dev channel so that we can choose to speak into ?
+- Checklist
+ - Etherpad
+ - All the volunteers can access it easily
+ - Tasks can be updated through SSH commands
+ - conf.org
+ - Run Emacs commands directly from it
+ - A little trickier in terms of access
+
+
+<a id="sched-decision"></a>
+
+## How do we want to make the full schedule more manageable?
+
+Host role:
+
+- Give the speaker a heads-up before their Q&A session begins
+- If needed, read the questions from the pad to the speaker (Many speakers are comfortable reading the pad on their own.)
+- Give the speaker time warnings before the end of their Q&A session on the stream. Interested participants can continue
+
+Streamer role:
+
+- Switch between playing the prerec and joining the Q&A session
+- Adjust audio volume at the beginning of the Q&A session
+- (optional) Switch scene layouts to focus on different things
+
+Shifts will be Sat AM, Sat PM, Sun AM, or Sun PM per track. People can take multiple shifts.
+
+<https://emacsconf.org/2022/decisions/#schedule>
+
+- Figure out how hosting can be done in shifts
+ - Add notes in one place
+- Figure out how streaming can be done in shifts: OBS in the cloud?
+ - [Investigate streaming options, maybe OBS in the cloud](#streaming)
+- Figure out how publishing can be done in shifts
+ - Console Emacs in a VM with everything set up for publishing to the wiki
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-10-04 Tue]</span></span>
+
+- Added option H: general starts with general Org use cases and moves on to more niche things on day 2.
+ - compared to A, general audience will be more interested in Org use
+ cases than in Hyperbole, and then we can look at specific
+ techniques on day 2
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-10-04 Tue]</span></span>
+
+- Discussed option G with zaeph on #emacsconf-org. zaeph prefers
+ option A over option G because it gives people more choices -
+ they can hop from talk to talk.
+
+<span class="timestamp-wrapper"><span class="timestamp">[2022-10-03 Mon]</span></span>
+
+- Discussed with bandali and zaeph on #emacsconf-org
+- Decided on Option A with B, C, or F as fallbacks depending on volunteer roster
+- Better for the viewers and the volunteers
+
+
+<a id="closed"></a>
+
+## Do we want to skip the closed Q&A and go straight to open?
+
+- Closed: Less moderation needed in the beginning
+- Open: less coordination needed (since the host doesn&rsquo;t have to either tell me that it&rsquo;s okay to open it up or change the task status themselves), and people are generally good at meeting etiquette
+
+
+<a id="wiki-design"></a>
+
+## How much do we want to enrich the wiki with JS?
+
+Ideas to consider:
+
+- Toggling local time display on the schedule
+- Making organizers-notebook nicer to browse through (or maybe use organice?)
+- Improve the video player (resolution switching? chapter markers?) - <https://github.com/sampotts/plyr> for video?
+
+
+### SOMEDAY ?: Figure out JS and CSS niceties that will make organizers-notebook more enjoyable to browse through :css:js:
+
+- TODO/DONE/etc. keyword highlighting?
+- Collapsible sections?
+
+
+### SOMEDAY ?: Find a way to add JS libraries to the wiki but shield them from anon editing :js:
+
+gitolite should have some options to do this
+
+
+### SOMEDAY ?: Beautify video players :js:css:
+
+Might not be necessary.
+
+
+<a id="pad-decision"></a>
+
+## How do we want to make better use of Etherpad?
+
+Pain points:
+
+- Lots of scrolling for speakers
+- Takes some effort to move questions from IRC to the pad
+
+
+### How many pads do we want?
+
+- One pad for everything
+ - Scroll down, down, down
+ - Easy to set up at the beginning
+ - Inertia
+- One pad per set of talks (Saturday AM, Saturday PM, Sunday AM, Sunday PM)
+ - Less scrolling
+- One pad per talk, plus one meta pad
+ - Very little scrolling
+ - Can send people directly to the pad
+
+
+### Do we want to host our own?
+
+- Use etherpad.wikimedia.org
+ - Worked fine last year
+- Host our own
+ - Might be able to use API to append questions to it, if we want to get super fancy
+
+
+### Do we want to embed the pad as an iframe on the watch page? on talk pages?
+
+This guides people to use the pad for discussion/questions instead of IRC
+
+Options:
+
+- Current: None, just a link
+- Big pad on the watch page:
+- Individual pads:
+ - Watch page needs to be updated with current pad and link to previous pad
+ - Individual talk page can embed the iframe
+- Embed the IRC channel instead
+
+
+<a id="irc-markers"></a>
+
+## Can we nudge people to ask IRC questions in a way that will make it easier for us to follow them?
+
+Two tracks mean two IRC channels with lots of space for Q&A, so this may become less of an issue
+
+Pain points:
+
+- Q&A/discussions often overlap with the next talks
+- Sometimes questions don&rsquo;t get copied to the pad
+- Fast discussions can get overwhelming
+
+Ideas:
+
+- Announce pad link at the beginning of the talk and at the start of
+ live Q&A, encourage most people to ask questions there
+- Encourage people to start questions with Q:
+ - A little extra work, but not as much as including the slug
+ - Easier to pick out when people search
+ - Volunteers can restate questions easily if people forget the Q:
+- Encourage people to start questions with Q-slug: (ex: Q-news: question about Emacs News Highlights, Q-journalism: &#x2026;)
+ - Easier to pick out questions even with overlapping Q&A/talks
+- Use two or three IRC channels so that talks can rotate among channels
+ - Easier to pick out questions even with overlapping Q&A/talks
+ - Needs logging and more organizer attention
+- Maybe a volunteer can have an ERC command that copies a question into a buffer, or even into the Etherpad
+
+
+<a id="advertising"></a>
+
+## Do we want people to advertise any openings with their companies or any work that they&rsquo;re looking for?
+
+- Speakers on their page?
+- General audience on a wiki page somewhere?
+
+
+<a id="decision-archive"></a>
+
+## Decision archive
+
+
+### Where should volunteers e-mail?
+
+- **Default to emacsconf-org and offer emacsconf-org-private as an option**
+- emacsconf-org-private
+ - less public, e.g. if for whatever reason we might have to decline an offer of help
+ - Also, some people want to volunteer but do not want to be in the public’s eye.
+- emacsconf-org
+ - If you’re thinking about the enticement factor of having people
+ volunteer publicly, we’ll still have a well-furnished list of people
+ helping us run the conf somewhere on the wiki. [11:22]
+ - i would think if someone doesn&rsquo;t want to do it publicly, they could
+ opt to write to -org-private instead, but otherwise the defacto
+ should be public (-org)
+ - i just think most folks would want to do this publicly unless for
+ specific reasons, rather than the other way around
+
+
+### CANCELLED Do we want to do alt-stream the same way again this year?
+
+Superseded by decision to have multiple tracks
+
+- Alt stream joins the current session and then continues with it until the Q&A finishes; people join the BBB room if they want to ask questions
+ - Nice and convivial, Q&A still gets captured
+ - Inertia means most people get the main message
+- Multiple streams with more space between talks, people choose which stream they want to watch
+ - How other conferences do it
+ - Speakers can attend related talks more easily
+
+
+### DONE Shall we put a generic e-mail address for sending feedback, maybe with different mailtos?
+
+Pain points:
+
+- Many talk pages don&rsquo;t have public e-mail addresses, so it takes a
+ little extra work (or is sometimes impossible) for people to follow
+ up if they have questions
+
+Options:
+
+- Do nothing (current)
+- Add a mailto link to emacsconf-discuss that prepopulates the subject
+- Add a mailto link to emacsconf-org
+ - Wider discussion
+- **Add a mailto to emacsconf-org-private**
+ - Private feedback that can be forwarded to the speaker
+
+
+### DONE How many BBB rooms do we want to set up?
+
+- One per talk
+ - We can send speakers a direct link to their room and they can check into it themselves
+ - Needs a little more work when setting up rooms and when extracting videos
+ - Easier for the host to join
+ - Check-in person can just keep an ear open in that room
+- Five or so, rotating among them
+ - Check-in person directs the speaker to the next available room
+ - Worked fine last time
+
+
+### DONE How easy do we want to make it to join the BBB session?
+
+Considerations:
+
+- It&rsquo;s easier for the checkin person to deal with only the speaker
+- We may not want people to join the Q&A session at the beginning
+- We want to make it easy for people to join the Q&A session eventually
+
+Options:
+
+- PROBABLY EASIEST: Set it to anyone can join, but the meeting needs to be started by a
+ moderator. Start the meeting on the day of the talk. Announce the
+ BBB URL in the pad, IRC channel, and on the talk page when the host
+ is ready. Maybe add a rewrite rule when the host is ready.
+- Set an access code. Announce the access code when the host is ready.
+ - Access codes are annoying to copy and paste.
+ - Access codes might get accidentally unset or regenerated.
+- Set room so that moderators have to approve waiting users.
+ - Check-in has to watch out for waiting speaker.
+ - Host sets it to accept everyone who&rsquo;s waiting when the host is ready.
+ - Changing it to turn the option off doesn&rsquo;t seem to affect an
+ ongoing meeting, even though the web interface says you should be
+ able to change the setting any time.
+ - Waiting users don&rsquo;t make the user notification go ding.
+
+Change talk status to OPEN\_Q or UNSTREAMED\_Q, and change to TO\_ARCHIVE when done.
+M-x emacsconf-publish-bbb-redirect to update the redirect for a single talk
+M-x emacsconf-publish-bbb-redirect-all updates all the redirects
+
+
+#### DONE Add nginx redirect from emacsconf.org
+
+/ssh:front|sudo::/etc/nginx/sites-available/emacsconf.org
+
+
+### DONE How do we want to name the BBB rooms?
+
+Needs to be easy to:
+
+- share all the BBB rooms for a particular shift with the check-in volunteer
+- start the BBB rooms for the morning
+- match up the recordings with the talks afterwards
+- find the BBB room for a talk or speaker
+- remove all the BBB rooms for the year
+
+ec22-sat-am-dev Speaker Name (slugs)
+
+
+### SOMEDAY Do we want to make the ikiwiki web-editable?
+
+Pain points:
+
+- Speakers usually ended up going through us
+
+Options:
+
+- Web-editable:
+ - Speakers and general public will be able to edit it more easily
+- Git: (current)
+ - Haven&rsquo;t had a problem with spam
+ - Reduces merge conflict potential
+
+
+<a id="schedule-gaps"></a>
+
+## TODO Think about what to do with schedule gaps due to cancelled talks :thoughts:
+
+- if the previous Q&A is still going, we can stream that one
+- if there are no previous Q&As running, options:
+ - just leave it on the in-between slide: no extra effort required
+ - host a breakout room in [ec22-open](https://media.emacsconf.org/current/bbb-open.html): gives people someplaco to go, might lead to interesting conversatinos
+- big gaps: consider:
+ - substitute talk
+ - rearrange conference schedule
+ - just show the IRC
+ - replay talks from previous years
+
+
+### SOMEDAY Consider fillers covering conference stuff :thoughts:
+
+
+<a id="rmstedsplit"></a>
+
+## CANCELLED Split rms into two talks?
+
+- Split into a separate talk:
+ - Can more easily have intros
+ - Can post the transcript to the talk page
+- Same talk, stream files:
+ - Might as well learn how to do that anyway
+
+
+### DONE Figure out what to do about rms sequence
+
+Keep it at one talk, but figure out stream files thing
+
+
+<a id="roles"></a>
+
+# Roles needed
+
+Each role comprises different responsibilities. A person may have multiple roles. An organizer might take the lead for a role, but if you want to volunteer, speak up and they&rsquo;ll probably be glad to share the load.
+
+Some roles are also described on the <https://emacsconf.org/2022/volunteer> page. If you want to encourage people to volunteer to help, add a role description there.
+
+
+## During the proposal stage
+
+The roles below are related to the proposals in the early stages of the preparation.
+
+- Scheduler (SCHED: sachac)
+ - Process talks as they come and find the best place for them in the timeline
+ - Keep track of availability and thematic constraints and find solutions that accommodate most
+- Reviewer
+ - Review the proposals sent to emacsconf-submit before the speaker-notification deadline
+ - Raise flags if there are problems with a proposal (e.g. too much content for the short format)
+- Listener
+ - Receive emails from emacsconf-submit
+ - Ensure that candidates are sticking to the prescribed format (esp. the 10/20/40 duration rule)
+ - Respond to people&rsquo;s requests and suggestions, pulling in other people to help as needed
+- Publisher (PUB: sachac)
+ - Set up the wiki page
+- Infrastructure
+ - Figure out streaming options
+ - Set up file upload system that speakers will use
+ - Plan other systems that people will use
+
+
+## When speakers have submitted their pre-recorded videos
+
+- Copy to backstage as &#x2013;original.webm and &#x2013;main.webm using M-x emacsconf-upload-copy-from-json
+- Copy to res /data/emacsconf/2022
+- Start /data/emacsconf/2022/process-captions.py if it&rsquo;s not already running
+- Use ~zaeph/scripts/reencode.sh on the file as well
+
+- Video processor (zaeph)
+ - Standardize and compress uploaded videos
+- Caption lead (sachac)
+ - Prepare videos and starting captions for captioning volunteers
+- Captioner
+ - Edit automatically-generated captions to correct misrecognized words
+ - Nice to have: Break up the captions in better places so that subtitles are neither too long nor too short
+ - Perk: Get access to prerecorded videos
+- Quality checker
+ - Doublecheck videos for potential encoding issues or compression artifacts that get in the way of viewing
+ - Doublecheck captions
+- Tech checker
+ - Help speakers check that their system works well with BBB for live Q&A
+
+
+## During the conference
+
+- Streamer (STREAM)
+ - Download prerecorded videos
+ - Send the combined stream to Icecast for broadcasting
+- Director (DIR: corwin) - possibly same as streamer
+ - Switch scenes, manage audio volumes as needed
+ - Provide timekeeping information to host (especially go-live countdowns)
+- Host (HOST: zaeph)
+ - Introduce talks and speakers
+ - Read questions
+ - Give time warnings
+ - Thank speakers and transition to next talk
+- Timekeeper - possibly same as host
+ - Manage time based on all available information (prerecs durations, speakers not showing up, etc.)
+- Check in (CHECK)
+ - Notice speakers checking into IRC
+ - Get them into the correct room and help them doublecheck their audio and video quality
+ - Troubleshoot as needed
+ - Notify host about next room to join
+ - Follow up with speakers who haven&rsquo;t checked in yet
+ - Check on speakers periodically so that they&rsquo;re not waiting alone
+- Questions
+ - Copy questions from IRC and the pad to wherever the host and speaker are looking
+- Pad scribe
+ - Organize and format people&rsquo;s contributions
+ - Add notes about links, key points, questions, answers
+- Accessibility (ACCESS: dto)
+ - Describe visuals in #emacsconf-accessible
+ - Nice to have: echo the captions into #emacsconf-accessible
+- Quality checker
+ - Doublecheck stream quality and audio volume
+- Publisher (PUB: sachac)
+ - Announce talks in the IRC channels
+ - Nice to have: Update the wiki page with resources (video)
+ - Nice to have: Set resources to public as each talk is played (Toobnix, YouTube)
+ - Nice to have: Update the schedule to reflect changes throughout the day
+
+
+<a id="shifts"></a>
+
+### Shifts
+
+<a name="shifts"></a>
+
+AM: 9-12 PM EST, PM: 1-5 PM EST (plus a little extra for setup/transition)
+
+Saturday Dec 3
+
+<table id="org4d51b24">
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">&#xa0;</th>
+<th scope="col" class="org-left">Host</th>
+<th scope="col" class="org-left">Streamer</th>
+<th scope="col" class="org-left">Checkin</th>
+<th scope="col" class="org-left">IRC</th>
+<th scope="col" class="org-left">Pad</th>
+<th scope="col" class="org-left">Coord</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">Gen AM</td>
+<td class="org-left">zaeph</td>
+<td class="org-left">sachac</td>
+<td class="org-left">corwin</td>
+<td class="org-left">dto</td>
+<td class="org-left">publicvoit</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Gen PM</td>
+<td class="org-left">zaeph</td>
+<td class="org-left">sachac</td>
+<td class="org-left">FlowyCoder</td>
+<td class="org-left">bandali</td>
+<td class="org-left">publicvoit</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Dev AM</td>
+<td class="org-left">bandali</td>
+<td class="org-left">sachac</td>
+<td class="org-left">corwin</td>
+<td class="org-left">dto</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Dev PM</td>
+<td class="org-left">bandali</td>
+<td class="org-left">sachac</td>
+<td class="org-left">FlowyCoder</td>
+<td class="org-left">bandali</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">sachac</td>
+</tr>
+</tbody>
+</table>
+
+publicvoit - pad until 4pm on Sat, until 2pm on Sun
+
+Sunday Dec 4
+
+<table id="org9b01a39">
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">&#xa0;</th>
+<th scope="col" class="org-left">Host</th>
+<th scope="col" class="org-left">Streamer</th>
+<th scope="col" class="org-left">Checkin</th>
+<th scope="col" class="org-left">IRC</th>
+<th scope="col" class="org-left">Pad</th>
+<th scope="col" class="org-left">Coord</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">Gen AM</td>
+<td class="org-left">zaeph</td>
+<td class="org-left">sachac</td>
+<td class="org-left">corwin</td>
+<td class="org-left">dto</td>
+<td class="org-left">publicvoit</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Gen PM</td>
+<td class="org-left">zaeph</td>
+<td class="org-left">jman</td>
+<td class="org-left">FlowyCoder</td>
+<td class="org-left">bandali</td>
+<td class="org-left">publicvoit</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Dev AM</td>
+<td class="org-left">bandali</td>
+<td class="org-left">sachac</td>
+<td class="org-left">corwin</td>
+<td class="org-left">dto</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Dev PM</td>
+<td class="org-left">bandali</td>
+<td class="org-left">sachac</td>
+<td class="org-left">FlowyCoder</td>
+<td class="org-left">bandali</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">sachac</td>
+</tr>
+</tbody>
+</table>
+
+Backups:
+
+- dev host/streamer: bandali, sachac
+- gen host/streamer: zaeph, sachac
+- checkin, IRC, pad: sachac
+
+Interested in a shift? Please e-mail <mailto:emacsconf-org-private@gnu.org> and we&rsquo;ll help you figure out what you need to learn.
+
+ `(setq emacsconf-shifts
+ (list
+ ,@(apply #'append
+ (mapcar
+ (lambda (day)
+ (let ((headers (mapcar (lambda (field) (intern (concat ":" (downcase field))))
+ (cdr (car (cadr day))))))
+ (mapcar
+ (lambda (row)
+ (apply #'append
+ (list 'list :id
+ (when (string-match "^\\([^ ]+\\) \\(AM\\|PM\\)" (car row))
+ (format "%s-%s-%s"
+ (car day)
+ (downcase (match-string 2 (car row)))
+ (downcase (match-string 1 (car row)))))
+ :track
+ (if (string-match "^Gen" (car row)) "General" "Development")
+ :start
+ (format "%sT%s:00:00%s"
+ (elt day 2)
+ (if (string-match "AM" (car row)) "08" "13")
+ emacsconf-timezone-offset)
+ :end
+ (format "%sT%s:00:00%s"
+ (elt day 2)
+ (if (string-match "AM" (car row)) "12" "18")
+ emacsconf-timezone-offset))
+ (seq-map-indexed
+ (lambda (value index)
+ (unless (string= value "")
+ (list (elt headers index) value)))
+ (cdr row))))
+ (cdr (cadr day)))
+ ))
+ (list
+ (list "sat" sat "2022-12-03")
+ (list "sun" sun "2022-12-04"))))))
+
+
+## After the conference
+
+- Video processor
+ - Extract live segments into videos
+- Captioner
+ - Add more captions
+ - Summarize Q&A
+- Publisher
+ - Post more information
+
+
+<a id="infra"></a>
+
+# Infrastructure notes
+
+
+## Uh&#x2026; how should ikiwiki be set up?
+
+- remove the ikiwiki\_src clone from the ansible config
+
+<https://ikiwiki.info/rcs/git/>
+bare repo has a post-update hook that updates the src repo
+src repo is ~ikiwiki/emacsconf
+~git/repositories/pub/emacsconf-wiki.git/hooks/post-update runs ~git/repositories/pub/emacsconf-wiki.git/hooks/post-update.h00-ikiwiki-wrapper
+there is an anon mirror that&rsquo;s updated with sudo -u anon /home/anon/fetch-wiki
+the git wrapper is
+/home/ikiwiki/hooks/emacsconf
+
+~anon/emacsconf-wiki.git has origin git@git.emacsconf.org:pub/emacsconf-wiki (fetch)
+but git log does not have the new stuff
+Where is the new stuff?
+&#x2026; hah, maybe I forgot to push
+
+
+## Backstage
+
+
+### File suffixes, and what they correspond to
+
+Per categories, earlier suffixes come earlier in the process.
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">Suffix</th>
+<th scope="col" class="org-left">Description</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">VIDEO</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;original.EXT</td>
+<td class="org-left">File as submitted by speaker</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;reencoded.webm</td>
+<td class="org-left">Reencode via ffmpeg incantation</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;final.webm</td>
+<td class="org-left">Broadcast-ready reencode with normalized audio</td>
+</tr>
+</tbody>
+
+<tbody>
+<tr>
+<td class="org-left">AUDIO</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;original.EXT</td>
+<td class="org-left">Extracted audio track from speaker upload; used for speech-recognition</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;normalized.opus</td>
+<td class="org-left">Normalized audio track</td>
+</tr>
+</tbody>
+
+<tbody>
+<tr>
+<td class="org-left">SUBTITLES</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;?(incomplete-)transcript</td>
+<td class="org-left">Transcript provided by speaker</td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#x2013;main.EXT</td>
+<td class="org-left">Broadcast-ready reencode; different formats for different uses</td>
+</tr>
+</tbody>
+</table>
+
+
+<a id="other"></a>
+
+# Other tasks and processes
+
+- [Giving conf.org access to a new volunteer or fake user](#private-access)
+- [As prerecorded talks come in](#prerec-process)
+- [When a talk is captioned](#when-captioned)
+- [Other tasks before the conference](#before)
+- [During the conference](#during-conference)
+- [After the conference](#after-conference)
+
+
+<a id="private-access"></a>
+
+## Giving conf.org access to a new volunteer or fake user
+
+This can only be done by the admins of the gitolite instance (zaeph,
+or bandali as a backup). This is because the changes need to be made
+in the gitolite-admin repo that can only be accessed by admins. In a
+pinch, people with access to the \`orga\` user on front0 can manually
+add themselves to the list of admins and manually rebuild the
+instance.
+
+Regular process:
+
+- Get public key from volunteer,
+- Add key under `./key/dir/`,
+- Update permissions on `./conf/gitolite.conf`,
+- Push to origin.
+
+
+<a id="prerec-process"></a>
+
+## As prerecorded talks come in
+
+- Sacha: Parcel out captioning work to volunteers, help them get set up
+- Volunteers: Caption pre-recorded videos (usually starting from autogenerated ones for easier work)
+- Make sure all the links/resources mentioned are written down somewhere (web page and enriched captions for pasting into #emacsconf-accessible)
+
+
+### Compress the video
+
+Usage: `compress-video.sh original-file output-file`:
+
+(zaeph might tinker with this)
+
+ 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.
+
+2020 version used with parallel
+
+ Q=$1
+ WIDTH=1280
+ HEIGHT=720
+ AUDIO_RATE=48000
+ VIDEO_FILTER="scale=w=${WIDTH}:h=${HEIGHT}:force_original_aspect_ratio=1,pad=${WIDTH}:${HEIGHT}:(ow-iw)/2:(oh-ih)/2,fps=25,colorspace=all=bt709:iall=bt601-6-625:fast=1"
+ FILE=$2
+ SUFFIX=$Q
+ shift
+ shift
+ if [ ! -f $FILE ]; then
+ wget https://mirror.csclub.uwaterloo.ca/emacsconf/2020/$FILE
+ fi
+ ffmpeg -y -i "$FILE" -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -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 -an -threads 8 /dev/null &&
+ if [[ $FILE =~ "webm" ]]; then
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a copy "${FILE%.*}--compressed$SUFFIX.webm"
+ else
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a libvorbis "${FILE%.*}--compressed$SUFFIX.webm"
+ fi
+ rm $FILE
+
+2022 version used with parallel to compress low version
+
+ Q=$1
+ WIDTH=1280
+ HEIGHT=720
+ AUDIO_RATE=48000
+ VIDEO_FILTER="scale=w=${WIDTH}:h=${HEIGHT}:force_original_aspect_ratio=1,pad=${WIDTH}:${HEIGHT}:(ow-iw)/2:(oh-ih)/2,fps=25,colorspace=all=bt709:iall=bt601-6-625:fast=1"
+ FILE=$2
+ SUFFIX=$Q
+ shift
+ shift
+ ffmpeg -y -i "$FILE" -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -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 -an -threads 8 /dev/null &&
+ if [[ $FILE =~ "webm" ]]; then
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a copy "${FILE%.*}--compressed$SUFFIX.webm"
+ else
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a libvorbis "${FILE%.*}--compressed$SUFFIX.webm"
+ fi
+
+
+### sachac
+
+- download to local cache
+ ~/proj/emacsconf/private/sync-cache
+- upload to YouTube in case we can get autogenerated subtitles from there
+ <https://studio.youtube.com/channel/UCwuyodzTl_KdEKNuJmeo99A/videos/upload?filter=%5B%5D&sort=%7B%22columnType%22%3A%22date%22%2C%22sortOrder%22%3A%22DESCENDING%22%7D>
+- upload to res:~/2022/captions
+- caption.sh
+- sync-cache to copy the vtt
+- emacsconf-make-backstage-index
+- send confirmation e-mail
+
+
+### Confirmation e-mail
+
+
+#### DONE Make sure all submissions have been acknowledged
+
+- [X] sibi
+- [X] vidianos
+- [X] bhavin
+- [X] gopar
+- [X] bala
+- [X] andrea
+- [X] andrew
+- [X] zachary for asmblox (reception confirmed by zaeph, and no problem
+ with video)
+- [X] ramin (ack’d by zaeph)
+- [X] abin (meain, ack’d by zaeph)
+
+
+#### Acknowledge pre-rec submission
+
+ (defun emacsconf-mail-acknowledge-submission (talk &optional template)
+ (interactive (list (emacsconf-complete-talk-info)))
+ (save-window-excursion
+ (emacsconf-with-talk-heading (plist-get talk :slug)
+ (emacsconf-cache-video-data talk)
+ (when (string= (plist-get talk :status) "WAITING_FOR_PREREC")
+ (org-todo "TO_PROCESS"))))
+ (emacsconf-publish-backstage-index)
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "ack-prerec"))
+ (plist-get talk :email)
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :time (plist-get talk :time)
+ :title (plist-get talk :title)
+ :email (plist-get talk :email)
+ :minutes (plist-get talk :video-time)
+ :speakers-short (plist-get talk :speakers-short)
+ :url (concat emacsconf-base-url (plist-get talk :url))
+ :year emacsconf-year)))
+
+
+#### Template
+
+Hi, ${speakers-short}!
+
+Just a quick note to let you know that I&rsquo;ve downloaded your submission
+for &ldquo;${title}&rdquo;. We&rsquo;ve added your submission to the backstage area at
+${backstage} (username: ${backstage-user}, password:
+${backstage-password}), and we&rsquo;ll post the files on your talk page
+when the talk is public. A quick check shows that your video is about
+${minutes} minutes long (${time} minutes budgeted).
+
+We&rsquo;ll be working on captioning it over the next few weeks. We&rsquo;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 ${year}, and thank you for submitting the prerecorded video
+before the conference!
+
+Sacha Chua
+
+
+<a id="mastering"></a>
+
+### Mastering the prerec’s audio-track
+
+Mastering is the process of preparing an audio-track for a purpose. For
+us, the purpose is quite simple: maximize the intelligibility of the
+speaker and minimize the noise.
+
+We can get great results with Audacity for the vast majority of
+audio-tracks. Sometimes, however, some audio-tracks have intractable
+noise-profile that require the use of model-based denoising filters that
+can applied with ffmpeg.
+
+We’ll start with the average Audacity workflow, and we’ll move on to the
+model-based filters after.
+
+
+#### Audacity workflow
+
+When we process a prerec, we extract the audio of the original upload
+and add it to the backstage. You should be able to find it under the
+name &#x2013;original.$audio\_format or &#x2013;main.$audio\_format. If it’s not
+there, it’s easy to extract the audio from the original video, but
+we’d prefer if you warned core-organizers about it because it’s not
+normal.
+
+We’ve simplified the process down to these steps:
+
+1. Open the audio file in Audacity.
+
+ You might want to increase the size of the waveform by pulling on the
+ bottom of the bottom of the track.
+
+ [audacity-demo-noise-reduction.webm](https://media.emacsconf.org/misc/audacity-demo-noise-reduction.webm)
+
+2. Find a moment of quiet in the video, and select it.
+
+ We ask our speakers to include 5 seconds of quiet at the beginning or
+ end of their prerecs, but even if they don’t, it’s relatively.
+
+3. Effects → Noise Reduction → Get Noise Profile
+
+4. Select → All
+
+5. Effects → Noise Reduction → OK
+
+ You can select a spoken portion of the track before applying the
+ effect and preview it to test your settings. The default are usually
+ enough (Noise reduction (dB): 12, Sensitivity: 6.00, Frequency smoothing
+ (bands): 3).
+
+ [audacity-demo-noise-reduction.webm](https://media.emacsconf.org/misc/audacity-demo-noise-reduction.webm)
+
+6. Tools → Apply Macro → Alpha
+
+ Before you can apply the Alpha macro, you need to save its content to
+ disk and import it via Tools → Macro Manager → Import.
+
+ Reverb:Delay="20" DryGain="5" HfDamping="99" Reverberance="15" RoomSize="70" StereoWidth="25" ToneHigh="0" ToneLow="100" WetGain="-13" WetOnly="0"
+ Amplify:Ratio="1"
+ FilterCurve:f0="79.621641" f1="101.02321" FilterLength="8191" InterpolateLin="0" InterpolationMethod="B-spline" v0="5.9148936" v1="0.042552948"
+ Normalize:ApplyGain="1" PeakLevel="-3" RemoveDcOffset="1" StereoIndependent="1"
+ Compressor:AttackTime="0.1" NoiseFloor="-50" Normalize="1" Ratio="2" ReleaseTime="1" Threshold="-30" UsePeak="0"
+
+1. Export → Export Audio… → Opus Files (.opus format)
+
+ Use the following settings:
+
+ [audacity-export-settings.png](https://media.emacsconf.org/misc/audacity-export-settings.png)
+
+ > Bit Rate: 64 kbps
+ > VBR Mode: On
+ > Compression: 10
+ > Application: Audio
+ > Frame Duration: 20 ms
+ > Cutoff: Disabled
+
+
+#### Model-based denoising filter
+
+If you can’t manage to get a good result with Audacity, chances are it’s
+because there’s too much noise in the video, even after profile-based
+denoising. This usually happens when the noise-pattern of an
+audio-track evolves over the video, or if has an aperiodic quality. For
+those, we’re going to need a bigger boat.
+
+Model-based denoising means using an AI-generated model to remove the
+audio frequencies that are usually associated to noise and preserve
+those that aren’t. A different context (e.g. noisy room with statics,
+noisy room with people chatting, etc.) means a different model; for us,
+this means a model that minimizes background noise and maximizes clear
+voices (the speakers’).
+
+This is the model we’ve been using:
+
+[audio-denoiser-model-mp.rnnn](https://media.emacsconf.org/misc/audio-denoiser-model-mp.rnnn) (download link)
+
+Source: [rnnoise-models](https://github.com/GregorR/rnnoise-models), Model: [marathon-prescription](https://raw.githubusercontent.com/GregorR/rnnoise-models/master/marathon-prescription-2018-08-29/mp.rnnn)
+
+You should always apply the filter on the original’s audio, as opposed
+to an Audacity-processed audio. This is to ensure that we have the most
+information about the signal, which means we can have gather the most
+information about the noise-profile.
+
+Following is the ffmpeg incantation to use to apply the filter-model.
+Make sure to modify the `DENOISER` variable and adapt input/output.
+
+ DENOISER="/path/to/audio-denoiser-model-mp.rnnn"
+ input="original.opus"
+ output="denoised.opus"
+ ffmpeg -i "$input" -af "arnndn=m=$DENOISER" "$output"
+
+There’s no need to customize the libopus export information; the default
+is more than enough for human-speech.
+
+When you’re done with this step, you can then process the outputted
+audio-track with Audacity, skipping the denoising steps (1 to 5).
+
+
+#### Questions?
+
+If you’ve got any question on the process, you canget in touch with me (zaeph)!
+
+
+<a id="when-captioned"></a>
+
+## When a talk is captioned
+
+- Combine captions with talk
+- Upload captions to YT and Toobnix
+- Prepare captions for wiki inclusion
+
+
+<a id="before"></a>
+
+## Other tasks before the conference
+
+- Coordinate volunteer schedules so all the roles are covered
+
+
+### Test stream setup
+
+[Stream](#other-streams)
+
+
+<a id="mpv-captions"></a>
+
+### Set up MPV for captions
+
+mpv.conf profile tips are now at <https://emacsconf.org/mpv/> .
+
+
+#### Suggested font: Clear Sans
+
+Links:
+
+- tar.gz with all fonts: [from zaeph&rsquo;s server](https://zaeph.tk/files/emacsconf/captions/fonts.tar.gz) (more convenient)
+- WOFF from GitHub repo: [clear-sans/WOFF at main · intel/clear-sans](https://github.com/intel/clear-sans/tree/main/WOFF)
+
+
+### Download prerecorded videos from ${protected}
+
+- STREAM: Download prerecorded videos from ${protected}
+
+ rsync -avzue ssh front:/var/www/media.emacsconf.org/2021/protected/*--main.webm .
+
+
+<a id="during-conference"></a>
+
+## During the conference
+
+
+### Set up
+
+
+#### 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
+
+
+#### 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="other-streams"></a>
+
+##### Stream
+
+
+###### Low-res stream
+
+Needs the `$main480p` environment variable set to something of the form `icecast://username:password@site:port/mount-point.webm`. Icecast configuration can be found on `live0` at `/etc/icecast2/icecast.xml`. It was okay to run this command directly on `live0` in 2020, since that kept the speed at roughly 1x.
+
+ while true; do ffmpeg -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 $main480p done
+
+
+###### Youtube
+
+
+###### Toobnix
+
+
+###### DONE Add IRC links to YouTube and Toobnix descriptions
+
+
+### 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&rsquo;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&rsquo;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&rsquo;ll be
+ using for questions is at
+ <https://etherpad.wikimedia.org/p/emacsconf-2021> . We&rsquo;ll collect
+ questions from #emacsconf and put them there. If you&rsquo;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&rsquo;ll send you some private messages
+ with instructions, so please check there. Let me know if you don&rsquo;t
+ get them.
+ - Private messages:
+ - (erc-message &ldquo;PRIVMSG&rdquo; (format &ldquo;%s You can use this BBB room: %s . I&rsquo;ll join you there shortly to set up the room and do the last-minute tech check.&rdquo; nick room-url))
+ - (erc-message &ldquo;PRIVMSG&rdquo; (format &ldquo;%s The collaborative pad we&rsquo;ll be using for questions is at %s . We&rsquo;ll collect questions from #emacsconf and put them there. If you&rsquo;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.&rdquo; nick conf-collaborative-pad))
+ - (erc-message &ldquo;PRIVMSG&rdquo; (format &ldquo;%s Leo Vivier will join when it&rsquo;s time, and he will give you the go-ahead when it&rsquo;s time to present. See you in the BBB room!&rdquo; 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&rsquo;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&rsquo;s check-in steps
+
+- please leave webcam quality on &rsquo;medium&rsquo;
+- please read each audience question out loud before responding
+- please mute stream on your machine if you&rsquo;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
+
+- 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:
+ - [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.
+
+
+### 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&rsquo;s about a 1-2 minute delay.
+ Ex: `(kill-new (conf-dump-get "alt" "10:24" "10:30" "qa_"))`
+ - When there&rsquo;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
+
+
+#### DONE Automatically commit to the wiki
+
+when emacsconf-publish-autocommit-wiki is set
+
+(emacsconf-publish-update-talk (append (list :public t) (emacsconf-resolve-talk &ldquo;journalism&rdquo;)))
+(emacsconf-publish-update-talk (append (list :public nil) (emacsconf-resolve-talk &ldquo;journalism&rdquo;)))
+
+
+#### DONE Make sure VTTs only get published when they&rsquo;re edited
+
+
+##### publishing
+
+
+##### webm
+
+
+##### media directory
+
+
+#### DONE Fix mapconcat error in updating task status
+
+
+#### DONE Add intros to wiki pages
+
+
+#### SOMEDAY Cache video data - audio processed?
+
+
+#### DONE Cache video data - edited captions
+
+
+##### DONE Double-check that all the edited captions have the header
+
+ (mapcar (lambda (o)
+ (plist-get o :slug))
+ (seq-filter
+ (lambda (o) (and
+ (string= (plist-get o :status) "TO_STREAM")
+ (null (plist-get o :captions-edited))))
+ (emacsconf-get-talk-info)))
+
+
+#### DONE Automatically commit and push the wiki
+
+
+#### DONE Set publishing on a timer :sachac:
+
+
+##### DONE Single timer, batch timers for playing and closed q
+
+(emacsconf-stream-schedule-timers)
+
+
+##### DONE Take intro into account for scheduling q&a time
+
+
+##### TODO Test the timer
+
+ (let ((info (emacsconf-inflate-sexp '(journalism
+
+
+#### DONE Simplify manual setting of a timer to update task status :sachac:
+
+emacsconf-stream-schedule-talk-status-change
+
+
+#### DONE Rename update-task-status.sh to talk :sachac:
+
+
+#### DONE make sure captions are included on the wiki page
+
+
+#### DONE Set public based on time, expose more interactive functions :sachac:
+
+so that the wiki doesn&rsquo;t have to depend on synchronized conf.org state
+
+ (cl-assert
+ (plist-get
+ (emacsconf-add-talk-status (list :start-time (date-to-time "2022-01-01T12:00:00-0400")))
+ :public))
+ (cl-assert
+ (null
+ (plist-get
+ (emacsconf-add-talk-status (list :start-time (date-to-time "2030-01-01T12:00:00-0400")))
+ :public)))
+ (cl-assert
+ (plist-get
+ (emacsconf-add-talk-status (list :start-time (date-to-time "2030-01-01T12:00:00-0400")
+ :status "PLAYING"))
+ :public))
+
+
+#### TODO figure out if we need to adapt to org-time-stamp-formats change removing brackets
+
+
+### 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&rsquo;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&rsquo;s buffer time before the next talk, HOST can read out
+ questions and answers, or transition to the next talk early
+ - HOST: It&rsquo;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&rsquo;ll
+ forward the questions to the speaker and we&rsquo;ll post the speaker&rsquo;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)
+
+\*
+
+
+### During each talk
+
+- Volunteers: post links/resources/descriptions/captions (depending on your level of energy) to #emacsconf-accessible
+- Volunteers: making sure questions get posted somewhere the speaker can see them
+
+
+### 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
+
+
+### 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="after-conference"></a>
+
+## After the conference
+
+
+### Send thanks
+
+[Thank you, next steps](#thanks)
+
+
+### Extract the opening and closing remarks
+
+
+### Extract the Q&A recordings, trimming as needed
+
+From <https://bbb.emacsverse.org/b/admins/recordings>
+
+ console.log([...document.querySelectorAll('.email-link')].map((o) => '| ' + o.closest('tr').querySelector('time').getAttribute('datetime') + ' | ' + o.closest('tr').querySelector('#recording-text').innerHTML.trim() + ' | ' + o.getAttribute('data-pres-link').trim() + ' |').join('\n'))
+
+Make an `ids.txt` with the IDs extracted from BBB.
+
+In the same directory:
+
+ while read p; do
+ mkdir -p "$p";
+ cd "$p";
+ wget "https://bbb.emacsverse.org/presentation/${p}/slides_new.xml" \
+ "https://bbb.emacsverse.org/presentation/${p}/video/webcams.webm" \
+ "https://bbb.emacsverse.org/presentation/${p}/deskshare.xml" \
+ "https://bbb.emacsverse.org/presentation/${p}/deskshare/deskshare.webm" \
+ "https://bbb.emacsverse.org/presentation/${p}/metadata.xml"
+ cd ..;
+ done <ids.txt
+
+Resource explanation:
+
+- **slides\_new.xml:** Text chat
+- **webcams.webm:** Webcam as video stream, also has audio
+- **deskshare.xml:** start and stop time of desktop sharing, if any
+- **deskshare.webm:** Shared desktop as video
+- metadata.xml
+
+Probably focus on grabbing the audio first and seeing what&rsquo;s worth keeping
+
+ (defun emacsconf-extract-chat (slug speaker)
+ (interactive (list
+ (emacsconf-complete-talk)
+ (completing-read "Speaker: "
+ (seq-uniq
+ (mapcar (lambda (node) (dom-attr node 'name))
+ (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline)))
+ )))
+ (let ((text
+ (mapconcat (lambda (node)
+ (when (string= (dom-attr node 'target) "chat")
+ (let ((message
+ (replace-regexp-in-string
+ "\\(^[^ +]?\\): " ""
+ (replace-regexp-in-string "<a href=\"\\(.+?\\)\" rel=\"nofollow\"><u>\\(.+?\\)</u></a>"
+ "<\\1>" (dom-attr node 'message)))))
+ (if (string-match speaker (dom-attr node 'name))
+ (format "- %s: %s\n" speaker message)
+ (format "- %s\n" message)))))
+ (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline)
+ "")))
+ (emacsconf-edit-wiki-page slug)
+ (if (re-search-forward "# Discussion" nil t)
+ (progn
+ (goto-char (match-end 0))
+ (insert "\n\n"))
+ (goto-char (point-max)))
+ (kill-new text)))
+ ;; TODO: Combine lines from same nick, or identify speakers with anon1/2/etc.
+ (defun emacsconf-extract-chat-from-dired ()
+ (interactive)
+ (find-file (expand-file-name "slides_new.xml" (dired-get-file-for-visit)))
+ (call-interactively 'emacsconf-extract-chat))
+
+ (defun emacsconf-make-webcams-deskshare-spans (deskshare start-ms stop-ms strategy source-dir)
+ (let ((secs (/ start-ms 1000.0))
+ (webcam-video (expand-file-name "webcams.webm" source-dir))
+ (deskshare-video (expand-file-name "deskshare.webm" source-dir))
+ spans)
+ (mapc (lambda (o)
+ (unless (or (= secs (string-to-number (dom-attr o 'start_timestamp)))
+ (= (string-to-number (dom-attr o 'start_timestamp)) 0)
+ (> secs (/ stop-ms 1000.0)))
+ (setq spans (cons (list :source webcam-video
+ :start-ms (* secs 1000)
+ :stop-ms
+ (* 1000
+ (if (eq strategy 'test)
+ (+ secs 3)
+ (max secs (string-to-number (dom-attr o 'start_timestamp))))))
+ spans)))
+ (when (and (<= (string-to-number (dom-attr o 'start_timestamp))
+ (/ stop-ms 1000.0))
+ (>= (string-to-number (dom-attr o 'stop_timestamp))
+ (/ start-ms 1000.0)))
+ (setq spans (cons (list :source deskshare-video
+ :start-ms (max (* 1000 (string-to-number (dom-attr o 'start_timestamp)))
+ start-ms)
+ :stop-ms
+ (if (eq strategy 'test)
+ (* 1000 (+ (string-to-number (dom-attr o 'start_timestamp)) 3))
+ (min (* 1000 (string-to-number (dom-attr o 'stop_timestamp)))
+ stop-ms)))
+ spans))
+ (setq secs (string-to-number (dom-attr o 'stop_timestamp)))))
+ (dom-by-tag deskshare 'event))
+ (unless (>= (floor (* secs 1000)) stop-ms)
+ (setq spans (cons (list :source webcam-video
+ :start-ms (* 1000 secs)
+ :stop-ms (if (eq strategy 'test)
+ (* 1000 (+ secs 3))
+ stop-ms))
+ spans)))
+ (if (eq strategy 'test)
+ `((video ,@(reverse spans))
+ (audio ,@(mapcar (lambda (o)
+ (list :source webcam-video
+ :start-ms (plist-get o :start-ms)
+ :stop-ms (plist-get o :stop-ms)))
+ (reverse spans))))
+ `((video ,@(nreverse spans))
+ (audio (:source ,webcam-video :start-ms ,start-ms :stop-ms ,stop-ms))))))
+
+ (defun emacsconf-get-ffmpeg-to-splice-webcam-and-recording (slug start-ms stop-ms info &optional strategy)
+ "Return FFMPEG command for slicing.
+ Strategies:
+ - 'fast-cut-start-keyframe - find the keyframe before the start ms and cut from there, doing a fast copy.
+ - 'start-keyframe-and-reencode - find the keyframe before the start ms and cut from there, reencoding.
+ - 'cut-and-concat - seek to the keyframe before, slowly find the start-ms, reencode the snippet, and then do a fast copy of the remaining. May have encoding errors.
+ - default: copy from start-ms to stop-ms, reencoding.
+ "
+ (let* ((source-dir (expand-file-name (concat "../questions/by-slug/" slug) emacsconf-captions-directory))
+ (video-slug (plist-get (seq-find (lambda (o) (string= (plist-get o :slug) slug)) info) :video-slug))
+ (output (expand-file-name (concat video-slug "--answers.webm") emacsconf-captions-directory))
+ (webcam-video (expand-file-name "webcams.webm" source-dir)))
+ (if (file-exists-p (expand-file-name "deskshare.webm" source-dir))
+ ;; Has deskshare
+ (let* ((deskshare (xml-parse-file (expand-file-name "deskshare.xml" source-dir)))
+ (final-size (compile-media-max-dimensions
+ (expand-file-name "deskshare.webm" source-dir)
+ (expand-file-name "webcams.webm" source-dir)))
+ (duration (compile-media-get-file-duration-ms (expand-file-name "webcams.webm" source-dir)))
+ (spans (emacsconf-make-webcams-deskshare-spans deskshare start-ms stop-ms strategy source-dir))
+ (compile-media-output-video-width (car final-size))
+ (compile-media-output-video-height (cdr final-size)))
+ (compile-media-get-command spans output))
+ ;; Just webcams
+ (compile-media-get-command
+ (compile-media-split-tracks
+ (list (list :source webcam-video :start-ms start-ms :stop-ms stop-ms)))
+ output))))
+
+Make a table of the form
+
+<table id="orgf99a134">
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">Start</td>
+<td class="org-left">End</td>
+<td class="org-left">Slug</td>
+<td class="org-left">Notes</td>
+<td class="org-left">URL</td>
+<td class="org-left">Timestamp</td>
+</tr>
+</tbody>
+</table>
+
+ (defun emacsconf-process-qa-recordings (qa dir)
+ ;; (setq conf-qa-recordings qa)
+ ;; (memoize 'conf-ffmpeg-get-closest-keyframe-in-msecs)
+ ;; (memoize 'conf-ffmpeg-get-keyframes-between)
+ ;; (memoize 'conf-video-dimensions)
+ ;; (memoize 'compile-media-get-file-duration-ms)
+ ;; (memoize-restore 'conf-ffmpeg-get-keyframes-around)
+
+ (let ((info (emacsconf-get-talk-info)))
+ (replace-regexp-in-string
+ "captions/" "answers-slow/"
+ (replace-regexp-in-string
+ dir ""
+ (string-join
+ (nreverse
+ (sort
+ (delq nil
+ (mapcar
+ (lambda (o)
+ (when (> (length (car o)) 0)
+ (emacsconf-get-ffmpeg-to-splice-webcam-and-recording
+ (elt o 2)
+ (compile-media-timestamp-to-msecs (elt o 0))
+ (compile-media-timestamp-to-msecs (elt o 1))
+ info)))
+ ; (seq-take qa 2)
+ qa
+ ))
+ (lambda (a b) (string-match "trim" a))))
+ "\n")))))
+
+
+### Update the wiki
+
+
+### 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.
+
+
+### STARTED Update the chapter index for answers
+
+- emacsconf-subed-make-chapter-file-based-on-comments
+- emacsconf-publish-process-answers-chapters
+ - Put it in wiki/year/captions/ and add it to the repository
+ - Add it to the cache directory
+ - Upload it to media.emacsconf.org:~/year
+- Update the talk page
+- Remove the help marker from the talk page
+
+ <https://emacsconf.org/help_with_chapter_markers/>
+ <file:///home/sacha/proj/emacsconf/cache>
+
+
+### BLOCKED Downsize the server :bandali:
+
+
+<a id="exceptions"></a>
+
+# In case of
+
+See <https://pad.emacsconf.org/premortem> for more.
+
+- [Common broadcast (gen and dev)](#common):stream:
+- [Stream OBS needs to be restarted](#obs-restart):stream:
+- [Wiki](#ikiwiki-stuck):publish:
+- [Cancelled talk](#cancelled):schedule:
+- [Last-minute prerecording submission](#last-minute-prerec):upload:
+- [Technical issues during a live presentation](#live-issues):stream:
+- [Big technical issues with streaming](#stream-issues):stream:
+- [Last-minute caption or file update](#last-minute-captions):upload:
+- [Pad malfunction or mess-up](#pad-broken):infra:
+- [Speaker has not checked in](#missing):sched:
+- [Speaker does not have a prerec and has not checked in](#really-missing):sched:
+- [Conduct guidelines issue](#conduct):host:
+- [CHECK is unavailable](#check-gone)
+- [HOST is unavailable](#host-gone)
+- [live0 can&rsquo;t handle the load or is close to network transfer limit](#network)
+- [People have a hard time seeing dark-mode presentations (or light-mode)](#dark-mode)
+- [Schedule update](#update-sched):sched:
+- [New talk](#new-talk):sched:
+- [In case we need to do things manually because the task status hooks don&rsquo;t work](#manual)
+- [Alternate stream volunteer wants to stream](#alternate)
+- [Video playing error, need to play with mpv manually](#play-mpv-manually):stream:
+- [Shift changes](#orgd99c648)
+- [Need to restart 480p stream](#restart-480p):stream:
+- [Renamed talk](#renamed):sched:
+- [Need to restart the Toobnix streams so we don&rsquo;t exceed 5 hours](#orgc1b179b)
+
+
+<a id="common"></a>
+
+## Common broadcast (gen and dev) :stream:
+
+Options:
+
+- mpv <https://live.emacsconf.org/emacsconf/gen.webm>
+- mpv the same video
+- join the BBB room
+
+emacsconf-stream-rebroadcast - specify the source track
+
+[Development -> General]((emacsconf-stream-rebroadcast "Development" "General"))
+[General -> Development]((emacsconf-stream-rebroadcast "General" "Development"))
+
+
+<a id="obs-restart"></a>
+
+## Stream OBS needs to be restarted :stream:
+
+- ssh to the track and run `track-obs`
+- ssh to live0.emacsconf and run whatever&rsquo;s appropriate:
+
+ screen -S restream-test-toobnix -X quit; screen-restream-test-toobnix.sh
+ screen -S restream-test-youtube -X quit; screen-restream-test-youtube.sh
+ screen -S restream-gen-toobnix -X quit; screen-restream-gen-toobnix.sh
+ screen -S restream-gen-youtube -X quit; screen-restream-gen-youtube.sh
+ screen -S restream-dev-toobnix -X quit; screen-restream-dev-toobnix.sh
+ screen -S restream-dev-youtube -X quit; screen-restream-dev-youtube.sh
+- check if the streams are all right
+
+
+<a id="ikiwiki-stuck"></a>
+
+## Wiki :publish:
+
+Stuck:
+
+sudo -iu ikiwiki &#x2013; ikiwiki &#x2013;setup ~ikiwiki/emacsconf.setup
+
+emacsconf.setup changed:
+
+ssh orga@front0.emacsconf.org
+sudo su - ikiwiki
+ikiwiki &#x2013;setup emacsconf.setup &#x2013;rebuild &#x2013;wrappers
+
+
+<a id="cancelled"></a>
+
+## Cancelled talk :schedule:
+
+1. Update conf.org to mark the talk as cancelled.
+2. Update the `schedule-choices` block to fix the time for the following talk, or recalculate all the schedules. Check for any validation errors in the `:results:` block.
+3. When you&rsquo;re happy with the schedule, run the `draft-schedule` block.
+4. Update the talk page to add CANCELLED to the title.
+5. Publish the wiki and doublecheck it.
+ - Talk gone from the schedule?
+ - Talk listed among the cancelled talks?
+ - Talk page has cancelled info?
+6. Remove the talk from the [one-track emergency schedule](#one-track)
+
+
+<a id="last-minute-prerec"></a>
+
+## Last-minute prerecording submission :upload:
+
+- COORD will copy it from the FTP upload server to orga@res.emacsconf.org:~/stream -p 46668 and name it appropriately.
+- COORD will notify STREAM with the scp command and the mpv command so that STREAM can choose.
+
+
+<a id="live-issues"></a>
+
+## Technical issues during a live presentation :stream:
+
+- 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&rsquo;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 :stream:
+
+<file://ssh:orga@front0.emacsconf.org:/var/www/status.emacsconf.org/index.html>
+
+- HOST notifies #emacsconf and #emacsconf-org and adds a note at the top of the ${pad}.
+- HOST updates the 2022.md wiki page
+- CHECK publishes prerecordings
+ - media.emacsconf.org
+ - wiki
+ - Toobnix
+ - Peertube
+- STREAM e-mails the mailing list
+
+
+<a id="last-minute-captions"></a>
+
+## Last-minute caption or file update :upload:
+
+- CHECK uploads the &#x2013;main.vtt file to orga@res.emacsconf.org:~/stream -p 46668
+- If streaming locally, STREAM copies the VTT file and loads it into MPV with `--sub-file`
+
+ssh orga@media.emacsconf.org
+cd backstage; make all
+
+ssh orga@res.emacsconf.org -p 46668
+~/cache/update-cache
+cd ~/stream
+cp ~/cache/\*$SLUG\*&#x2013;main.webm .
+
+
+<a id="pad-broken"></a>
+
+## Pad malfunction or mess-up :infra:
+
+- PAD resets the pad using the time slider
+- [? still not recovered]
+ - PAD reimports the pad from backup
+
+
+<a id="missing"></a>
+
+## Speaker has not checked in :sched:
+
+- 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&rsquo;ll collect your questions on the pad and send them afterwards.
+ - Show the questions and discussion, invite people into the Q&A to talk about the talk. They can share their experiences and comments.
+
+
+<a id="really-missing"></a>
+
+## Speaker does not have a prerec and has not checked in :sched:
+
+- Let the previous talk do extended Q&A
+- 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&rsquo;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="conduct"></a>
+
+## Conduct guidelines issue :host:
+
+- [? IRC]: IRC operator addresses it with a reminder and/or a kick or a ban
+- [? not resolved, or onscreen]
+ - 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
+
+- COORD or STREAM does check-ins
+- HOST refers to the shift pad for Q&A preference etc.
+- STREAM checks ~/stream for prerec filenames etc.
+- Dropped goals:
+ - Publishing recordings ASAP
+ - Updating schedule/wiki on the fly
+
+
+<a id="host-gone"></a>
+
+## HOST is unavailable
+
+- STREAM will do the hosting.
+
+
+<a id="network"></a>
+
+## live0 can&rsquo;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
+ - 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="dark-mode"></a>
+
+## People have a hard time seeing dark-mode presentations (or light-mode)
+
+mpv &#x2013;vf=negate $url
+
+
+<a id="update-sched"></a>
+
+## Schedule update :sched:
+
+- Test the new schedule using the blocks near the beginning of conf.org
+- emacsconf-publish-update-schedule
+- E-mail affected speakers - see emacsconf-mail-schedule-update function
+
+
+<a id="new-talk"></a>
+
+## New talk :sched:
+
+- Create entry in conf.org
+- Fit it into the schedule using the emacsconf-schedule-plan variable
+- When happy, execute the draft-schedule block to update the SCHEDULED properties
+- emacsconf-generate-talk-page
+- emacsconf-update-schedule
+- emacsconf
+- emacsconf-stream-generate-assets-for-talk
+
+
+<a id="manual"></a>
+
+## In case we need to do things manually because the task status hooks don&rsquo;t work
+
+export SLUG=the ID of the talk
+
+- [TO\_STREAM -> PLAYING](#orgffa54ff):stream:
+- [CLOSED\_Q -> OPEN\_Q](#open)
+- [OPEN\_Q -> TO\_ARCHIVE](#archive)
+
+
+<a id="orgffa54ff"></a>
+
+### TO\_STREAM -> PLAYING :stream:
+
+play slug (ex: play journalism)
+
+
+<a id="open"></a>
+
+### CLOSED\_Q -> OPEN\_Q
+
+Example for mail talk:
+
+STATE=open; ssh orga@media.emacsconf.org &ldquo;cp *home/orga/backstage/assets/redirects/$STATE/bbb-$SLUG.html /home/orga/2022/current*&rdquo;
+
+
+<a id="archive"></a>
+
+### OPEN\_Q -> TO\_ARCHIVE
+
+Example for mail talk:
+
+STATE=after; ssh orga@media.emacsconf.org &ldquo;cp *home/orga/backstage/assets/redirects/$STATE/bbb-$SLUG.html /home/orga/2022/current*&rdquo;
+
+If you need to reset the state:
+
+STATE=before; ssh orga@media.emacsconf.org &ldquo;cp *home/orga/backstage/assets/redirects/$STATE/bbb-$SLUG.html /home/orga/2022/current*&rdquo;
+
+
+<a id="alternate"></a>
+
+## Alternate stream volunteer wants to stream
+
+- 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&rsquo;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&rsquo;t have it already.
+ 3. Start the following command (<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] (look for “Set up sinks for sound” under 2021/)
+ - [? 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="play-mpv-manually"></a>
+
+## Video playing error, need to play with mpv manually :stream:
+
+You can skip the intro and play a video by specifying the filename, like this:
+play ~/stream/emacsconf-2022-journalism-\*
+
+
+<a id="orgd99c648"></a>
+
+## Shift changes
+
+1. Update [Shifts](#shifts)
+2. Evaluate the code underneath to get the setq.
+3. Put the setq in emacsconf.el.
+4. Regenerate the hyperlists: emacsconf-pad-prepopulate-hyperlists
+
+
+<a id="restart-480p"></a>
+
+## Need to restart 480p stream :stream:
+
+ssh live
+
+/usr/local/bin/emacsconf-lowres-dev-on-connect
+or
+/usr/local/bin/emacsconf-lowres-gen-on-connect
+
+
+<a id="renamed"></a>
+
+## Renamed talk :sched:
+
+1. Change conf.org heading.
+2. Change the video slug property.
+3. Rename any existing files in the backstage area.
+4. emacsconf-publish-backstage-index
+5. Change the title and heading on the wiki page.
+6. Update the schedule (emacsconf-publish-schedule).
+7. Update info pages (emacsconf-publish-info-pages).
+8. Update the watch page (emacsconf-publish-watch-pages).
+9. Update the pad, and the two previous pads.
+10. Update the in-between slide (and for the following one) and upload the assets.
+11. Redo the intros for that talk and the following one
+ SLUG=health; ffmpeg -y -loop 1 -i ../../in-between/$SLUG.png -i $SLUG.opus -i $SLUG.vtt -shortest ../$SLUG.webm; mpv $SLUG.webm
+
+
+### DONE Rename lspbridge
+
+rerecord lspbridge intro
+
+lspbridge science
+
+
+### DONE Rename health
+
+health eev
+
+
+<a id="orgc1b179b"></a>
+
+## TODO Need to restart the Toobnix streams so we don&rsquo;t exceed 5 hours
+
+screen -S restream-gen-toobnix -X quit; screen-restream-gen-toobnix.sh
+screen -S restream-dev-toobnix -X quit; screen-restream-dev-toobnix.sh
+
+
+<a id="archive"></a>
+
+# Task archive
+
+
+## DONE Write preparation instructions :zaeph:
+
+2021/prepare.md can be reused.
+
+Extra stuff to consider adding:
+
+- DONE Suggestions for themes (especially wrt colourscape)
+- DONE “Please don’t squeeze your talk by fast-forwarding your speech. Trimming silences and filler words can help, though. Sometimes it&rsquo;s easier to write, record, and edit your voiceover, and then record the video to go along with it.&ldquo;
+- DONE Allowing speakers to plant questions, esp. to cover tangential stuff that couldn’t fit in the prerec
+
+
+## CANCELLED Allocate extra time if possible; send e-mail :sachac:
+
+
+## DONE Review metadata for speakers in conf.org :zaeph:
+
+See the bottom of conf.org for some automated validation
+
+
+## DONE Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible [early speaker notification](#acceptance), Oct 7 for everything :organizers:
+
+- zaeph: will start reviewing on Sep 21
+
+
+## DONE Write preparation instructions :zaeph:
+
+2021/prepare.md can be reused.
+
+Extra stuff to consider adding:
+
+- DONE Suggestions for themes (especially wrt colourscape)
+- DONE “Please don’t squeeze your talk by fast-forwarding your speech. Trimming silences and filler words can help, though. Sometimes it&rsquo;s easier to write, record, and edit your voiceover, and then record the video to go along with it.&ldquo;
+- DONE Allowing speakers to plant questions, esp. to cover tangential stuff that couldn’t fit in the prerec
+
+
+## DONE Add more submissions (CFP deadline Sept 30) :sachac:
+
+- Sacha: Add submissions to emacsconf-2022-private, draft 2-day schedule by Oct 10
+
+
+## DONE Publish talk pages :sachac:
+
+
+## DONE Send early acceptances :sachac:
+
+Ideal sequence:
+
+1. publish /2022/prepare (zaeph)
+2. publish wiki pages
+3. send acceptance e-mails
+ - Allocate at most 20 minutes, say we&rsquo;ll try to add more time depending on the schedule (probably know by Sept 30 or Oct 1)
+ - Include review comments
+4. Send an additional e-mail introducing speakers who may want to coordinate
+
+
+## DONE Prepare to export talk information to wiki :sachac:
+
+Tested code in a fork, can publish talk information once talks are approved.
+emacsconf-publish.el
+emacsconf-generate-info-pages
+emacsconf-generate-main-schedule
+emacsconf-generate-talk-pages
+
+
+## DONE Give access to emacsconf-2022-private to dto :zaeph:
+
+
+## DONE Write better subtitle documentation :sachac:
+
+<https://wiki.debian.org/Teams/DebConf/Video/Subtitles>
+<https://emacsconf.org/captioning>
+That will help more people subtitle things
+
+
+## DONE Write volunteer page :sachac:
+
+<https://emacsconf.org/2022/volunteer>
+
+
+## DONE Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible [early speaker notification](#acceptance), Oct 7 for everything :organizers:
+
+- zaeph: will start reviewing on Sep 21
+
+
+## DONE Double-check sachac’s timezone conversions for availability :zaeph:
+
+zaeph helped with this, even catching some based on e-mail timestamps
+
+
+## DONE Copy things over from previous notebooks :sachac:
+
+
+## DONE Prepare to publish schedule :sachac:wiki:
+
+- Should be understandable as plain text
+- Ideally responsive to take advantage of more screen space on monitors while still being understandable on mobile
+- Organize by tracks and then days
+- Links to jump to a track and day
+- Graphics to make it easier for people to see nearby talk options
+- Optionally, graphical view on talk pages as well (might need to publish a JSON somewhere to front)
+
+ Schedule inspiration:
+
+ - [DebConf 2022](https://debconf22.debconf.org/schedule/) converted times to your local timezone
+ - [LibrePlanet 2022](https://libreplanet.org/2022/program/) used table columns for the different tracks
+ - [SFSCON 2022](https://www.sfscon.it/programs/2022/) lists sessions chronologically, indicating tracks with labels and dots on a diagram. Dropdowns act as filters.
+ - <https://css-tricks.com/building-a-conference-schedule-with-css-grid/>
+
+- With JS and grid CSS: <https://imgur.com/KNpGayp>
+- Fallback <https://imgur.com/HT9vX3o>
+
+Draft: <https://emacsconf.org/2022/draft-schedule/>
+
+
+### DONE Set up main schedule as plain text
+
+general track
+day 1 and day 2
+
+dev track
+day 1 and day 2
+
+by day
+all talks
+
+
+### DONE Set up talk page navigation
+
+- program phase: by track
+- schedule phase: chronological
+
+
+### CANCELLED See if I can get the schedule to split into a nice grid on larger devices that support it
+
+Slightly annoying to do with JS/CSS because I want it to fall back to an interleaved schedule on small screens, so we would probably need to duplicate the elements and then use media queries.
+
+
+### SOMEDAY Add caption icon to schedule :emacsconf:
+
+so that it&rsquo;s easier for people to see which talks are accessible
+
+
+### DONE Add captioned label in talk index
+
+
+### TODO Display breaks and lunch in the schedule
+
+
+## DONE Process confirmations as we receive them :sachac:zaeph:
+
+- Reply to the speaker and Cc -submit to confirm the confirmation. Something like &ldquo;Confirming your confirmation, no reply needed to this one. Thank you!&rdquo;
+- Update talk to WAITING\_FOR\_PREREC in conf.org
+- Add a note in the logbook (C-c C-z - org-add-note) for the talk entry
+- Add :PUBLIC\_EMAIL: t if given permission to use the e-mail on the
+ talk page, or set it to an alternative e-mail if provided.
+- Update the public wiki&rsquo;s ${year}/talks/{$slug}.md page to add the
+ e-mail address as <mailto:person@example.com> on the speaker
+ information line.
+- At some point, use `M-x emacsconf-generate-talk-pages` to update the e-mail address used in the footer.
+
+ (let (waiting)
+ (save-window-excursion
+ (with-current-buffer (find-file emacsconf-org-file)
+ (org-map-entries (lambda () (add-to-list 'waiting
+ (list (org-entry-get (point) "SLUG")
+ (org-entry-get (point) "ITEM")))) "TODO=\"TO_CONFIRM\"")))
+ waiting)
+
+
+## CANCELLED Create Org heading for scheduling caption team&rsquo;s live IRC duty shifts :dto:
+
+See [Shifts](#shifts)
+
+
+## DONE Sacha: Organize volunteer information :sachac:
+
+
+## DONE Once talks are approved
+
+- sacha: Publish initial talk information pages
+- Double-check talk pages, format them nicely
+- Publish draft schedule
+- Confirm e-mail communication with all of the speakers
+
+Process for accepting a talk:
+
+- Create subtree for talk and populate it with properties.
+ - Required: CUSTOM\_ID SLUG NAME NAME\_SHORT EMAIL AVAILABILITY Q\_AND\_A TRACK MAX\_TIME
+ - Optional: PRONOUNS PRONUNCIATION IRC PUBLIC\_EMAIL MIN\_TIME EMERGENCY
+ - Can be validated with `emacsconf-validate-talk-subtree`
+ - Add a talk abstract subtree
+- Add it to emacsconf-schedule-plan and fiddle with it until the flow looks good
+- Execute the draft-schedule block to update the schedule in the Org file
+- Add the talk page to the wiki with `emacsconf-add-talk-page`.
+- Stage, commit, and push the wiki files. Make sure to add the talk page and the info pages.
+- Doublecheck the wiki page on the web, since the e-mail refers to it.
+- E-mail the speaker the acceptance by using `emacsconf-draft-acceptance-for-email-group` from `organizers-notebook/`.
+- Log the acceptance using `C-c C-z` in the talk subtree in `conf.org`, noting the number of minutes.
+- Change the status to TO\_CONFIRM.
+
+
+## DONE Remind people about confirming e-mail communications :sachac:email:speakers:
+
+Look for the TO\_CONFIRM status in conf.org, probably include in schedule e-mail
+
+
+## DONE Send people schedule information and doublecheck their availability/Q&A preference :sachac:email:speakers:sched:
+
+ (defun emacsconf-mail-schedule (group &optional template)
+ "Send draft schedule.
+ GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (require 'emacsconf-ical)
+ (let ((reply-by-date (date-to-time "2022-10-14"))
+ (draft-schedule (concat emacsconf-base-url emacsconf-year "/draft-schedule/")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "check-sched"))
+ (car group)
+ (list
+ :titles
+ (mapconcat (lambda (o) (format "%s: %s"
+ (plist-get o :slug)
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ emacsconf-timezone)))
+ (cdr group) "; ")
+ :draft-schedule
+ draft-schedule
+ :speakers-short
+ (plist-get (cadr group) :speakers-short)
+ :plural
+ (if (= (length (cdr group)) 1) "" "s")
+ :email
+ (plist-get (cadr group) :email)
+ :year
+ (or (plist-get (cadr group) :year) emacsconf-year)
+ :coordination-note
+ (if (seq-find (lambda (o) (member (plist-get o :slug) '("journalism" "rolodex" "orgsuperlinks" "buttons" "hyperorg" "science")))
+ (cdr group))
+ "I've changed the order slightly from the coordination e-mail I sent you. The sequence is now journalism - science - rolodex - orgsuperlinks - buttons - hyperorg. science is now second instead of last, and the first two talks are on Sat while the last four are on Sun. That probably means you don't have to coordinate as much, but you can still do so if you would like to build on other people's talks."
+ "")
+ :schedule
+ (mapconcat
+ (lambda (o) (format "* TODO Check time for \"%s\" (%s) :emacsconf:\nDEADLINE: %s\n(Not a hard deadline, just encouragement to e-mail us before that date if you can)\nPlease e-mail [[mailto:emacsconf-submit@gnu.org]] if you need it changed\n%s track\n%s\nIn context: %s"
+ (plist-get o :title)
+ (plist-get o :slug)
+ (format-time-string (car org-time-stamp-formats) reply-by-date emacsconf-timezone)
+ (plist-get o :track)
+ (string-join
+ (let ((emacsconf-timezones
+ (if (plist-get o :timezone)
+ (seq-uniq (append (list emacsconf-timezone)
+ (split-string (plist-get o :timezone) " ")
+ (list "UTC")))
+ emacsconf-timezones)))
+ (emacsconf-timezone-strings o))
+ "\n")
+ draft-schedule))
+ (cdr group)
+ "\n----------------------------------------------------------------\n")
+ :reply-by
+ (format-time-string "%b %-e (%a)" reply-by-date emacsconf-timezone)
+ :timezone-note
+ (if (plist-get (cadr group) :timezone)
+ (format "I've included timezone conversion to %s. Let me know if you'd like me to use a different timezone in future e-mails."
+ (plist-get (cadr group) :timezone) " ")
+ "I can translate times into your local timezone. Let me know what timezone you'd like me to use.")
+ :availability-note
+ (cond
+ ((seq-find (lambda (o) (string-match "yes" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you've indicated that you're available during the conference."))
+ ((seq-find (lambda (o) (string-match "not indicated" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you didn't indicate any particular availability constraints in your submission."))
+ (t (format "I think it respects your indicated availability, which we've noted as %s."
+ (string-join
+ (seq-uniq
+ (mapcar
+ (lambda (o) (format "\"%s\"" (plist-get o :availability)))
+ (cdr group)))
+ " and "))))))))
+
+ (defun emacsconf-mail-schedule-update (group &optional template)
+ "Send draft schedule update.
+ GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (require 'emacsconf-ical)
+ (let ((reply-by-date (date-to-time "2022-10-14"))
+ (draft-schedule (concat emacsconf-base-url emacsconf-year "/draft-schedule/")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "check-sched"))
+ (car group)
+ (list
+ :titles
+ (mapconcat (lambda (o) (format "%s: %s"
+ (plist-get o :slug)
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ emacsconf-timezone)))
+ (cdr group) "; ")
+ :draft-schedule
+ draft-schedule
+ :speakers-short
+ (plist-get (cadr group) :speakers-short)
+ :plural
+ (if (= (length (cdr group)) 1) "" "s")
+ :email
+ (plist-get (cadr group) :email)
+ :year
+ (or (plist-get (cadr group) :year) emacsconf-year)
+ :coordination-note
+ (if (seq-find (lambda (o) (member (plist-get o :slug) '("journalism" "rolodex" "orgsuperlinks" "buttons" "hyperorg" "science")))
+ (cdr group))
+ "I've changed the order slightly from the coordination e-mail I sent you. The sequence is now journalism - science - rolodex - orgsuperlinks - buttons - hyperorg. science is now second instead of last, and the first two talks are on Sat while the last four are on Sun. That probably means you don't have to coordinate as much, but you can still do so if you would like to build on other people's talks."
+ "")
+ :schedule
+ (mapconcat
+ (lambda (o) (format "\"%s\" (%s)\n%s track\n%s\nIn context: %s"
+ (plist-get o :title)
+ (plist-get o :slug)
+ (plist-get o :track)
+ (replace-regexp-in-string
+ "^\\(.*\\)\n\\(.*\\)"
+ "\\1\nIn other timezones:\n\\2"
+ (string-join
+ (let ((emacsconf-timezones
+ (if (plist-get o :timezone)
+ (seq-uniq (append (list emacsconf-timezone)
+ (split-string (plist-get o :timezone) " ")
+ (list "UTC")))
+ emacsconf-timezones)))
+ (emacsconf-timezone-strings o))
+ "\n"))
+ draft-schedule))
+ (cdr group)
+ "\n----------------------------------------------------------------\n")
+ :reply-by
+ (format-time-string "%b %-e (%a)" reply-by-date emacsconf-timezone)
+ :timezone-note
+ (if (plist-get (cadr group) :timezone)
+ (format "I've included timezone conversion to %s. Let me know if you'd like me to use a different timezone in future e-mails."
+ (plist-get (cadr group) :timezone))
+ "I can translate times into your local timezone. Let me know what timezone you'd like me to use.")
+ :availability-note
+ (cond
+ ((seq-find (lambda (o) (string-match "yes" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you've indicated that you're available during the conference."))
+ ((seq-find (lambda (o) (string-match "not indicated" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you didn't indicate any particular availability constraints in your submission."))
+ (t (format "I think it respects your indicated availability, which we've noted as %s."
+ (string-join
+ (seq-uniq
+ (mapcar
+ (lambda (o) (format "\"%s\"" (plist-get o :availability)))
+ (cdr group)))
+ " and "))))))))
+
+
+### Template
+
+Hi, ${speakers-short}!
+
+Here&rsquo;s the tentative schedule for when your EmacsConf talk${plural}
+will be streamed. Your talk${plural} will be streamed once, but I&rsquo;ve
+included a few timezone conversions for convenience.
+
+---
+
+${schedule}
+
+---
+
+${availability-note} You&rsquo;ll also have time for Q&A afterwards, which
+can be as short or as long as you like. We&rsquo;ll send you more
+information about how the Q&A will work as the conference gets closer.
+
+If you&rsquo;d like to see the other talks for context, you can check out
+the draft schedule at <https://emacsconf.org/${year}/draft-schedule/> .
+The times may move around a bit as we update the schedule, so I&rsquo;ll
+check in with you if things change a lot. ${coordination-note}
+
+We&rsquo;d like to publish the schedule this month, so we&rsquo;d love to hear
+from you by **${reply-by}** if the times don&rsquo;t work for you. (We can
+shuffle things around even after that date if something comes up.)
+Also, if you think your talk${plural} would go better next to a
+different talk, please let us know. ${timezone-note} Please keep
+emacsconf-submit@gnu.org in To or Cc when replying. Thanks!
+
+Sacha
+
+
+### Schedule change affecting dev
+
+(Please ignore the previous update, I included the wrong times in the
+e-mail. The web version&rsquo;s been fine, though! Sorry about the extra
+e-mails.)
+
+I tweaked the schedule to put treesitter and lspbridge earlier, so
+asmblox and wayland are a little later on Saturday morning. If you&rsquo;d
+like to see the latest schedule for your talk, you can go to
+<https://emacsconf.org/${year}/draft-schedule/> . Thanks for your
+patience!
+
+---
+
+${schedule}
+
+---
+
+(no need to reply to this to confirm, unless I broke the schedule for
+you and you want me to fix it)
+
+Sacha
+
+
+### Schedule change for buddy/meetup
+
+Hi ${speakers-short}!
+
+I tweaked the schedule to allocate a little more time for the meetups
+talk, and I moved the buddy talk earlier to make space. I think this
+might improve the flow as well, since the meetups will refer to how
+meeting up with a buddy is a good way to get a public Emacs meetup off
+the ground. If you&rsquo;d like to see the latest schedule for your talk,
+you can go to <https://emacsconf.org/${year}/talks/> . Thanks for your
+patience!
+
+---
+
+${schedule}
+
+---
+
+(no need to reply to this to confirm, unless I broke the schedule for
+you and you want me to fix it)
+
+Sacha
+
+
+## DONE Volunteer communications: E-mail update for Oct 9, 2022 :email:volunteers:
+
+Add your news and requests to this.
+
+
+### Template so far
+
+Hello, EmacsConf volunteers!
+
+We&rsquo;re starting to gear up for EmacsConf 2022, and we would love to
+figure out how to work with your skills, interests, and availability.
+<https://emacsconf.org/2022/volunteer/> has some specific task ideas and
+general roles.
+
+<https://emacsconf.org/2022/organizers-notebook/#overall> has an
+overall prioritization matrix. If any of those options look like
+something you want to learn or help with, or if you want to make
+things even better than what&rsquo;s in the table, let me know.
+
+Given the number of talks this year, we&rsquo;re going to try to see if we
+can pull off two tracks. I&rsquo;ve posted a draft schedule at
+<https://emacsconf.org/2022/draft-schedule/> and have e-mailed speakers
+to confirm their availability. This schedule staggers live Q&A
+sessions so that the person managing the streams can jump back and
+forth as needed. We&rsquo;ll figure out shifts once we&rsquo;ve sorted out the
+processes and training info, but if you want to call dibs on
+something, feel free.
+<https://emacsconf.org/2022/organizers-notebook/#shifts>
+
+Please let me know what kinds of things you&rsquo;d like to learn more about
+or help out with!
+
+Sacha Chua
+
+(You&rsquo;re receiving this e-mail because you&rsquo;re on the emacsconf-org
+mailing list. Thanks for wanting to help out!)
+
+
+## DONE Delete all the EmacsConf BBB rooms from last year :chore:bbb:zaeph:
+
+For the admins on BBB. The list is accessible here: [Organization Settings](https://bbb.emacsverse.org/b/admins/rooms).
+Should take no more than ~20′.
+
+
+## DONE Write volunteer update
+
+Hello, folks! Here&rsquo;s the weekly update on what&rsquo;s happening backstage
+for EmacsConf 2022 in case you notice something that you want to help
+out with. =)
+
+- All the speakers have confirmed that they&rsquo;ve gotten the acceptance
+ e-mails. Many speakers have confirmed that the schedule works for
+ them after I reshuffled a few talks for better availability. I&rsquo;ve
+ posted the schedule at <https://emacsconf.org/2022/talks/> . We&rsquo;ll
+ announce the schedule on the emacsconf-discuss mailing, Reddit, and
+ various places this week.
+
+- zaeph has been working on the ffmpeg incantations for preprocessing
+ the videos that will be submitted soon. bandali is working on
+ getting the FTP and web-based uploads sorted out so that speakers
+ can submit their videos.
+
+- I created some watch pages to support viewing different tracks:
+ <https://emacsconf.org/2022/watch/> . The livestreams won&rsquo;t work yet
+ and it would be nice to figure out something that can dynamically
+ display info for recent/current/upcoming talks, but it&rsquo;s a start.
+
+- We set up a self-hosted Etherpad (ex:
+ <https://pad.emacsconf.org/2022-journalism>) with an easy way to
+ redirect to using Wikimedia in case we run into scaling issues. I&rsquo;ve
+ added it to our Ansible playbook
+ (git@git.emacsconf.org:pub/emacsconf-ansible) and I&rsquo;m looking
+ forward to incorporating Ry P.&rsquo;s improvements. Karl Voit gave
+ feedback on the first draft of the template.
+
+- vetrivln volunteered for some of the dev hosting shifts, Karl Voit
+ volunteered for some of the gen pad shifts, and FlowyCoder
+ volunteered for some of the gen check-in shifts. Thanks!
+
+Next week, we hope to:
+
+- Announce the EmacsConf 2022 schedule in the usual places (got any wording/JS/CSS suggestions?)
+- Finalize the upload instructions so that speakers can start submitting their files
+- Put together volunteer training materials
+- Set up per-speaker BBB rooms and friendly URLs
+
+Sacha
+
+
+## DONE Publish icals :sachac:
+
+It would be nice to have track-specific icals as well.
+
+
+### DONE Check icals, create org schedule
+
+<https://www.reddit.com/r/emacs/comments/yilmhv/emacsconf_2022_dec_3_4_schedule/ixgt1wr?utm_medium=android_app&utm_source=share&context=3>
+
+
+<a id="upload"></a>
+
+## DONE Figure out web-based file upload :needsowner:sachac:ansible:
+
+zaeph: I can work on it, but I’m not experienced in this domain, so I’d prefer to be a back-up.
+task is currently with bandali
+
+Lesson learned from last year: &ldquo;Since people kept running into ftp
+problems, we might want to set up a web-frontend next year to minimise
+problems.&rdquo;
+
+Maybe we could ask some of the volunteers who wanted to help us with
+the infra? It shouldn’t be complicated to deploy a ready-made
+solution.
+
+&ldquo;file drop&rdquo; is a common keyword for looking for information.
+Considerations:
+
+- Probably run it on media.emacsconf.org
+- Bonus features:
+ - password-protected or hidden behind some kind of authentication or hidden behind some kind of URL, so we don&rsquo;t have to worry too much about spam
+ - extra points for sending speakers links to upload to specific folders so that we can separate resources by talk
+ - Resumable uploads would be good, since some speakers had a hard time with unreliable connections
+- What other conferences do:
+ - LibrePlanet uses plain FTP and recommends FileZilla <https://libreplanet.org/wiki/Video_upload_instructions>
+ - FOSSDEM uses Pentabarf to receive uploads <https://archive.fosdem.org/2022/manuals/program/speaker/>
+ - DebConf uses SReview(?)
+ - FOSSGIS uses Seafile <https://vmx.cx/cgi-bin/blog/index.cgi/video-uploads-for-an-online-conference%3A2021-06-12%3Aen%2Cconference%2Cgeo>
+- Some options:
+
+ <table>
+
+
+ <colgroup>
+ <col class="org-left">
+
+ <col class="org-left">
+
+ <col class="org-left">
+
+ <col class="org-left">
+
+ <col class="org-left">
+ </colgroup>
+ <tbody>
+ <tr>
+ <td class="org-left">Project</td>
+ <td class="org-left">Docker</td>
+ <td class="org-left">Buster</td>
+ <td class="org-left">Base</td>
+ <td class="org-left">Notes</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://www.projectsend.org/">https://www.projectsend.org/</a></td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">php+mysql</td>
+ <td class="org-left">&#xa0;</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/pomf/pomf">https://github.com/pomf/pomf</a></td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">php+mysql</td>
+ <td class="org-left">&#xa0;</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/psi-4ward/psitransfer">https://github.com/psi-4ward/psitransfer</a></td>
+ <td class="org-left">official</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">node</td>
+ <td class="org-left">can set upload password, resumable; data volume needs uid 1000</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/epoupon/fileshelter">https://github.com/epoupon/fileshelter</a></td>
+ <td class="org-left">official</td>
+ <td class="org-left">ppa</td>
+ <td class="org-left">C++</td>
+ <td class="org-left">&#xa0;</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/mickael-kerjean/filestash">https://github.com/mickael-kerjean/filestash</a></td>
+ <td class="org-left">official</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">general FTP client</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://gitlab.com/moejo42/Jirafeau">https://gitlab.com/moejo42/Jirafeau</a></td>
+ <td class="org-left">official</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">php</td>
+ <td class="org-left">&#xa0;</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/YouTransfer/YouTransfer">https://github.com/YouTransfer/YouTransfer</a></td>
+ <td class="org-left">official</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">node</td>
+ <td class="org-left">looking for maint</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/dutchcoders/transfer.sh/">https://github.com/dutchcoders/transfer.sh/</a></td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ </tr>
+
+
+ <tr>
+ <td class="org-left"><a href="https://github.com/eikek/sharry">https://github.com/eikek/sharry</a></td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ <td class="org-left">&#xa0;</td>
+ </tr>
+ </tbody>
+ </table>
+
+ - NextCloud
+
+ anon FTP upload currently goes to *srv/ftp/anon* on media.emacsconf.org
+
+ <file:///ssh:media|sudo>
+
+ Maybe I&rsquo;ll do psitransfer as a direct install
+
+
+### DONE Create 2022/upload.md with the same workflow as last year for a start
+
+
+### DONE Implement new workflow
+
+
+<a id="irc"></a>
+
+## DONE Update IRC instructions because of multiple tracks
+
+Added to watch pages
+
+
+<a id="publishing-sched"></a>
+
+## DONE Move scheduling and publishing code to Emacs on a VPS so that other people can help out :sachac:
+
+Ideal:
+
+- Update pages with watching information, additional resources, etc. as talks go live
+- Update the schedule as needed (cancelled or reordered talks, etc.)
+
+Where:
+
+- front? my own VPS?
+
+ Nice if there&rsquo;s an Ansible playbook
+
+ sachac&rsquo;s notes:
+ <file:///home/sacha/code/docker/emacsconf-publish/>
+- probably good to set it up on front
+
+It&rsquo;s now on front.
+
+
+## DONE Prepare email for nudging speakers to send prerec, and inform on upload workflow :timesensitive:needsowner:
+
+
+### Code
+
+ (defun emacsconf-mail-upload (group &optional template)
+ "Send upload instructions and reminder.
+ GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (let ((action-date (date-to-time "2022-11-04")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "upload"))
+ (car group)
+ (list
+ :slugs (mapconcat (lambda (o) (plist-get o :slug)) (cdr group) " or ")
+ :speakers-short (plist-get (cadr group) :speakers-short)
+ :plural (if (= (length (cdr group)) 1) "" "s")
+ :email (plist-get (cadr group) :email)
+ :year (or (plist-get (cadr group) :year) emacsconf-year)
+ :prerec-note (emacsconf-surround
+ (make-string 64 ?-)
+ (string-join (seq-uniq (mapcar
+ (lambda (o)
+ (plist-get o :prerec-info))
+ (cdr group)))
+ "\n")
+ (make-string 64 ?-)
+ "")))))
+
+
+### Template
+
+Hi, ${speakers-short}!
+
+${prerec-note}Here are the instructions for uploading the
+video${plural} for your talk${plural}. You can find the latest version
+of the instructions at https://emacsconf.org/2022/upload/ . There are
+two ways to upload your talk${plural} this year, so you can pick the
+one that works best for you:
+
+- Web-based: <https://ftp-upload.emacsconf.org> , password emacsconf
+- FTP: host: ftp-upload.emacsconf.org, port: 21, username: anonymous
+ folder: upload-here
+
+If you upload slides and other resources, we can include them on the
+talk page when your talk goes live. If you happen to have a script or
+a transcript, please include them as well (it’ll speed up the
+captioning for us).
+
+Please add a comment or start your filenames with the ID for the talk
+that it&rsquo;s for: ${slugs}.
+
+If you&rsquo;re still working on your talk, you might find the tips at
+<https://emacsconf.org/2022/prepare> useful. In brief:
+
+- at least 1280x720 resolution
+- we recommend dark text on a light background, with enough contrast
+ to make it easy to read
+- if possible, use a headset or external microphone to record audio
+ in order to minimize computer noise
+- upload a separate 5 second recording of quiet or leave 5 seconds
+ of quiet at the end of your talk video so that we can process your
+ video for noise reduction
+
+Please plan to upload your talk by November 4 (next Friday) so that we
+can get started preparing it for streaming. If you can&rsquo;t make it by
+then, we can accept later submissions, although it&rsquo;s a bit more of a
+scramble and our stress levels go up as the conference approaches. =)
+We&rsquo;d really appreciate the extra time for captioning and
+double-checking. Thank you for your help in getting ready for a smooth
+EmacsConf 2022!
+
+Sacha Chua
+
+
+## DONE Send backstage email
+
+ (defun emacsconf-mail-backstage-info (group &optional template)
+ (interactive (list (emacsconf-complete-talk-info)))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "backstage"))
+ (plist-get group :email)
+ (append group
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :conf-name emacsconf-name
+ :year emacsconf-year))))
+ (defun emacsconf-mail-backstage-info-to-speakers-and-captioners ()
+ (interactive)
+ (let ((template (emacsconf-mail-merge-get-template "backstage"))
+ (speaker-groups
+ (seq-uniq
+ (mapcar
+ (lambda (talk)
+ (list
+ :name (plist-get talk :speakers-short)
+ :email (plist-get talk :email)
+ :role "speaker"
+ :backstage-use
+ "As we add more talks, you can skim through any relevant ones to
+ see if there are any points you'd like to build on in your talk.
+ Also, you can get a sense of what we do behind the scenes to try
+ to get as many talks captioned for broadcast, and what you can do
+ to make it easier. (A text file with names and technical terms
+ can be helpful. No need to type out a manual transcript if you
+ don't start from a script.) After you upload your talk and we
+ process the files, you can use the backstage area to check the
+ quality of the reencoded video."))
+ (seq-filter (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC"))
+ (emacsconf-filter-talks (emacsconf-get-talk-info))))))
+ (volunteer-groups
+ (with-current-buffer (find-file-noselect emacsconf-org-file)
+ (org-map-entries (lambda ()
+ (list :name (org-entry-get (point) "NAME_SHORT")
+ :email (org-entry-get (point) "EMAIL")
+ :role "captioning volunteer"
+ :backstage-use "If you see a talk that you'd like to caption, you can e-mail me at sacha@sachachua.com and I can reserve it for you."))
+ "captions"))))
+ (mapcar (lambda (g) (emacsconf-mail-backstage-info g template))
+ (append
+ speaker-groups
+ (seq-remove (lambda (v) (seq-find (lambda (s) (string= (plist-get s :email)
+ (plist-get v :email)))
+ speaker-groups))
+ volunteer-groups)))))
+
+
+### Template
+
+Hi ${name}!
+
+You&rsquo;re getting this e-mail because you are a ${role} for ${conf-name}
+${year}. (Thanks!)
+
+I&rsquo;m so excited! =) A number of speakers have uploaded their videos,
+and OpenAI Whisper looks like a promising way to get automatically
+generated captions that we can use as a starting point.
+
+We&rsquo;ve set up ${backstage} as the backstage area where you can view the
+videos and resources uploaded so far. You can access it with the
+username "${backstage-user}&ldquo; and the password &rdquo;${backstage-password}&ldquo;.
+Please keep the backstage password and other speakers&rsquo; talk resources
+secret. ${backstage-use}
+
+Thank you!
+
+Sacha Chua
+
+
+## DONE Write playbooks
+
+
+### DONE Host :zaeph:
+
+<https://emacsconf.org/2022/volunteer/host>
+
+
+### CANCELLED Streamer :zaeph:
+
+Blocked by [Investigate streaming options, maybe OBS in the cloud](#streaming)
+
+bandali and corwin/zaeph will do the streaming, so writing the streaming playbook is a little lower priority for now
+
+
+### DONE Check-in
+
+<https://emacsconf.org/2022/volunteer/checkin/>
+
+
+### DONE IRC
+
+<https://emacsconf.org/2022/volunteer/irc/>
+
+
+### DONE Pad
+
+<https://emacsconf.org/2022/volunteer/pad/>
+
+
+### DONE Captions
+
+<https://emacsconf.org/2022/volunteer/caption/>
+
+
+## CANCELLED Figure out why ikiwiki is slow :infra:wiki:
+
+complex regular expression issues?
+should the captions be outside the wiki?
+
+
+## CANCELLED Add nice-to-have stuff to prepare.md :zaeph:
+
+- org-reveal config
+- SIL fonts choice
+
+
+## DONE Write volunteer update 2022-10-23 :update:
+
+Hello, folks! Here&rsquo;s the weekly update on what&rsquo;s happening backstage
+for EmacsConf 2022 in case you notice something that you want to help
+out with. =)
+
+- We&rsquo;ve e-mailed the speakers instructions for uploading their files through either a web browser or an FTP client, and three speakers have already done so! Those talks are now available in the backstage area (<https://media.emacsconf.org/2022/backstage/>), along with the first set of edited captions (thanks Jai Vetrivelan!). If you don&rsquo;t have the username and password for the backstage area and you would like to access it, please e-mail me and I&rsquo;ll send you the details.
+- We&rsquo;ve created a BBB room for each speaker&rsquo;s live Q&A session. The URLs are in conf.org in the private repository if you need them.
+- We&rsquo;ve drafted some documentation for different volunteer roles. If you&rsquo;d like to volunteer as a captioner, check-in person (hmm, reception?), Etherpad scribe, IRC monitor, or host, please check out the appropriate link and let me know if I need to add anything to the docs:
+ - <https://emacsconf.org/2022/volunteer/caption>
+ - <https://emacsconf.org/2022/volunteer/irc>
+ - <https://emacsconf.org/2022/volunteer/pad>
+ - <https://emacsconf.org/2022/volunteer/checkin>
+ - <https://emacsconf.org/2022/volunteer/host>
+- Thanks to David O&rsquo;Toole for signing up for some IRC shifts! If you would like to volunteer for a shift, check out <https://emacsconf.org/2022/organizers-notebook/#shifts> .
+- We&rsquo;ve updated our streaming configuration for the General and Development tracks, and have started testing them using mpv and the watch pages. Videos aren&rsquo;t currently streaming, but you can check out the layout of the watch pages at:
+
+ - <https://emacsconf.org/2022/watch/gen/>
+ - <https://live.emacsconf.org/2022/watch/gen/>
+ - <https://emacsconf.org/2022/watch/dev/>
+ - <https://live.emacsconf.org/2022/watch/dev/>
+
+ These pages could probably be a lot prettier and easier to use. If you have some ideas for improving them or if you&rsquo;d like to work on the HTML/CSS/JS, we&rsquo;d love your help!
+- There are now Q&A waiting rooms with friendly URLs so that it&rsquo;s easier for people to join the live Q&A when the host decides it&rsquo;s okay to let everyone in. They&rsquo;re linked on the watch pages (along with the pads) and they&rsquo;ll be linked from the talk pages once we&rsquo;re ready to share them.
+- zaeph has been busy tweaking the ffmpeg workflow for reencoding and normalizing videos. Thanks to Ry P. for sharing the res.emacsconf.org server with us - we&rsquo;ve been using it for all the processing that our laptops can&rsquo;t handle.
+- We experimented with using the OpenAI Whisper speech-to-text toolkit to create the auto-generated captions that captioning volunteers can edit. Looks promising! If you&rsquo;d like to compare the performance between small, medium, and large models, you can look at the VTT files for the sqlite talk in the backstage area. I&rsquo;ve also added support for tab-separated values (like Audacity label exports) and a subed-convert command to subed.el, which might give us a more concise format to work with. I&rsquo;ll work on getting word-level timing data so that our captioning workflow can be even easier.
+
+Next week, we hope to:
+
+- improve the prerec and captioning workflows
+- get more captions underway
+
+Lots of good stuff happening!
+
+Sacha Chua
+
+
+## DONE 2022-10-30 volunteer update
+
+Hello, everyone! Here&rsquo;s the weekly update on what&rsquo;s happening backstage
+for EmacsConf 2022 in case you notice something that you want to help
+out with. =)
+
+- Help wanted - Captioning: There are three talks open for captioning
+ in <https://media.emacsconf.org/2022/backstage/> , so feel free to
+ e-mail me if you&rsquo;d like to reserve one. I&rsquo;ve tweaked the captioning
+ process a little bit so that I can reflow the transcripts into
+ shorter subtitles before people edit the captions, so editing is
+ easier to do because you don&rsquo;t have to split along the way. (If
+ you&rsquo;re curious about the technical stuff, I switched to manually
+ splitting the text using emacsconf-reflow from emacsconf-el and then
+ the using aeneas for forced alignment, because I couldn&rsquo;t figure out
+ how to get torchaudio unstuck sometimes.)
+
+ If you don&rsquo;t have the username and password for the backstage area
+ and you would like to access it, please e-mail me and I&rsquo;ll send you
+ the details.
+
+- Help wanted - tech checks: For sessions with live Q&A, we&rsquo;d like to
+ set up tech-checks with speakers to make sure that their setup works
+ well with BigBlueButton. A rough outline of the process is in the
+ tech-checking protocol heading at
+ <https://emacsconf.org/2022/organizers-notebook/#tech-checks> . If you
+ would like to help with tech-checks, please e-mail us with your
+ general availability (including timezones) and preferred public
+ contact information so that we can include you on the list at
+ <https://emacsconf.org/2022/prepare/#tech-check> and in the e-mail to
+ speakers.
+
+- Help wanted - intro/intermission slides, OBS overlay, ??: It might
+ be interesting to design something to show right before and right
+ after a talk so that people can see the title, speaker name, talk
+ page URL, Q&A info, pad URL, pronouns, etc. Ideally we&rsquo;d be able to
+ generate a whole bunch of these from the talk data, so maybe SVG or
+ a TikZ picture? If this is your jam, let us know.
+
+- OBS in the cloud: We&rsquo;ve been able to figure out how to stream both
+ streams using OBS, VNC, and PulseAudio on Ry P.&rsquo;s virtual server, so
+ it&rsquo;s even more likely that we&rsquo;re going to pull off two tracks this
+ year. Yay!
+
+- Tom Purl has joined as a captioning volunteer. Hi Tom!
+
+This week we hope to get lots of talks submitted, processed, and on
+the way to being captioned. We&rsquo;re also planning to make the captioning
+workflow even better, and to improve the OBS streaming workflow. Whee!
+
+Sacha <sacha@sachachua.com>
+
+
+## Volunteer update 2022-11-07
+
+Hi everyone!
+
+Here&rsquo;s what&rsquo;s been happening backstage.
+
+- Speakers have been submitting their videos, hooray! I added a
+ schedule to the backstage page at
+ <https://media.emacsconf.org/2022/backstage/> so that people can see
+ how the schedule&rsquo;s coming along. We expect more talks to come in the
+ next two weeks. Not panicking yet. =)
+
+- Thanks to all the people who&rsquo;ve been working on captions so far!
+ Bhavin, Andrea, and Ramin did the captions for their talks, and Jai
+ captioned Bala&rsquo;s talk. Tom, Bhavin, and Hannah are currently working
+ on captions. There are three more talks backstage if anyone wants to
+ work on them.
+
+- I just posted some notes on how I reflow and edit subtitles in case
+ they&rsquo;re helpful:
+ <https://media.emacsconf.org/2022/backstage/editing-captions.html>
+ It&rsquo;s also linked from the backstage page under More info: editing
+ captions.
+
+- We added the Emacs development updates talk from John Wiegley and
+ updated the times of other talks based on messages from the
+ speakers.
+
+- We did a dry run of the OBS streaming setup with Leo, Amin, and
+ Corwin. I think we&rsquo;re on track to being able to broadcast two
+ streams this year.
+
+- IRC announcements, BBB redirection, and media file publishing can
+ now all automatically happen when the talk status changes,
+ simplifying our work during the conference. Video playback and Q&A
+ browser windows can happen automatically if streaming from
+ res.emacsconf.org. I want to get the publishing workflow all
+ smoothed out too, so that talks and transcripts can be more easily
+ published to the wiki pages during the conference.
+
+Plans for this week:
+
+- More videos and captions!
+- I plan to work on talk page publishing so that it happens smoothly during the conference
+- Leo&rsquo;s going to review the videos submitted so far and prepare intros for them
+- Might be a good idea to reach out to speakers for tech checks and bios
+
+EmacsConf is a little less than four weeks away. Stuff is happening!
+
+Sacha
+
+
+## DONE Send prerec reminder :sachac:
+
+
+### DONE Update logbook with notes from e-mails :sachac:
+
+
+### DONE Follow up with speakers based on their availability
+
+
+### CANCELLED Email speakers because I&rsquo;ll be shutting down the web upload
+
+
+## DONE Send schedule-published email for emacsconf-discuss :needsowner:timesensitive:email:
+
+Schedule is now available; post to emacsconf-discuss, emacs-tangents
+<https://lists.gnu.org/archive/html/emacsconf-discuss/2022-10/msg00000.html>
+
+
+### DONE Post it to r/emacs as well :reddit:zaeph:
+
+Please let zaeph know when it’s live so that the post can be distinguished.
+
+
+### Template
+
+Greetings, fellow Emacsians!
+
+On behalf of the EmacsConf 2022 organizers team, I&rsquo;m very excited to
+announce the schedule for EmacsConf 2022 (Dec 3 and 4), available at:
+
+<https://emacsconf.org/2022/talks>
+
+All of the times listed on the schedule are in EST (UTC-5). You can
+click on each talk&rsquo;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&rsquo;s video will be
+made available on the same page. Please note that the times are
+approximations, and that the schedule may change leading up to the
+conference.
+
+As the conference approaches, we&rsquo;ll post more details on how to watch
+and participate.
+
+You can subscribe to the emacsconf-discuss mailing list at
+<https://lists.gnu.org/mailman/listinfo/emacsconf-discuss> to
+be sure you&rsquo;ll get updates.
+
+Want to help make EmacsConf even awesomer? Volunteer!
+<https://emacsconf.org/2022/volunteer/>
+
+We hope to see you all around on Dec 3-4 for EmacsConf 2022!
+
+P.S. please direct all 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&rsquo;d in this message; thank you.
+
+
+## DONE Flesh out prepare.md for audio-recording tips before the prerec-deadline :zaeph:
+
+
+## DONE Write speaker e-mail for people who have already submitted their talks
+
+To: speakers who have already submitted their talks (so that we don&rsquo;t distract people who are still working on their talks)
+
+ (defun emacsconf-mail-speaker-after-video (group &optional template)
+ (interactive (list (emacsconf-mail-complete-email-group
+ (seq-filter (lambda (o) (plist-get o :intro-note))
+ (emacsconf-active-talks (emacsconf-get-talk-info))))))
+ (setq template (or template (emacsconf-mail-merge-get-template "speaker-after-video")))
+ (let ((talks (cdr group)))
+ (emacsconf-mail-prepare
+ template
+ (car group)
+ (list :speakers-short (plist-get (cadr group) :speakers-short)
+ :plural (if (= (length (cdr group)) 1) "" "s")
+ :email (plist-get (cadr group) :email)
+ :in-between (mapconcat (lambda (talk)
+ (emacsconf-surround "<https://media.emacsconf.org/2022/in-between/" (plist-get talk :slug) ".png>" ""))
+ (cdr group)
+ ", ")
+ :intro
+ (mapconcat (lambda (talk)
+ (string-join (org-wrap (emacsconf-surround "- " (plist-get talk :intro-note) "\n" "") 70) "\n"))
+ (cdr group)
+ "")
+ :chapters
+ (mapconcat (lambda (talk)
+ (format "<https://media.emacsconf.org/2022/backstage/#%s>:\n%s"
+ (plist-get talk :slug)
+ (mapconcat
+ (lambda (chapter)
+ (concat (format-seconds "%.2h:%z%.2m:%.2s"
+ (floor (/ (elt chapter 1) 1000)))
+ " "
+ (elt chapter 3) "\n"))
+ (subed-parse-file
+ (expand-file-name (concat (plist-get talk :video-slug) "--main--chapters.vtt") emacsconf-cache-dir)))))
+ (cdr group)
+ "\n\n")
+ :caption-note
+ (if (seq-find (lambda (o) (not (string= (plist-get o :status) "TO_STREAM"))) (cdr group))
+ " The captions haven't been fully edited yet, so please ignore any errors in the captions themselves."
+ "")
+ :urls
+ (mapconcat (lambda (o) (concat "<" emacsconf-base-url (plist-get o :url) ">"))
+ (cdr group) " , ")
+ :tech-check-note
+ (if (string-match "live" (or (mapconcat (lambda (o) (or (plist-get o :q-and-a) "")) (cdr group) " ") ""))
+ (format
+ "*Tech check*
+
+ Since you're planning to do a live Q&A session, you may want to
+ connect to the test BBB room at <%s> to make sure you can share
+ your audio, your window or screen, and your webcam (optional). Sharing
+ system audio or multi-monitor setups can sometimes be tricky, so
+ please let us know if you need help figuring things out. You can
+ double-check by connecting with a separate device, or you can arrange
+ to meet with one of the tech-check volunteers
+ (<https://emacsconf.org/2022/prepare/#tech-check>).${wrap}
+
+ " emacsconf-test-bbb-room) "")))
+ (add-hook 'message-sent-hook
+ `(lambda ()
+ (mapc (lambda (o)
+ (emacsconf-add-to-talk-logbook o "Sent speaker-after-video email"))
+ (list
+ ,@(mapcar (lambda (talk) (plist-get talk :slug)) talks))))
+ nil t)))
+
+ (defun emacsconf-mail-speakers-after-videos ()
+ (interactive)
+ (let* ((info (seq-filter (lambda (o) (plist-get o :intro-note))
+ (emacsconf-active-talks (emacsconf-get-talk-info))))
+ (grouped (seq-group-by (lambda (o) (plist-get o :email)) info))
+ (template (emacsconf-mail-merge-get-template "speaker-after-video")))
+ (mapc (lambda (group)
+ (emacsconf-mail-speaker-after-video group template))
+ grouped)))
+
+
+### Template
+
+Hi, ${speakers-short}!
+
+Thank you for uploading your video early! Let&rsquo;s get a few more things
+sorted out for a smooth EmacsConf 2022.
+
+${tech-check-note}\*Intro\*
+
+I&rsquo;ve written a brief (and possibly inaccurate! =) ) intro that the
+host can read out before your talk while the in-between slide
+(${in-between}) is being displayed:
+
+${intro}
+
+Would you like to tweak it to better reflect your talk?
+
+**Chapter markers**
+
+I&rsquo;ve added chapter markers to your video in the backstage area to help
+with navigation. You can click on them in the backstage area if you
+want to easily jump around, or review the list that I&rsquo;ve included for
+your convenience:
+
+${chapters}
+If you prefer other headings or timestamps, please let me know!${caption-note}
+
+**Bio, community support links**
+
+People often want to learn more about speakers and show their
+appreciation. If you&rsquo;d like to include an author bio and any
+social/support links to your talk page${plural} (${urls}), please
+e-mail us the text that you&rsquo;d like to include. You can also follow the
+instructions at <https://emacsconf.org/edit/> to edit your talk
+page${plural} directly yourself, if you want to.${wrap}
+
+Thanks again for all your contributions!
+
+Sacha
+
+
+<a id="prepare-prerec-process"></a>
+
+## DONE Prepare for prerecs :zaeph:
+
+
+### DONE Optimize ffmpeg incantation
+
+Remember to update <../prepare.md> with the new incantation.
+
+
+#### Incantation from last year
+
+ 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"
+
+
+#### New candidate
+
+Changelog:
+
+- Disable adaptive quantization by setting aq-mode to 0 (TODO: compare samples)
+- Add `-row-mt 1` needed to support `tile-rows` (2×2 is enough for 720p)
+- Also use tiles for first pass
+- Remove `-frame-parallel 0` because it’s disabled by default (see [Notes on encoding settings · Kagami/webm.py Wiki](https://github.com/Kagami/webm.py/wiki/Notes-on-encoding-settings))
+- Put number of CPU in variable and use it for `cpu-used` and `threads`
+- Stick to default for `auto-alt-ref`
+- Stick to default for `lag-in-frames`
+
+ Q=32
+ CPU=8
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -an -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $CPU -g 240 -pass 1 -f webm -threads $CPU /dev/null &&
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a copy -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $CPU -pass 2 -g 240 -threads $CPU "$2"
+
+Other considerations:
+
+- We might want to tweak the time before keyframes (`-g`).
+
+
+#### FFMpeg
+
+<https://img.ly/blog/ultimate-guide-to-ffmpeg/>
+
+
+### DONE Figure out workflow for handling submitted prerecs
+
+We need time after the prerecs get submitted to:
+
+- convert the videos and check that they&rsquo;ve been reencoded properly by watching the re-encoded ones all the way to the end
+- caption videos
+- capture any extra info
+- follow up with missing prerecs
+
+Make changes in [As prerecorded talks come in](#prerec-process)
+
+
+<a id="intro"></a>
+
+## DONE Make something to display between talks :akshay196:
+
+Goals:
+
+- Reassure people that they&rsquo;re in the right stream for the talk that they&rsquo;re looking for
+- Direct them to the pad and Q&A for the talk
+
+What to show in between talks:
+
+- Previous talk: title, speaker, pronouns, talk page, Q&A information (if still live)
+- Next talk: title, speaker, pronouns, talk page, Q&A information, countdown
+
+<https://media.emacsconf.org/2022/backstage/gen-in-between.pdf>
+<https://media.emacsconf.org/2022/backstage/dev-in-between.pdf>
+
+- Good: Static image, maybe created with LaTeX
+- Better: Video with unobtrusive sound so people can doublecheck that their audio works
+- Best: Emacs thing so that we can have a dynamic timer and last-minute announcements, and so that it&rsquo;s Emacs =)
+- Even better than that: A compact view that can be overlaid on the Q&A session using OBS
+
+See break commercials
+<https://www.collabmagazine.com/organizing-a-multi-track-virtual-conference-with-microsoft-teams-live-events-a-technical-playbook-and-lessons-learned/>
+
+OBS scenes (maybe?):
+
+- splash-screen when we’re on break
+- scene when broadcasting a talk (where we might want a logo and a bar or surrounding to broadcast messages like time left in
+ recording); and
+- Q&A scene with host-webcam, optional speaker-webcam, and pad with questions.
+- Q&A scene focusing on shared screen from speaker
+- Q&A scene with IRC and pad
+
+Nothing is urgent, blocking it, or being blocked by it, so you can
+play around with ideas.
+
+We&rsquo;re experimenting with two tracks this year, so we expect that some
+people will join midway through a talk or Q&A session and
+would like to reorient themselves. Some Q&A sessions may end
+early, so we would like to reassure people that they&rsquo;re in
+the right spot for the next talk. Most Q&As will be done
+live, but some Q&As will be done over IRC, so we need to
+point people to the right place.
+
+and if there&rsquo;s room for a little extra info like public e-mail
+addresses or pronouns, that can help people when they discuss
+things. That info will be in the pad and IRC, though, so it&rsquo;s
+also okay to omit it
+
+We can programmatically replace strings in
+SVG from Emacs, so we can easily use that as an overlay.
+
+<zaeph> …Or, if you just want to focus on the look of
+things, we can think of the content on our own.
+
+<sachac> oh yeah, totally, you can just focus on the design and use
+placeholder text
+
+Overlay considerations:
+
+- talk videos will likely have subtitles; no subtitles for Q&A
+- zaeph doesn&rsquo;t like vertical text
+
+
+### DONE Generate talk banners :sachac:
+
+![img](https://gitlab.com/akshay196/emacsconf-artwork/-/blob/main/2022/talk-banner/sample.svg)
+<https://gitlab.com/akshay196/emacsconf-artwork/-/blob/main/2022/overlays/src/>
+
+
+### TODO Make a list of different things to plug during commercial breaks, like Mastodon :sachac:
+
+
+### CANCELLED Create a version of in-between that we can use for Q&A, since it&rsquo;s no longer &ldquo;Coming Next&rdquo;
+
+
+## DONE Find volunteers for tech-checks :zaeph:
+
+
+### DONE Add entry in 2022/volunteer.md
+
+
+### DONE Write protocol for adding tech-checker volunteer
+
+- Invite volunteer to BBB (ask core organizers)
+- Update <prepare.md> with new tech-checker info
+- Coach tech-checker on the protocol
+
+
+### DONE Write the tech-checking protocol (formerly referred to as “tech-checklist”)
+
+From previous years:
+
+> - Can you speak and be heard? Is there echo?
+> - Can you hear the organizer?
+> - 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?
+
+
+<a id="conforg"></a>
+
+## DONE Move conf.org management to orga@res.emacsconf.org :sachac:
+
+so that more people can work with it during the conference
+See the publish role in the ansible playbook
+
+
+## DONE Ask speakers for bios or support nudges to include on their talk pages :wiki:
+
+maybe after we get the prerecs
+ex: liberapay, patreon, anyone looking for a job, etc.
+
+
+## DONE Set up BBB rooms and update conf.org :sachac:
+
+1. Log on to bbb.emacsverse.org as an admin.
+2. Create a room. Enable **Mute users when they join**.
+
+ The code below doesn&rsquo;t quite work, but might be a good starting point for future automation.
+
+ (setq list (seq-drop (emacsconf-bbb-room-title-list) 3)) ; skip some if needed
+ (progn
+ (setq name (pop list))
+ (kill-new (format "name=\"%s\";$('#create-room-block').click();$('#create-room-name').val(name);$('#room_mute_on_join').click();$('.create-room-button').click();\n"
+ name))
+ (sleep-for 1)
+ (shell-command "xdotool key alt+Tab sleep 3 key ctrl+v sleep 1 key Return"))
+
+console.log(JSON.stringify([&#x2026;document.querySelectorAll(&rsquo;.delete-room&rsquo;)].map((o) => { return { name: o.getAttribute(&rsquo;data-name&rsquo;), path: o.getAttribute(&rsquo;data-path&rsquo;) }}).filter((o) => o.name.match(*^ec22*))))
+
+see conf.org for the rest of the process
+
+
+### DONE Add volunteers to the BBB rooms
+
+- vetrivln: sat-am-dev, sun-am-dev
+- FlowyCoder: sat-pm-gen, sun-pm-gen
+- jman: sun-pm-gen
+
+
+### DONE Doublecheck mute on join
+
+[Shifts](file:///home/sacha/proj/emacsconf/wiki/2022/organizers-notebook/index.md)
+
+ list = [...document.querySelectorAll('.room-name-editable')].filter((o) => o.value.match(/^ec22-(sat|sun)/));
+ list.reduce(async(prev, elem) => {
+ await prev;
+ if (!sessionStorage.getItem(elem.value)) {
+ return new Promise(async (resolve, reject) => {
+ card = elem.closest('.card-body');
+ card.querySelector('.item-action.dropdown a').click();
+ await new Promise(r => setTimeout(r, 1000));
+ card.querySelector('.update-room').click();
+ await new Promise(r => setTimeout(r, 1000));
+ if (!document.querySelector('#room_mute_on_join').checked) {
+ document.querySelector('#room_mute_on_join').click();
+ sessionStorage.setItem(elem.value, true);
+ await new Promise(r => setTimeout(r, 1000));
+ document.querySelector('.update-only.create-room-button').click();
+ } else {
+ sessionStorage.setItem(elem.value, true);
+ document.querySelector('#createRoomModal').click();
+ }
+ resolve(true);
+ });
+ }
+ });
+
+
+<a id="coordinate-volunteers"></a>
+
+## DONE Coordinate and help volunteers :sachac:
+
+- <../volunteer>
+- Figure out what information volunteers need in order to feel
+ comfortable signing up for tasks. ex:
+ <https://wiki.debian.org/DebConf/21/VideoVolunteering>
+- Encourage people to sign up for [Shifts](#shifts)
+
+
+### DONE Plan training session(s), Q&A availability, recordings
+
+
+### CANCELLED Hold Q&A session with volunteers
+
+
+### TODO Respond to new volunteers
+
+
+### SOMEDAY Subscribe volunteers to mailing list
+
+
+<a id="streaming"></a>
+
+## DONE Investigate streaming options, maybe OBS in the cloud :sachac:
+
+Current status:
+
+- res.emacsconf.org seems to be able to handle 2x (OBS + TigerVNC + MPV, should test with Firefox as well)
+- corwin and jman will stream gen from OBS on res
+- bandali will stream dev from his laptop
+- let sachac know if you want manual control or more autopilot for the gen stream
+
+Goals:
+
+- [X] Be able to start a VNC server with OBS, MPV, and Firefox, connect to it, and stream
+- [X] Have another session with the sound isolated
+- [-] Split the audio so that we can join the Q&A room before the MPV ends - handled by automatic scene switcher detecting mpv, but we can&rsquo;t share just a window, so we might as well just wait
+- [X] Control MPV from the commandline: track-mpv appears in the correct display, and it can also be controlled via the socket like this: echo &rsquo;{ &ldquo;command&rdquo;: [&ldquo;loadfile&rdquo;, &ldquo;test2.webm&rdquo;] }&rsquo; | socat - ~/mpv-socket-emacsconf-dev
+- [ ] Share the window instead of the desktop?
+
+Prerequisites:
+
+- You need to be able to SSH out to res.emacsconf.org on port 46668
+ and forward ports, so one of the main organizers needs to add your
+ SSH public key to the authorized\_keys file. Please e-mail your SSH
+ public key to sacha@sachachua.com and test that port 46668 is not
+ blocked.
+- For streaming from OBS in VNC, you will need a VNC viewer like
+ tigervnc-viewer.
+- For streaming from your local computer, you will need OBS and FFmpeg.
+
+During the conference, you will:
+
+- play the talk video (unless it&rsquo;s automatically managed by the agenda) and update the overlays
+- display intro/intermission information as needed
+- open the Q&A windows, like the pad and the BBB room/IRC (unless it&rsquo;s automatically managed by the agenda)
+- adjust the volume if needed
+- arrange windows and focus the BBB room on the speaker&rsquo;s webcam if needed
+- if you like, you can be responsible for managing the track from conf.org on orga@res.emacsconf.org
+
+Dry run checklist:
+
+- [ ] Connect to the server
+ ssh orga@res.emacsconf.org -p 46668
+ emacsconf # runs emacsclient -c -a emacs
+- [ ] Forward ports and connect via VNC
+- [ ] Find the OBS or start it if it is not running
+- [ ] Start recording
+- [ ] Play a video
+- [ ] Open two Firefox windows and arrange them
+- [ ] Manage windows on the workspace
+- [ ] Adjust the volume in OBS
+- [ ] SSH to the server and play a video off-screen
+- [ ] SSH to the server with X forwarding and adjust the volume off-screen
+
+
+### Broadcasting from local OBS (option A)
+
+- You can copy the profile from your track or look inside it for the icecast mount point details:
+ - Gen: rsync -avze &rsquo;ssh -p 46668&rsquo; emacsconf-gen@res.emacsconf.org:~/.config/obs-studio/basic/profiles/ ~/.config/obs-studio/basic/profiles/
+ - Dev: rsync -avze &rsquo;ssh -p 46668&rsquo; emacsconf-dev@res.emacsconf.org:~/.config/obs-studio/basic/profiles/ ~/.config/obs-studio/basic/profiles/
+
+- Sacha will turn off the OBS recordings on res so that you can test streaming from your computer
+ - If you&rsquo;re doing this independently, you can jump ahead to &ldquo;Connecting to VNC&rdquo; in order to stop the recording yourself
+
+- Verify with MPV:
+
+ mpv https://live0.emacsconf.org/gen.webm
+ mpv https://live0.emacsconf.org/dev.webm
+
+- With luck, the 480p streams will be up automatically as well
+
+ mpv https://live0.emacsconf.org/gen-480p.webm
+ mpv https://live0.emacsconf.org/dev-480p.webm
+
+
+### Connecting to VNC (option B)
+
+1. Stop broadcasting locally if you were testing local OBS.
+
+2. Install a VNC viewer on your system (ex: tigervnc-viewer).
+
+3. Set up your local environment:
+ - gen: export TRACK=gen; export TRACK\_PORT=5905; export SSH\_PORT=46668
+ - dev: export TRACK=dev; export TRACK\_PORT=5906; export SSH\_PORT=46668
+
+4. Copy the password:
+
+ scp emacsconf-$TRACK@res.emacsconf.org:~/.vnc/passwd vnc-passwd-$TRACK -p $SSH\_PORT
+
+5. Forward your local ports and connect via VNC viewer to the
+ appropriate forwarded port from your laptop:
+
+ ssh emacsconf-$TRACK@res.emacsconf.org -N -L $TRACK_PORT:127.0.0.1:$TRACK_PORT -p $SSH_PORT &
+ sleep 5 # Give it time to establish the tunnels
+ xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK &
+
+ (If this doesn&rsquo;t find a VNC server to connect to, you can start it with `ssh emacsconf-$TRACK@res.emacsconf.org -p $SSH_PORT /home/emacsconf-$TRACK/bin/track-vnc`)
+
+6. Start **recording** (not streaming). If you don&rsquo;t see OBS when you connect, it&rsquo;s probably on workspace 2, so you can switch with Alt-2. If you still don&rsquo;t see it there, you can open a terminal with Alt-Enter and then run `track-obs`. After you start recording, confirm that it is now broadcasting to the stream.
+
+7. Verify with MPV on your local system:
+
+ mpv https://live0.emacsconf.org/$TRACK.webm &
+
+8. With luck, the 480p streams will be up automatically as well. On your local system:
+
+ mpv https://live0.emacsconf.org/$TRACK-480p.webm &
+
+9. Play a video. It should display the video and update the overlays. If you need to update the overlays manually, you can copy files from `/data/emacsconf/overlays` onto `$HOME/other.png` and `$HOME/video.png`.
+
+ You can play a video with `play video-id` (ex: `play meetups`), or you can specify the filename (ex: ~play ~/stream/emacsconf-2022-meetups\*.webm).
+
+ termit: Ctrl-Shift-t makes a new tab
+
+ i3 cheat sheet:
+
+ - Alt-Enter creates a terminal
+ - Alt-d runs a command
+ - Alt-e toggles horizontal/vertical split
+ - Alt-f toggles full-screen
+ - Alt-w switches to tabbed view
+ - Alt-1 switches to workspace 1, Alt-2 switches to workspace 2
+ - Alt-Shift-2 moves things to workspace 2
+ - Alt-Shift-Left moves the current window to the left
+ - Alt-Shift-Right moves the current window to the right
+
+10. Test Q&A. You can either wait for the video to finish or quit it with &ldquo;q&rdquo;.
+ You can paste in the URLs or use
+ `firefox /data/emacsconf/2022/index-$TRACK.html`
+
+11. Test adjusting the audio
+ - `ssh emacsconf-$TRACK@res.emacsconf.org -p 46668`
+ - Then use `qa-louder`, `qa-quieter`, or `qa-vol vol%` (ex: `qa-vol 90%`)
+
+Other notes and tips:
+
+- You can use Emacs for emergency or ad-hoc announcements.
+- Use OBS or `pavucontrol` to adjust the volume of BBB as needed. You might be able to manage `pavucontrol` off-screen with `ssh emacsconf-$TRACK@res.emacsconf.org -X -p $SSH_PORT pavucontrol`.
+- You can also `ssh emacsconf-$TRACK@res.emasconf.org -p 46668` and start new processes from the command-line, such as using `track-mpv`. If you specify commands when you call SSH instead of using an interactive shell, you may need to also specify DISPLAY=:5 (for the gen track) or DISPLAY=:6 (for the dev track), since ssh won&rsquo;t pick up the variables from `.bashrc`.
+- If you have a Wayland-only desktop without any X11 compatibility layer (example: [Sway](https://swaywm.org) with `xwayland disable`) the suggested software (`tigervnc`) might no work. You can use instead for example `gnome-remote-desktop`. The password for the VNC connection can be retrieved from the file `vnc-passwd-$TRACK` (3DES encrypted).
+
+
+### Managing the stream from the agenda (option B2)
+
+ssh orga@res.emacsconf.org -p $SSH\_PORT
+emacsconf # runs emacsclient -c -a emacs
+
+You can then use
+
+- emacsconf-stream-play-video
+- emacsconf-stream-open-qa-windows-on-change
+- emacsconf-agenda-by-track
+- emacsconf-agenda
+
+If things are going well, you can use C-c C-t on the agenda view to change a talk to PLAYING, CLOSED\_Q, or OPEN\_Q, and various things should happen in the background. If they don&rsquo;t happen in the background, use emacsconf-add-org-after-todo-state-change-hook to add the todo state change hook, then try again.
+
+Task state shortcuts for C-c C-t:
+
+- **m (mpv):** PLAYING - -stream-play-video, emacsconf-stream-set-talk-info, publish the files to the media directory
+- **q (Q&A):** CLOSED\_Q
+- **o (open):** update the BBB redirect URLs to let people into the room
+- u (unstreamed)
+- r (to archive)
+
+You can leave the emacsclient with `C-x 5 0`
+
+
+#### Do Q&A
+
+From the emacsclient on orga@res.emacsconf.org, you can open various talk-related things:
+
+- emacsconf-stream-open-pad
+- emacsconf-stream-join-qa
+- emacsconf-stream-join-chat
+
+Alternatively, you can switch to the VNC viewer and use the links in
+<file:///data/emacsconf/2022/index-gen.html> or
+<file:///data/emacsconf/2022/index-dev.html> .
+
+For Q&A, you may want to have the Etherpad on the left, the BBB Q&A or
+IRC chat on the right, and the terminal and OBS windows on
+workspace 2.
+
+
+### Other tasks as needed
+
+
+#### Display emergency news / announcements
+
+M-x emacsconf-stream-broadcast to send a message to both streams
+or M-x emacsconf-stream-set-news to send a message to one stream.
+
+If that doesn&rsquo;t work, edit the news file directly with:
+`ssh emacsconf-$TRACK@res.emacsconf.org > ~/news.txt`
+
+If that doesn&rsquo;t work, use the VNC session to switch to an Emacs window
+and type your message in.
+
+
+#### Kill the VNC server:
+
+ssh emacsconf-$TRACK@res.emacsconf.org &ldquo;vncserver -kill&rdquo;
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">~/bin/track-obs</td>
+<td class="org-left">start OBS with the track&rsquo;s profile and scene collection</td>
+</tr>
+
+
+<tr>
+<td class="org-left">~/bin/track-mpv file.webm</td>
+<td class="org-left">play the file using the track&rsquo;s sink</td>
+</tr>
+</tbody>
+</table>
+
+
+#### Making OBS scenes
+
+Making OBS scenes is pretty straightforward as you can move the
+different blocks on your scene in the preview window. However, it’s
+important to make sure that your video-captures and your overlays are
+snapping properly to the edges of the view-port. To do this, make sure
+to right-click on the block inside the preview window, and try the
+different fitting options (fit by width, height, etc.) until you find
+one that works best.
+
+We’ll probably be streaming at 720p, but since we’re also considering
+a 1080p update, try to create your overlays in a format or a resolution
+that would support resizing.
+
+
+### Other notes
+
+There are sockets in the home directory for MPV control if you want to keep that process.
+echo &rsquo;{ &ldquo;command&rdquo;: [&ldquo;loadfile&rdquo;, &ldquo;test2.webm&rdquo;] }&rsquo; | socat - ~/mpv-socket-emacsconf-dev
+
+
+### DONE Test and document command-line way of managing audio :sachac:
+
+
+### DONE Move my conf.org setup to res so that we can control everything from there
+
+
+### DONE Set timers for changing todo state
+
+ (defun emacsconf-schedule-test-buffer (info)
+ (mapcar (lambda (o) (plist-put o :buffer "1") o) info))
+ (let ((emacsconf-schedule-strategies '(emacsconf-schedule-test-buffer)))
+ (emacsconf-stream-schedule-timers (emacsconf-schedule-prepare
+ (emacsconf-schedule-inflate-sexp
+ `(("Test gen" :start ,(format-time-string "%Y-%m-%d %H:%M"
+ (time-add (current-time) (seconds-to-time 60))))
+ (journalism :time "1")
+ (school :time "2")
+ (handwritten :time "1")
+ ("Test dev" :start ,(format-time-string "%Y-%m-%d %H:%M"
+ (time-add (current-time) (seconds-to-time 60))))
+ (treesitter :time "2")
+ (lspbridge :time "1")
+ (asmblox :time "1"))))))
+
+the dev one worked, but the gen one gets
+Couldn’t find local shell prompt for /bin/sh
+Tramp: Opening connection **Async Shell Command** for emacsconf-gen@res.emacsconf.org using ssh&#x2026;failed
+
+Maybe I need to stagger them, or maybe I need to use a shell command.
+Changed to call ssh directly instead of using tramp.
+
+
+### DONE Figure out how to work with the layout
+
+<https://i3wm.org/docs/layout-saving.html>
+
+
+### DONE Allow per-track configuration of todo hooks :sachac:
+
+emacsconf-todo-hooks
+
+
+### CANCELLED Use xdotool to automate joining BBB in Firefox (signing in, clicking on listen only)
+
+
+#### DONE Xdotool over ssh so that I can click things?
+
+
+### CANCELLED Experiment with sharing part of the screen so that there&rsquo;s space for us to work a little off-screen
+
+We might just have to rely on xdotool to move windows the way we want them
+Window fixes that didn&rsquo;t work
+
+- <https://obsproject.com/forum/threads/solved-window-capture-black-screen.47082/>
+- <https://www.reddit.com/r/obs/comments/kas5ka/obs_window_capture_xcomposite_black_screen/>
+
+
+### DONE Set up scenes and try them
+
+
+### DONE Set up text source for URL
+
+
+### DONE Create Ansible tasks for setting up sinks for MPV and Firefox for the streams, and adding the scenes appropriately
+
+
+### DONE See if I can even Ansible-up the rest of the tasks
+
+like starting up Firefox and mpv and everything
+
+
+### CANCELLED obs-websocket control of OBS on the server
+
+so that the streamer can adjust volume offscreen?
+
+
+### DONE document such that someone else could use/fix it
+
+
+### DONE recruit at least one more person to help operate the &ldquo;video bouncer&rdquo;
+
+
+### Other notes
+
+- bandali doesn&rsquo;t have much cognitive bandwidth at the moment, so we can keep things simple with OBS on laptops
+
+- Issue: zaeph was dropping frames and couldn’t pay attention to as many things as he wanted
+- Issue: corwin needs assistance to not be locked in his chair for the whole conf. Premptively, zaeph can do it by broadcasting OBS scenes via the rtmp (instead of just his webcam).
+- With a long day, we may want to be able to schedule hosts/streamers/publishers in shifts
+- Ideal: Easy reproducible setup to spin up an OBS VM with scenes set up, allowing multiple users to connect to it at the same time. Maybe x2go or vnc? VMs with 8 vCPUs and a vGPU cost more, so it would be good to figure out what&rsquo;s needed, spin it down, and then spin it up maybe the day before or something like that.
+- Plus points if we can control the OBS via password-protected websocket so we can tell it to switch scenes (and even more points if we do so from Emacs, maybe via that obs-websocket.el ;) ). MPV is also controllable via IPC, so we can use the same MPV player and then switch videos around. Maybe mpvc? <https://unix.stackexchange.com/questions/664728/how-can-i-control-mpv-in-command-line>
+- Probably Linode&rsquo;s Dedicated 32 GB + RTX6000 GPU x1 at $1.50 an hour for 2-3 days + dev time, since live.emacsconf.org is in Linode as well
+- We should also look into normalization across the board, especially if we have BBB participants. pipewire + easyeffects on the box might be the easiest way to do it.
+
+- <https://docs.vdo.ninja/>
+- Live Streaming using low configuration vps <https://www.youtube.com/watch?v=3iBYYgkG1eM&t=953>
+- <https://snowmix.sourceforge.io/Examples/input.html>
+- <https://www.google.com/url?sa=t&source=web&rct=j&url=https://m.youtube.com/watch%3Fv%3D1y-DUYiECWQ&ved=2ahUKEwjPru_TqOv6AhVMkokEHXL9Dm4QtwJ6BAgqEAI&usg=AOvVaw17mbCEiFL6dGVY4YEBufcy>
+- [OBS Studio 26.0 | Hacker News](https://news.ycombinator.com/item?id=24633139)
+- <https://github.com/mviereck/x11docker#sound>
+- <https://vcs.fsf.org/?p=streamdesktop.git;a=tree>
+- <https://opensource.com/article/20/5/conference-free-software>
+- <https://github.com/soonum/hubangl>
+- <https://obsproject.com/forum/threads/run-obs-on-vm-in-the-cloud.122543/>
+
+
+### DONE Automate in-between display?
+
+[Think about what to do with schedule gaps due to cancelled talks](file:///home/sacha/proj/emacsconf/wiki/2022/organizers-notebook/index.md)
+
+emacsconf-stream-display-clock-and-countdown
+
+
+#### SOMEDAY Redo in-between slides
+
+
+#### DONE Automatically display in-between slide if there&rsquo;s no recorded intro
+
+Okay, what&rsquo;s the tricky part here?
+
+todo status triggers playing, so things have to be non-interactive
+intro needs to be manual
+
+- if manual intro
+ - open the in-between page
+ - streamer types &ldquo;play slug&rdquo; manually
+- if recorded intro
+
+Gen:
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">recorded intro</td>
+<td class="org-left">live intro</td>
+</tr>
+
+
+<tr>
+<td class="org-left">recorded talk</td>
+<td class="org-left"><span title="(emacsconf-stream-play-intro &quot;school&quot;)">school</span>; play automatically</td>
+<td class="org-left"><span title="(emacsconf-stream-play-intro &quot;workflows&quot;)">workflows</span>; show in-between, host intros over mumble, streamer types &ldquo;play slug&rdquo;</td>
+</tr>
+
+
+<tr>
+<td class="org-left">live talk</td>
+<td class="org-left"><span title="(emacsconf-stream-play-intro &quot;journalism&quot;)">journalism</span>; play intro automatically, join bbb</td>
+<td class="org-left"><span title="(emacsconf-stream-play-intro &quot;survey&quot;)">survey</span>; join bbb, no in-between slide</td>
+</tr>
+</tbody>
+</table>
+
+Dev:
+
+[async]((emacsconf-stream-play-intro "async"))
+
+
+#### DONE Make sure recorded intros play
+
+<(emacsconf-stream-play-talk-on-change "school")> should play intro + video
+<(emacsconf-stream-play-video "health")> should play video (no recorded intro)
+
+dev:
+<(emacsconf-stream-play-talk-on-change "treesitter")> should play intro + video
+
+
+### DONE Separate mumble audio so that panic button can still bring in our audio
+
+
+### DONE Prepare for rms talk and Q&A with bandali
+
+Mumble?
+
+
+#### DONE Reflow and edit VTT for RMS TEDx talk so that things are on one line
+
+<file:///home/sacha/proj/emacsconf/lisp/emacsconf-stream.el>
+
+
+### DONE Add panic button to OBS settings
+
+Ctrl-Shift-M?
+
+
+### DONE Add background music to server :emacsconf:
+
+zaeph suggests using shoshin&rsquo;s music
+
+if ! screen -list | grep -q background; then
+ screen -S track-mpv ~/stream/background.wav &
+fi
+
+
+### DONE Make it easy to rebroadcast other track (ex: rms) - might need mpv with minimal configuration, switchable profiles
+
+
+#### DONE make it easy to rebroadcast
+
+
+<a id="caption-workflow"></a>
+
+## DONE Smoothen captioning workflow :sachac:
+
+It looks like OpenAPI needs a little less editing in terms of
+capitalization and punctuation, but it produces longer captions
+(likely a 30-second sliding window). I&rsquo;ll try to upload both YT and
+OpenAPI captions so that people can decide what they like.
+
+[Set up MPV for captions](#mpv-captions)
+
+
+### DONE Make sure all the captioned files are marked so
+
+ (seq-keep (lambda (o)
+ (when (and (string= (plist-get o :status) "TO_STREAM")
+ (or (null (plist-get o :captions-edited))
+ (null (with-temp-buffer
+ (insert-file-contents
+ (expand-file-name (concat (plist-get o :video-slug) "--main.vtt")
+ emacsconf-cache-dir))
+ (goto-char (point-min))
+ (re-search-forward "captioned by" (line-end-position) t)))))
+ (plist-get o :slug)
+ ))
+ (emacsconf-get-talk-info))
+
+
+### DONE Edit survey captions
+
+
+### DONE Edit dbus captions
+
+
+### DONE Figure out why it&rsquo;s choking on SRV2
+
+Can I use aeneas for alignment instead?
+
+Reflow the .txt file and reupload to res if needed
+call ../run-aeneas.sh from the directory with the opus or ogg and the txt file
+
+sachac@res-https://emacsconf.org/2022/talks/~/current/meetups$ python3 -m aeneas.tools.execute\_task emacsconf-2022-meetups&#x2013;attending-and-organizing-emacs-meetups&#x2013;bhavin-gandhi&#x2013;main.opus reflowed.srt &ldquo;task\_language=eng|os\_task\_file\_format=json|is\_text\_type=subtitles&rdquo; output.json
+
+I might try out lhotse and torchaudio someday, but it&rsquo;s low priority. aeneas seems to do a reasonable job of
+
+
+### DONE Move publishing the backstage index to res so that we can trigger it after the files are uploaded
+
+
+### DONE Compare large, medium, and small models
+
+12 threads
+
+Original file: 21:16 21 minutes
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-right">
+
+<col class="org-right">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-right">Hours</td>
+<td class="org-right">Mult</td>
+<td class="org-left">Notes</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="https://media.emacsconf.org/2022/backstage/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--large.vtt">Large</a></td>
+<td class="org-right">2:49</td>
+<td class="org-right">8</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="https://media.emacsconf.org/2022/backstage/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--medium.vtt">Medium</a></td>
+<td class="org-right">2:03</td>
+<td class="org-right">5.9</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+
+
+<tr>
+<td class="org-left"><a href="https://media.emacsconf.org/2022/backstage/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--small.vtt">Small</a></td>
+<td class="org-right">0:40</td>
+<td class="org-right">2</td>
+<td class="org-left">More run-on sentences</td>
+</tr>
+</tbody>
+</table>
+
+Large and medium might do better on a system with a GPU. I&rsquo;ll default to the small model for now.
+
+
+### DONE Commit subed-tsv so that people can try a cleaner output
+
+
+### DONE Investigate more granular timestamps for the output from OpenAPI Whisper
+
+<https://git.emacsconf.org/emacsconf-ansible/tree/roles/caption/templates>
+
+
+### DONE Upload srv2 from YouTube for word-level
+
+
+### CANCELLED Compare with Google Cloud Speech API
+
+~/code/speech
+
+
+### DONE E-mail for bringing new captioning volunteers onboard
+
+ (defun emacsconf-mail-backstage-intro (volunteer &optional template)
+ (interactive (list (emacsconf-complete-volunteer)))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "backstage-intro"))
+ (assoc-default "EMAIL" volunteer 'string=)
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :conf-name emacsconf-name
+ :year emacsconf-year
+ :name (assoc-default "NAME_SHORT" volunteer 'string=)
+ :email (assoc-default "EMAIL" volunteer 'string=))))
+
+
+#### Template
+
+Hi ${name}!
+
+Thank you for volunteering for ${conf-name} ${year}!
+
+We&rsquo;ve set up ${backstage} as the backstage area where you can view the
+videos and resources uploaded so far. You can access it with the
+username "${backstage-user}&ldquo; and the password &rdquo;${backstage-password}&ldquo;.
+Please keep the backstage password and other speakers&rsquo; talk resources
+secret.
+
+For some ideas on ways to help, you can check out
+<https://emacsconf.org/2022/volunteer/> . You can also suggest other
+things you might be interested in.
+
+You can ask questions or chat with other volunteers by e-mailing the
+mailing list at emacsconf-org@gnu.org or dropping by #emacsconf on the
+libera.chat IRC network. You can also e-mail me or
+emacsconf-org-private@gnu.org if you have private questions.
+
+Thank you again for your help! =)
+
+Sacha Chua
+
+
+### DONE E-mail for bringing new captioning volunteers onboard
+
+ (defun emacsconf-mail-captioning-intro (volunteer &optional template)
+ (interactive (list (emacsconf-complete-volunteer)
+ (emacsconf-mail-merge-get-template "captioning-intro")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "captioning-intro"))
+ (assoc-default "EMAIL" volunteer 'string=)
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :conf-name emacsconf-name
+ :year emacsconf-year
+ :name (assoc-default "NAME_SHORT" volunteer 'string=)
+ :email (assoc-default "EMAIL" volunteer 'string=))))
+
+
+#### Template
+
+Hi ${name}!
+
+Thank you for volunteering to help with the captions for ${conf-name}
+${year}! Last year, we were able to get almost all the talks captioned
+in time for streaming. Participants found them very useful for
+understanding different technical terms, names, accents, and so on.
+We&rsquo;d love to be able to pull that off again this year, and it would be
+great to have you on board.
+
+We&rsquo;ve set up ${backstage} as the backstage area where you can view the
+videos and resources uploaded so far. You can access it with the
+username "${backstage-user}&ldquo; and the password &rdquo;${backstage-password}&ldquo;.
+Please keep the backstage password and resources secret. If you see a
+talk that you&rsquo;d like to caption, you can e-mail me at
+sacha@sachachua.com and I can reserve it for you. Then you can correct
+any misrecognized words, fix capitalizations, remove filler words as
+needed, and so on.
+
+You&rsquo;ll probably want to work with either the VTT or the TXT versions
+(VTT is WebVTT format and has timestamps), but you can check the other
+talk resources in case the speaker has posted scripts or other useful
+things. Both VTT and TXT are plain text, so feel free to use your
+favourite text or subtitle editor. I&rsquo;ve posted a brief demo of how I
+edit captions at
+<https://media.emacsconf.org/2022/backstage/editing-captions.html> , and
+you can find more captioning tips at <https://emacsconf.org/captioning/>
+. You can convert it to whatever format you like. If you prefer to
+work with plain text, we can figure out the timestamps afterwards.
+
+Let me know if you want to reserve a talk for captioning or if you have
+any questions or suggestions. We&rsquo;re also in the #emacsconf-org channel
+on the libera.chat IRC network, which you can connect to with your
+favourite IRC client or through the web-based interface at
+<https://chat.emacsconf.org/> .
+
+Sacha Chua
+
+
+### DONE Support cue IDs in subed-vtt.el
+
+
+### CANCELLED jiwer · PyPI - measure error rate
+
+<https://pypi.org/project/jiwer/>
+
+
+### SOMEDAY Think about flow for YouTube captions
+
+are they at the right length?
+
+
+### DONE Check captions for rms talk
+
+
+### TODO Try whisper.cpp
+
+commented out `-mavx` to get it to compile in Debian on res
+
+ffmpeg -y -i emacsconf-2022-rmsted&#x2013;main.ogg -acodec pcm\_s16le -ac 1 -ar 16000 emacsconf-2022-rmsted&#x2013;main.wav
+/usr/src/whisper.cpp/main -f emacsconf-2022-rmsted&#x2013;main.wav -m models/ggml-large.bin -ovtt -otxt
+
+
+### DONE edit rms tedx captions, they&rsquo;re not actually edited!
+
+
+### DONE realign subtitles if needed, looks like aeneas options need tweaking
+
+ (seq-keep
+ (lambda (file)
+ (let ((subtitles (subed-parse-file file))
+ gaps)
+ (while (cdr subtitles)
+ (setq gaps (cons (- (elt (cadr subtitles) 1) (elt (car subtitles) 2))
+ gaps))
+ (setq subtitles (cdr subtitles)))
+ ;; if there are gaps more than
+ (let ((big-gaps (seq-filter (lambda (gap) (> gap 100)) gaps)))
+ (when big-gaps
+ (list (file-name-base file)
+ (length big-gaps)
+ (apply #'max big-gaps)))))
+ )
+ (directory-files emacsconf-cache-dir t "--main.vtt$")
+ )
+
+
+### SOMEDAY ggerganov/whisper.cpp: Port of OpenAI&rsquo;s Whisper model in C/C++
+
+<https://github.com/ggerganov/whisper.cpp>
+
+
+### TODO Move the captioning stuff to the public area
+
+
+### TODO Look into getting the confidence intervals out of aeneas, maybe by getting it as an XML
+
+Also look into finetuneas
+
+
+### SOMEDAY A Deep Dive Exploration Applying OpenAI’s Whisper ASR To A PBS NewsHour Broadcast – The GDELT Project
+
+<https://blog.gdeltproject.org/a-deep-dive-exploration-applying-openais-whisper-asr-to-a-pbs-newshour-broadcast/>
+
+
+### SOMEDAY Confidence scores for each word? - Discussion #284 - openai/whisper
+
+<https://github.com/openai/whisper/discussions/284>
+
+
+### SOMEDAY jianfch/stable-ts: Stabilizing timestamps of OpenAI&rsquo;s Whisper outputs down to word-level
+
+<https://github.com/jianfch/stable-ts>
+
+
+### SOMEDAY See if we can get confidence data out of whisper
+
+
+### SOMEDAY Use bbb events to identify speaker changes and overlapping spans that might need closer attention
+
+
+### SOMEDAY Getting Started with Bacalhau | Bacalhau Docs
+
+<https://docs.bacalhau.org/getting-started/installation>
+
+
+### SOMEDAY Use OpenAI Whisper and Bacalhau to transcribe audio and video files | Nerd For Tech
+
+<https://medium.com/nerd-for-tech/how-to-use-bacalhau-and-openai-whisper-to-transcribe-a-youtube-video-7b6ee0135ce2>
+
+
+### SOMEDAY A Deep Dive Exploration Applying OpenAI’s Whisper ASR To A Russian Television News Broadcast – The GDELT Project
+
+<https://blog.gdeltproject.org/a-deep-dive-exploration-applying-openais-whisper-asr-to-a-russian-television-news-broadcast/>
+
+
+### SOMEDAY Benchmarks for T4 & V100 GPUs, comparison with human captioning, and deep dive on non-deterministic output · Discussion #395 · openai/whisper
+
+<https://github.com/openai/whisper/discussions/395>
+
+
+### SOMEDAY Pointers for running this on a GPU via a cloud service? · Discussion #398 · openai/whisper
+
+<https://github.com/openai/whisper/discussions/398>
+
+
+### SOMEDAY How to chunk text into paragraphs using python | by N Polovinkin | Medium
+
+<https://medium.com/@npolovinkin/how-to-chunk-text-into-paragraphs-using-python-8ae66be38ea6>
+
+
+## DONE Find a way to accommodate a specific return-speaker
+
+We’re not sure if we’re going to get a presentation or a prerec for them
+this year, but we need to keep this at the back of our minds.
+
+Note on how DebConf handled incidents:
+<https://www.mail-archive.com/search?l=debconf-team@lists.debian.org&q=subject:%22Re%5C%3A+DebConf+21+Incident+Response%22&o=newest&f=1>
+
+
+## DONE Write check-in email :sachac:
+
+
+### DONE Switch all the rooms to allow anyone to start them - one less step for the check-in person
+
+ //list = [...document.querySelectorAll('.room-name-editable')].filter((o) => o.value.match(/^ec22-(sat|sun)/));
+ card = document.querySelector('a[href=\"%s\"] .card-body');
+ card.querySelector('.item-action.dropdown a').click()
+ card.querySelector('.update-room').click()
+ if (!document.querySelector('#room_anyone_can_start').checked) {
+ document.querySelector('#room_anyone_can_start').click();
+ }
+ document.querySelector('.update-only.create-room-button').click();
+
+okay, next thing, it automatically refreshes. so I can&rsquo;t run the whole Javascript, I need to xdotool it.
+
+ (setq list (mapcar (lambda (o) (plist-get o :bbb-room)) (emacsconf-get-talk-info)))
+ (setq list (seq-drop list (seq-position list "https://bbb.emacsverse.org/b/sac-rvc-kd2-pev")))
+ (progn
+ (setq item (pop list))
+ (when (string-match "/b/\\(.*\\)" item)
+ (kill-new (format "card = document.querySelector('a[href=\"%s\"] .card-body');
+ card.querySelector('.item-action.dropdown a').click()
+ card.querySelector('.update-room').click()
+ if (!document.querySelector('#room_anyone_can_start').checked) {
+ document.querySelector('#room_anyone_can_start').click();
+ }
+ document.querySelector('.update-only.create-room-button').click();
+ "
+ (match-string 0 item)))
+ (sleep-for 2)
+ (shell-command "xdotool key alt+Tab")))
+
+Relying on xdotool seems a little fragile. Let&rsquo;s just check the page
+itself for the next one that needs to be done.
+
+ list = [...document.querySelectorAll('.room-name-editable')].filter((o) => o.value.match(/^ec22-(sat|sun)/));
+ list.reduce(async(prev, elem) => {
+ await prev;
+ if (!sessionStorage.getItem(elem.value)) {
+ return new Promise((resolve, reject) => {
+ card = elem.closest('.card-body');
+ card.querySelector('.item-action.dropdown a').click();
+ card.querySelector('.update-room').click();
+ sessionStorage.setItem(elem.value, true);
+ setTimeout(function() {
+ if (!document.querySelector('#room_anyone_can_start').checked) {
+ document.querySelector('#room_anyone_can_start').click();
+ document.querySelector('.update-only.create-room-button').click();
+ } else {
+ document.querySelector('#createRoomModal').click();
+ }
+ resolve(true);
+ }, 500);
+ });
+ }
+ });
+
+
+### DONE Update checkin instructions
+
+
+### Templates
+
+Goals:
+
+- Ask speaker verify their scheduled time
+ It has already been confirmed with them, but it might have changed slightly
+ - HOW: They should check the time at the top of their talk page on the day of the conference
+- Double-check Q&A preference, encourage tech checks for live talks/Q&A
+ - If they are available:
+ - Direct to tech-checks via <https://emacsconf.org/${year}/prepare/>
+ - Inform them of the check-in process
+ - They come say hi to us 30&rsquo; before their session in #emacsconf-org or #emacsconf (they can use chat.emacsconf.org )
+ - We get them set up in a room where they can wait until the end of the broadcast of their pretention
+ - They’re joined by the streamer and host.
+- Warning about potential emergency changes
+
+Slightly more complex because of the conditionals
+
+ (defun emacsconf-mail-checkin-instructions (group &optional template)
+ "Send checkin instructions.
+ GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group
+ (seq-filter
+ (lambda (o)
+ (or
+ (string= (plist-get o :status) "CANCELLED")
+ (null (plist-get o :email))
+ (string-match "after" (or (plist-get o :q-and-a) ""))))
+ (emacsconf-get-talk-info)))))
+ (let* ((talks (seq-remove
+ (lambda (o)
+ (or
+ (string= (plist-get o :status) "CANCELLED")
+ (null (plist-get o :email))
+ (string-match "after" (or (plist-get o :q-and-a) ""))
+ (save-window-excursion
+ (emacsconf-with-talk-heading o
+ (re-search-forward "checkin instructions" (save-excursion (org-end-of-subtree)) t)))))
+ (cdr group)))
+ (waiting-talks (seq-find (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC")) talks)))
+ (when talks
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "checkin-at-conf"))
+ (car group)
+ (list
+ :year emacsconf-year
+ :base-url emacsconf-base-url
+ :conf-name emacsconf-name
+ :email (plist-get (car talks) :email)
+ :emergency emacsconf-emergency-contact
+ :plural (if (> (length (cdr group)) 1) "s" "")
+ :speakers-short (plist-get (car talks) :speakers-short)
+ :url (mapconcat (lambda (o) (concat emacsconf-base-url (plist-get o :url)))
+ talks" , ")
+ :waiting
+ (cond
+ ((> (length waiting-talks) 1)
+ " If you can upload your talk videos before the conference, I think that might be much less stressful for everyone than doing it live. =) Please note that we will turn off the web-based upload on Dec 1 to free up memory on the server, so please upload them as early as you can.${wrap}")
+ ((= (length waiting-talks) 1)
+ " If you can upload your talk video before the conference, I think that might be much less stressful for everyone than doing it live. =) Please note that we will turn off the web-based upload on Dec 1 to free up memory on the server, so please upload it as early as you can.${wrap}")
+ (t ""))
+ :checkin-info
+ (mapconcat
+ (lambda (o)
+ (let ((base-checkin (format-time-string "%b %-d %-l:%M %p" (plist-get o :checkin-time) emacsconf-timezone))
+ (speaker-checkin (format-time-string "%b %-d %-l:%M %p" (plist-get o :checkin-time) (plist-get o :timezone))))
+ (emacsconf-replace-plist-in-string
+ (append (list :base-url emacsconf-base-url
+ :check-in
+ (concat
+ "Before "
+ base-checkin " in " emacsconf-timezone
+ (if (string= base-checkin speaker-checkin)
+ ""
+ (concat
+ ", which is the same as " speaker-checkin " in " (plist-get o :timezone))) "\n"
+ " (this is " (plist-get o :checkin-label) ")")
+ :qa-info-speakers
+ (cond
+ ;; aaaaah, no prerec yet
+ ((string= (plist-get o :status) "WAITING_FOR_PREREC")
+ (concat "Talk and Q&A BigBlueButton room: " (plist-get o :bbb-room)))
+ ((null (plist-get o :q-and-a)) "")
+ ((string-match "live" (plist-get o :q-and-a)) (concat "Q&A BigBlueButton room: " (plist-get o :bbb-room)))
+ ((string-match "irc" (plist-get o :q-and-a)) (concat "Q&A: " (plist-get o :channel) " (" (plist-get o :webchat-url) ")"))
+ ((string-match "pad" (plist-get o :q-and-a)) "Q&A: On the pad")
+ (t "Q&A: After the event")))
+ o)
+ "- ${title}
+ Info and sched: ${base-url}${url}
+ Check-in: ${check-in}
+ Pad: ${pad-url}
+ ${qa-info-speakers}")))
+ talks "\n\n")))
+ (mapc (lambda (o)
+ (emacsconf-mail-log-message-when-sent o "Sent checkin instructions"))
+ talks))))
+
+
+#### E-mail for speakers who are planning to be at the conference
+
+Hello, ${speakers-short}!
+
+We&rsquo;re looking forward to having you join us at EmacsConf!
+
+We&rsquo;ve updated the schedule based on the submissions and cancellations,
+and we&rsquo;ll probably update the schedule even on the day of the
+conference. You can get a rough idea of your schedule on your talk
+page${plural}. You might want to check your talk page${plural} some time next
+week to get a rough sense of where it is, and then check it again on
+the day of your talk${plural}. Please let me know if the times don&rsquo;t
+work for you.
+
+We&rsquo;ll try our best to keep your talk in the same general timeslot (ex:
+Saturday morning, Saturday afternoon, Sunday morning, Sunday
+afternoon). We&rsquo;ve done some dry-runs, but just in case it turns out
+that running two tracks at the same time leaves us too frazzled, we
+may drop back to one track with Q&A on an alternate stream, like last
+year. If there are big changes to your schedule on the day of your
+talk${plural}, you&rsquo;ll get an e-mail from us with a subject like
+&ldquo;URGENT: EmacsConf 2022: &#x2026;&rdquo;.${wrap}
+
+Here&rsquo;s your talk page URL and checkin information:
+
+${checkin-info}
+
+Please check in early so that we can deal with scheduling changes or
+technical issues, and so that we don&rsquo;t worry too much about whether
+you&rsquo;ll be ready to go for Q&A. =) You can find the check-in process at
+${base-url}${year}/speakers/ .${waiting}
+
+If something comes up, please let us know as soon as you can. Here&rsquo;s
+my emergency contact information: ${emergency}
+
+Thank you for sharing your time and energy with the EmacsConf community!
+
+Sacha
+
+p.s. If you need to cancel, that&rsquo;s okay too, life happens. Let me know
+as soon as you can and I&rsquo;ll try to shuffle things around. Thank you!
+
+
+#### E-mail for speakers who are not planning to be around, but who have sent us their prerecs
+
+Hello, ${name}!
+
+Thank you so much for contributing a talk for EmacsConf ${year}! We&rsquo;re
+looking forward to collecting questions and forwarding them to you by
+e-mail after the conference. We&rsquo;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&rsquo;ll let people know
+you&rsquo;re around. You can find the check-in process at
+<https://emacsconf.org/${year}/speakers/> .
+
+Thank you again for being part of EmacsConf ${year}!
+
+Sacha
+
+
+### CANCELLED Draft e-mail to send speakers who may need to do it live
+
+
+### DONE Make sure IRC talks get BBB checkin information if they need to do it live :mail:
+
+survey, orgyear, lspbridge, eev, python
+
+
+<a id="one-track"></a>
+
+## Plan in-case-of-emergency schedule for dropping back to one track after Saturday morning :sachac:derisk:
+
+We might be able to do it on a modular basis (Saturday afternoon, Sunday morning, or Sunday afternoon).
+We need a quick way to notify the affected speakers, and we should give them a heads-up as well.
+We also need a quick way to update the schedule.
+
+
+### DONE Update conf.org and the wiki based on the selected emergency schedule
+
+
+### DONE Give speakers a heads-up regarding schedule tweaks and the potential for bigger schedule changes
+
+
+### DONE Draft the code for mailing all the affected speakers
+
+
+### Saturday afternoon
+
+- ![img](emergency-back-to-one-sat-pm.svg)
+
+
+### Sunday morning
+
+- rms: Ends at 12:15 after 12:00
+- ![img](emergency-back-to-one-sun-am.svg)
+
+
+### Sunday afternoon
+
+- ![img](emergency-back-to-one-sun-pm.svg)
+
+
+### DONE Get the emergency schedule sorted out so that we can easily switch to it
+
+To change, set emacsconf-schedule-apply to t
+M-x emacsconf-update-schedule
+Commit the wiki and push it
+Draft the e-mail for emergency schedule
+
+
+### DONE Draft e-mail for emergency schedule
+
+ (defun emacsconf-mail-emergency-update (group &optional template)
+ "Send emergency schedule update.
+ GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (setq template (or template (emacsconf-mail-merge-get-template "emergency")))
+ (emacsconf-mail-prepare
+ template
+ (car group)
+ (list
+ :urls (mapconcat (lambda (o) (plist-get o :absolute-url)) (cdr group) " , ")
+ :emergency emacsconf-emergency-contact
+ :conf-name emacsconf-name
+ :year emacsconf-year
+ :email (plist-get (cadr group) :email)
+ :plural (if (= (length (cdr group)) 1) "" "s")
+ :schedule
+ (mapconcat
+ (lambda (o)
+ (concat "Talk: " (plist-get o :title) "\n"
+ "URL: " (plist-get o :absolute-url) "\n"
+ "New start of talk: "
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ emacsconf-timezone)
+ "\n"
+ (if (string= emacsconf-timezone (plist-get o :timezone))
+ ""
+ (concat
+ "which is the same as "
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ (plist-get o :timezone))))))
+ (cdr group)
+ "\n\n"))))
+
+
+#### Template
+
+Sorry about the last-minute change. We needed to update the schedule
+because two tracks turned out to be too much for us to handle at the
+moment. The new schedule will play all the talks on one stream, and
+the other stream will handle Q&A.
+
+Here&rsquo;s a copy of the updated schedule for your convenience:
+${schedule}
+
+Please check in at least 30 minutes before your talk (or 60 minutes if
+you&rsquo;re going to do it live). <https://emacsconf.org/2022/speakers/> has
+more details.
+
+You can also find the new schedule at the page URL${plural} above.
+Please let me know if you can&rsquo;t make it. We can collect the questions
+and you can follow up afterwards. You can reach me by e-mail or in
+\#emacsconf-org on IRC, or with this emergency contact info:
+${emergency}
+
+Thank you for your patience!
+
+Sacha
+
+
+## DONE Manage front0 and live0 size :bandali:
+
+
+### DONE Resize front0 and live0 in the Linode administration console :bandali:
+
+[20:23:48] <bandali> aha okay thanks. yeah i think i&rsquo;ll do at least 8gb or 16gb for front0, maybe even one or two larger
+[20:24:19] <bandali> and for live0 probably the same as last year, maybe slightly larger
+
+
+### CANCELLED Check fps after resize :sachac:
+
+
+### DONE Back up dumps from live0
+
+media.emacsconf.org:~/emacsconf-2021-stream-dumps/
+res.emacsconf.org:/data/emacsconf/2021/dumps/
+
+Now there should be more space in case we want to enable dumping before the resize
+
+
+### DONE Update ansible configuration :sachac:
+
+Waiting for resize
+Clean up the media root
+
+in all.yml
+
+test\_mode: false
+
+then
+
+ansible-playbook -i inventory.yml prod-playbook.yml &#x2013;tags media
+ansible-playbook -i inventory.yml prod-playbook.yml &#x2013;tags stream
+ansible-playbook -i inventory.yml prod-playbook.yml &#x2013;tags publish
+
+Confirm that
+
+- icecast dumps recordings
+- <https://media.emacsconf.org/2022> is unprotected
+- <https://media.emacsconf.org/2022/backstage> is protected
+
+
+<a id="comms"></a>
+
+# Communications
+
+
+## DONE Ask emacsconf-org-private for feedback on early submissions
+
+The EmacsConf 2022 CFP was extended to Sept 30 with notifications to
+go out on Oct 15. We&rsquo;ve got plenty of submissions and with any luck,
+you&rsquo;ve been reviewing them as they come in (assuming you have access to
+emacsconf-submit@).
+
+As a courtesy to people who got their stuff together in a timely manner
+and to give them extra time to prepare a prerecorded talk (which might
+also translate into extra time for us to process and caption the talks),
+I&rsquo;d like to send acceptances and tentative time allotments by Sept 30.
+I plan to offer a max of 20 minutes with a note that additional time may
+be available for Q&A depending on how many additional submissions we get.
+
+Could everyone who wants a say in the program please add comments to
+$url by ****Sept 26**** so that we can send out early acceptances? In
+general, we try to say yes to everything, so here&rsquo;s your chance to
+raise any red flags or suggest ways to make things even better.
+Thanks!
+
+Sacha
+
+
+<a id="acceptance"></a>
+
+## DONE Acceptance :sachac:
+
+We can accept early or send people a note saying notification of acceptance will be on Oct 15, because of the extended CFP.
+Right before this e-mail:
+
+- Publish the wiki pages
+
+Objectives for this e-mail:
+
+- Notify people of acceptance
+- Tell them the number of minutes to plan for\* (might get more)
+- Tell them about the target date
+- Get them to reply
+- Ask for public contact information or any changes to the wiki page
+
+
+ (defun emacsconf-draft-acceptance-for-email-group (group &optional template)
+ "GROUP is (email . (talk talk))."
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (let* ((template (or template (emacsconf-mail-merge-get-template "acceptance")))
+ (talks (cdr group))
+ (first (car talks))
+ (reply-by-date (date-to-time "2022-10-08"))
+ (prerec-target (date-to-time "2022-11-04"))
+ (attrs `(:speakers-short
+ ,(plist-get first :speakers-short)
+ :plural
+ ,(if (= (length talks) 1) "" "s")
+ :email
+ ,(plist-get first :email)
+ :year
+ ,(or (plist-get first :year) emacsconf-year)
+ :reply-date
+ ,(format-time-string "%b %-e (%a)" reply-by-date)
+ :titles
+ ,(mapconcat (lambda (o) (format "\"%s\" (%s)"
+ (plist-get o :title)
+ (plist-get o :slug)))
+ talks " and ")
+ :prerec-target
+ ,(format-time-string "%b %-e (%a)" prerec-target)
+ :page-urls
+ ,(mapconcat (lambda (o) (concat "- " (plist-get o :url)))
+ talks "\n")
+ :irc
+ ,(if (plist-get first :irc) (concat (plist-get first :irc) "? ") "")
+ :acceptance-tasks
+ ,(concat
+ "* TODO Reply to acceptance e-mail in order to confirm e-mail communication :emacsconf:
+ DEADLINE: " (format-time-string "<%Y-%m-%d %a>" reply-by-date) "\n Please include any extra information you want (ex: public e-mail, IRC nick) on\n"
+ (mapconcat (lambda (o) (concat " " (plist-get o :url)))
+ talks "\n") "\n"
+ (mapconcat (lambda (o) (format "* TODO Record %s-minute talk for \"%s\" (%s) :emacsconf:
+ DEADLINE: %s\n https://emacsconf.org/%s/prepare/"
+ (plist-get o :time)
+ (plist-get o :title)
+ (plist-get o :slug)
+ (format-time-string "<%Y-%m-%d %a>" prerec-target)
+ (plist-get o :year)))
+ talks "\n"))
+ :talk-details-and-comments
+ ,(mapconcat
+ (lambda (o)
+ (format "%s minutes: %s\n%s\n\n%s"
+ (plist-get o :time)
+ (plist-get o :title)
+ (plist-get o :url)
+ (string-fill (emacsconf-replace-plist-in-string
+ (append o
+ (list
+ :prerec-target (format-time-string "%b %-e" prerec-target)))
+ (plist-get o :acceptance-comment)) 72)))
+ talks "\n---------------------------------------------------------------------\n"))))
+ (emacsconf-mail-prepare template (car group) attrs)))
+
+ (defun emacsconf-draft-all-acceptances ()
+ (interactive)
+ (let* ((emacsconf-talk-info-functions (append emacsconf-talk-info-functions '(emacsconf-get-talk-comments-from-subtree)))
+ (info (seq-filter (lambda (o) (string= (plist-get o :status) "TO_ACCEPT"))
+ (emacsconf-filter-talks (emacsconf-get-talk-info))))
+ (grouped (seq-group-by (lambda (o) (plist-get o :email)) info))
+ (template (emacsconf-mail-merge-get-template "acceptance")))
+ (mapc (lambda (group)
+ (emacsconf-draft-acceptance-for-email-group group template))
+ grouped)))
+
+
+### Speaker acceptance
+
+Hi, ${speakers-short}!
+
+Summary:
+,${acceptance-tasks}
+
+We&rsquo;ve accepted your EmacsConf proposal${plural} for ${titles}! Thanks
+for volunteering to share what you&rsquo;re learning about. I know it takes
+a fair bit of work to prepare a presentation, so I appreciate that
+you&rsquo;re taking the time to show what&rsquo;s possible with Emacs and
+encourage people to learn more.
+
+---
+
+${talk-details-and-comments}
+
+---
+
+You&rsquo;ll have some time after your talk${plural} for Q&A, so the allocated time
+can be just for your pre-recorded talk${plural}. Of course, if you like, you
+can make it shorter.
+
+We&rsquo;ve posted preparation tips at <https://emacsconf.org/${year}/prepare/> .
+We&rsquo;ll send you instructions on how to upload files once we get that
+set up.
+
+Could you please plan to ****put your pre-rec${plural} together by
+${prerec-target}**** (or even earlier if you want)? We&rsquo;re going to try
+to caption as many talks as possible again this year, and extra time
+helps a lot. People found the captions really helpful while watching
+the stream, and sending your talk in early will make it more likely
+that we&rsquo;ll be able to get your captions edited and reviewed before the
+conference.
+
+****Please reply to this e-mail by ${reply-date}**** (doublechecking that
+emacsconf-submit@gnu.org is in the To: or Cc:) so that we can confirm
+that we&rsquo;ve got the right email address for you and that messages can
+get properly delivered. Also, would you like us to put ${email} as the
+public contact information for you, or would you like us to add
+something else to the talk page${plural}?
+
+${page-urls}
+
+If you have any questions, please e-mail us at
+emacsconf-submit@gnu.org or pass by the #emacsconf-org IRC channel on
+irc.libera.chat (Web-based: <https://chat.emacsconf.org/#/connect>).
+
+Thank you so much!
+
+Sacha Chua
+
+
+## Future
+
+
+### Captions for approval
+
+
+#### Template
+
+Hi ${speakers-short}!
+
+Because you sent in your video before the conference, we were able to
+caption it so that more people can find and enjoy your talk.
+${captioner-volunteered} I&rsquo;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. You can look at the attached file or watch
+your video with closed captions at ${url} . I&rsquo;ve also included the
+captions at the end of this e-mail for your convenience.${wrap}
+
+${chapters-note}${intro-note}Do you have a bio or social/donation links you&rsquo;d like us
+to add to the wiki page for your talk?
+
+Thanks again for your contribution!
+
+${captioner-thanks}Sacha
+
+${captions}
+
+
+### Speakers we haven&rsquo;t confirmed e-mail communications with
+
+Hi, ${name}!
+
+I think we haven&rsquo;t heard from you since we accepted your EmacsConf
+${year} proposal for "${title}&ldquo;. EmacsConf coming up soon, so I wanted
+to check in with you to see how you&rsquo;re doing.
+
+Could you please e-mail us to let us know if you&rsquo;re still working on
+your prerecorded video, if you&rsquo;re planning to present live, or if you
+can&rsquo;t make it this year? No worries if other priorities have come up
+and you don&rsquo;t have the time for a presentation.
+
+If you&rsquo;ve been working on a presentation, fantastic! When you&rsquo;re
+ready, you can upload it following the instructions at
+<https://emacsconf.org/${year}/prepare/> (ideally before ${prerec-date} so
+that we have time to download it, doublecheck, etc.).
+
+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&rsquo;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 ${date}.** I&rsquo;m
+planning to shift the schedule around to give more time to confirmed
+speakers for Q&A and possibly live demos. If I don&rsquo;t hear from you by
+then (maybe an over-enthusiastic spam filter has been swallowing up
+all our mail?), I&rsquo;ll probably reallocate the ${time} 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 ${date}!
+
+Sacha Chua
+
+(Please use Reply to All to keep emacsconf-submit@gnu.org in the loop. Thanks!)
+
+
+### Speakers who are missing prerecs
+
+ (let ((template (conf-mail-merge-get-template "missing")))
+ (seq-map
+ (lambda (info)
+ (compose-mail (plist-get info :email)
+ (conf-replace-plist-in-string info (plist-get template :subject))
+ `(("Reply-To" . ,(plist-get template :reply-to))
+ ("Mail-Followup-To" . ,(plist-get template :mail-followup-to))
+ ("Cc" . ,(plist-get template :cc))))
+ (message-goto-body)
+ (insert (conf-replace-plist-in-string info (plist-get template :body)))
+ (plist-get info :email))
+ (mapcar 'cadr
+ (seq-group-by (lambda (o) (plist-get o :email))
+ (seq-filter (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC"))
+ (conf-get-talk-info))))))
+
+
+#### Template
+
+Hi ${speakers},
+
+EmacsConf is in a few days and I don&rsquo;t think we have your prerecorded
+video yet, so I&rsquo;m getting miiiildly stressed about the schedule. And
+you&rsquo;re probably stressing out about it too, so let&rsquo;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/${year}/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&rsquo;m a little
+worried about the potential for technical issues, since we&rsquo;ve had
+problems with that in previous EmacsConfs. The tight schedule means
+there&rsquo;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&rsquo;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;
+- 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/${year}/speakers> .
+ We keep adapting the schedule as things come up, so please check
+ <https://emacsconf.org/${year}/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&rsquo;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&rsquo;t make it, that&rsquo;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&rsquo;t hear from
+you, we&rsquo;ll probably reallocate the ${time} 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
+
+
+### Last email before the conference
+
+> Friends, emacsians, hackers, lend me your ears!
+>
+> This is it, the final stretch until the next EmacsConf. A couple of weeks
+> ago, we’ve shared our program with you; now, it is time for us to share our
+> schedule, i.e. when the talks will happen!
+>
+> You can find it on our wiki:
+> <https://emacsconf.org/$year/schedule/>
+>
+> All the times on the program are listed in EST (UTC-5). If a talk catches
+> your eye, we invite you to click on its title to find out at what time it will
+> be broadcast in your local time. Also, if the talk is pre-recorded, it will
+> also be the time at which the talk will be made available on the same page.
+
+
+### Thank you, next steps
+
+
+#### Code
+
+ (defun conf-mail-thanks-after-conference ()
+ (interactive)
+ (let* ((template (conf-mail-merge-get-template "speaker-thanks"))
+ (info (conf-get-talk-info-for-subtree)))
+ (compose-mail (plist-get info :email)
+ (conf-replace-plist-in-string
+ info (plist-get template :subject)))
+ (message-goto-body)
+ (save-excursion
+ (insert
+ (string-trim
+ (conf-replace-plist-in-string
+ (append
+ (list :subtitle-note
+ (if (file-exists-p (expand-file-name (format "%s/captions/%s--main.vtt"
+ (plist-get info :year)
+ (plist-get info :video-slug)) conf-directory))
+ "You can add the subtitles by downloading them from the talk page and uploading them to your video. "
+ "We didn't quite manage to squeeze in captions for your talk during the conference, but we'll work on those soon.")
+ :qa-note
+ (if (plist-get info :qa-public)
+ "The recording of your Q&A session is also on the talk page. "
+ "")
+ )
+ info)
+ (plist-get template :body)))))))
+
+
+#### Text
+
+Hi ${speakers-short}!
+
+Thank you so much for being part of EmacsConf ${year}! Hundreds of people
+enjoyed it, and I&rsquo;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&rsquo;ve added the questions and comments that we&rsquo;ve collected from
+IRC/BBB/Etherpad. ${qa-note}
+
+We&rsquo;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.
+${subtitle-note} If you let me know where you&rsquo;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 comments
+on videos.
+
+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!
+
+Sacha
+
+
+## Archive
+
+
+### DONE Second announcement: CFP
+
+Dear fellow Emacsians,
+
+This is the second and final Call for Participation for EmacsConf 2022
+now extended until September 30, and the conference itself planned for
+December 3 and 4 (Sat-Sun). Please see the CFP below for details on
+how to send in your proposal(s), or chat with us about them and about
+other ways of participating and volunteering around EmacsConf via our
+main IRC channel #emacsconf on the Libera.Chat network.
+
+If you&rsquo;re considering submitting a proposal but think the remaining
+time may not be enough, please reach out to me off-list as soon as
+possible so we could work something out.
+
+I&rsquo;ll close this portion of the email with a thank you to all of the
+folks who have submitted session proposals or expressed interest in
+volunteering with EmacsConf. We look forward to reading and reviewing
+all of your messages and proposals, and getting back to you about them
+and about the next steps soon. :-)
+
+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&rsquo;d on this message. Thank you.
+
+
+### DONE First announcement: CFP
+
+Dear fellow Emacsians,
+
+We are excitedly calling for your participation for EmacsConf 2022,
+planned for December 3 and 4, 2022 (Sat-Sun)! The CFP will be open
+until September 18. Please see below for details on how to send in
+your proposal(s), or chat with us about them and about other ways of
+participating and volunteering around EmacsConf via our main IRC
+channel #emacsconf on the Libera.Chat network.
+
+As an entirely volunteer-run conference we are always looking for more
+volunteers and organizers to help with various aspects of organizing
+and running the conference, including reviewing session proposals and
+streaming parallel tracks. To get involved, please come by our IRC
+channel or one of our public mailing lists (see below) and introduce
+yourself and tell us about your interests, or contact myself or one of
+the other organizers directly if you&rsquo;re feeling a bit shy; we hope to
+hear from you! :)
+
+Best,
+amin
+
+P.S. please direct any replies for this message either to me or to the
+emacsconf-discuss list, so as to help avoid generating extra off-topic
+chatter in the other lists Cc&rsquo;d on this message. Thank you.
+
+
+<a id="code"></a>
+
+# Supporting code
+
+
+## General
+
+ (defvar emacsconf-danger-allow-dangerous-stuff nil
+ "When non-nil, trade safety for convenience.")
+
+ (defvar emacsconf-danger-asked nil
+ "When non-nil, user has already been asked for security trade-off.")
+
+ (defun emacsconf-danger--ask (forms)
+ "Ask to run dangerous FORMS.
+ Return t if the answer is “yes”."
+ (when (y-or-n-p (format "FORMS:\n%s\n\nThis is dangerous. Run anyway? "
+ (prin1-to-string forms)))
+ (unless emacsconf-danger-asked
+ (if (y-or-n-p "Would you like to trade security for convenience for the rest of the session? ")
+ (setq-local emacsconf-danger-allow-dangerous-stuff t)
+ (setq-local emacsconf-danger-asked t)))
+ t))
+
+ (defmacro emacsconf-danger--shield (error &rest forms)
+ "Protect user from dangerous FORMS.
+ Throw an error if ERROR is non-nil, skip otherwise."
+ `(let ((shield (not (or emacsconf-danger-allow-dangerous-stuff
+ (emacsconf-danger--ask ',@forms)))))
+ (if shield
+ ,(when error
+ '(user-error "Dangerous action cancelled by user"))
+ ,@forms)))
+
+ (defmacro emacsconf-danger-shield (&rest forms)
+ "Protect user from dangerous FORMS by throwing an ERROR."
+ `(emacsconf-danger--shield t ,@forms))
+
+ (defmacro emacsconf-danger-skip (&rest forms)
+ "Protect user from dangerous FORMS by skipping them."
+ `(emacsconf-danger--shield nil ,@forms))
+
+ ;; Make it easy to jump and refile
+ (setq-local org-refile-targets '((nil . (:maxlevel . 5))))
+
+ (message "General setup has been loaded")
+
+ (emacsconf-danger-shield
+ (setq-local org-confirm-babel-evaluate nil
+ org-confirm-elisp-link-function nil))
+ (message "No longer asking for confirmation in this buffer")
+
+ (setq-local emacsconf-danger-allow-dangerous-stuff t)
+ (org-babel-ref-resolve "elisp-no-confirmation()")
+
+ (message "Now allowing dangerous stuff. Buckle up, buckaroo!")
+
+ (kill-local-variable 'emacsconf-danger-allow-dangerous-stuff)
+ (kill-local-variable 'emacsconf-danger-asked)
+ (kill-local-variable 'org-confirm-babel-evaluate)
+ (kill-local-variable 'org-confirm-elisp-link-function)
+ (kill-local-variable 'org-refile-targets)
+
+ (message "Back to safety. Phew!")
+
+
+## Prerecs
+
+
+### Receive notification when new prerecs are available
+
+ #!/usr/bin/env sh
+
+ set -eu
+
+ sleep_duration=600
+
+ data="$(basename "$0" ".sh").data"
+
+ plural () {
+ if [ "$2" = 1 ] || [ "$2" = -1 ]; then
+ echo "${1}"
+ else
+ case $1 in
+ "is" )
+ echo "are"
+ ;;
+ * )
+ echo "${1}s"
+ esac
+ fi
+ }
+
+ current_time() {
+ date +"[%T]"
+ }
+
+ log() {
+ printf "%s $1\n" "$(current_time)"
+ }
+
+ color_green="\e[32m"
+ color_white="\e[0m"
+
+ log2() {
+ log "${color_green}$1${color_white}"
+ }
+
+ notify() {
+ log2 "$1"
+ notify-send -t 0 "EmacsConf" "$(log "$1")"
+ }
+
+ _sleep() {
+ log "Checking again in ${sleep_duration}s"
+ sleep "$sleep_duration"
+ }
+
+ fetch() {
+ TERM=xterm ssh orga@media.emacsconf.org -- ls -1 /srv/upload | wc -l
+ }
+
+ clean() {
+ rm -f "$data"
+ log "Data file has been cleaned"
+ }
+
+ if [ "$#" -gt 0 ]; then
+ command="$1"
+ if [ "$command" = "clean" ]; then
+ clean
+ exit 0
+ fi
+
+ if [ "$command" = "clean-start" ]; then
+ clean
+ fi
+ fi
+
+ touch "$data"
+
+ log2 "Currently waiting for prerec"
+
+ while true; do
+ prerecs_number_past=$(cat "$data")
+ diff=0
+
+ while true; do
+ log "Checking..."
+ prerecs_number_current="$(fetch)"
+ diff=$((prerecs_number_current - prerecs_number_past))
+ if [ $diff -gt 0 ]; then
+ break
+ fi
+ log "No new prerec"
+ _sleep
+ done
+
+ notify "$diff new $(plural "prerec" $diff) $(plural "is" $diff) available!"
+
+ echo "$prerecs_number_current" > "$data"
+
+ _sleep
+ done
+
+
+### Fetch upload data
+
+ #!/usr/bin/env sh
+
+ set -eu
+
+ current_time() {
+ date +"[%T]"
+ }
+
+ log() {
+ printf "%s $1\n" "$(current_time)"
+ }
+
+ if [ -t 0 ]; then
+ log "Fetching data..."
+ fi
+
+ TERM=xterm ssh orga@media.emacsconf.org -- cat /srv/upload/*/*json
+
+
+### Fetch new talk data formatted
+
+ #!/usr/bin/env sh
+
+ set -eu
+
+ echo "Fetching data..."
+ data_raw="$(./fetch-upload-data.sh)"
+
+ echo
+
+ echo "$data_raw" | awk "$(cat << EOF
+ func dewrap(a) {gsub(/^ *".*": "|",$/, "", a); return a};
+ BEGIN {i=0};
+ /^ "sid"/ { a[0] = dewrap(\$0); };
+ /^ "name"/ { a[2] = sprintf("%s\t", dewrap(\$0)) };
+ /^ "comment"/ { a[3] = sprintf("%s\t", dewrap(\$0)); if (a[3] == "\t"){a[3] = "No comment"} };
+ /^ "key"/ { a[1] = dewrap(\$0); };
+ /^\}/ { printf "[%d]\t%s\t%s\t%s\n\t%s\n\n", i, a[0], a[1], a[2], a[3]; i=i+1};
+ EOF
+ )"
+
+
+## Publish this page
+
+ (defun emacsconf-org-publish-this-page ()
+ (interactive)
+ (org-md-export-to-markdown)
+ (org-babel-tangle)
+ (magit-stage-modified)
+ (magit-commit-create (list "-m" (read-string "Commit message: ")))
+ (call-interactively #'magit-push-current-to-pushremote))
+
+
+### Export to markdown
+
+ (defun emacsconf-export-md-on-save ()
+ "Export markdown on save.
+ Meant to be used with `after-save-hook'."
+ (org-md-export-to-markdown)
+ (org-babel-tangle))
+
+ (defvar emacsconf-export-md-on-save-configured t
+ "Non-nil when the setup code-block has been executed.")
+
+ (unless (bound-and-true-p emacsconf-export-md-on-save-configured)
+ (org-babel-ref-resolve "md-export-on-save-setup()"))
+
+ (add-hook 'after-save-hook #'emacsconf-export-md-on-save nil t)
+
+ (when (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is active"))
+
+ (remove-hook 'after-save-hook #'emacsconf-export-md-on-save t)
+
+ (unless (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is no longer active"))
+
+
+## Tangle and publish on save
+
+ (defun emacsconf-export-md-on-save ()
+ "Export markdown on save.
+ Meant to be used with `after-save-hook'."
+ (org-md-export-to-markdown)
+ (org-babel-tangle))
+
+ (defvar emacsconf-export-md-on-save-configured t
+ "Non-nil when the setup code-block has been executed.")
+
+ (unless (bound-and-true-p emacsconf-export-md-on-save-configured)
+ (org-babel-ref-resolve "md-export-on-save-setup()"))
+
+ (add-hook 'after-save-hook #'emacsconf-export-md-on-save nil t)
+
+ (when (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is active"))
+
+ (remove-hook 'after-save-hook #'emacsconf-export-md-on-save t)
+
+ (unless (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is no longer active"))
+
+
+## Review agenda
+
+ (defcustom emacsconf-org-tag nil "Tag for your nick, for easier agenda filtering"
+ :group 'emacsconf
+ :type 'string)
+
+ (defun emacsconf-show-my-agenda ()
+ (interactive)
+ (let* ((org-agenda-files (list (buffer-file-name)))
+ (tag-filter (if emacsconf-org-tag (concat "+" emacsconf-org-tag) ""))
+ (org-agenda-tag-filter-preset (list (when emacsconf-org-tag (concat "+" emacsconf-org-tag))))
+ (org-agenda-custom-commands `(("a" "Agenda"
+ ((agenda ,tag-filter)
+ (tags-todo ,(concat tag-filter "-SCHEDULED={.+}-DEADLINE={.+}")))
+ ((org-agenda-span 14))))))
+ (org-agenda nil "a")))
+
+
+## Process review comments from pad
+
+see emacsconf-import-comments-from-etherpad-text
+
+
+<a id="lessons"></a>
+
+# Lessons learned
+
+
+## From previous years
+
+- [X] Shorter CFP, longer recording time
+- [X] Ask for talk title to be subject in submission
+- [X] Fresh eyes can doublecheck that all the talks are included and that availability properties have been set/followed
+- [X] Putting ‘availability’ towards the top of the submission template would make it harder for us to miss it during reviews, and it shouldn’t change anything for speakers.
+- [X] All the personalised messages we’ve sent during the scheduling campaign should probably be kept in a repo so that it’s less work for those who will be in charge of it next.
+- [X] Since people kept running into ftp problems, we might want to set up a web-frontend next year to minimise problems.
+- [X] Might be a good idea to avoid Thanksgiving weekend, as lots of people travel then
+- [X] Tech-checks haven’t been really popular this year, but there are so many ways we could make them more useful. On the <span class="timestamp-wrapper"><span class="timestamp">[2021-11-16 Tue]</span></span>, 10 days prior the conf, we thought that it could be nice to use them as recording sessions for late-prerecs, and that’s only one example.
+- [X] Having the NO\_NEWS / WAITING\_FOR\_PREREC contrast from the start of `conf.org` might have made it easier for us to ping speakers who were late to the party this year. Rather than sending the personalised 10 days prior to the conference, we might have sent it a week after the submission of the anticipated scheduled (where we ask speakers if their allocated time is okay, based on their availability).
+- [X] Move first dry run earlier (maybe one month before?) to give us more time for process tweaks
+- [ ] Dropping talks one week before the conf might allow us to have a near-fixed schedule to announce early.
+ - or we can plan for live or gaps, that&rsquo;s cool too
+- [ ] CRM
+ - [ ] zaeph: Implementing a variable for `automatic-emails` would make it easier to suppress user-hooks for message-mode
+ - [ ]zaeph: Even though we’re sending emails automatically, we might want to keep trace of them in our `Sent` IMAP folder. notmuch does it with `Fcc:` in the header, so we might need a user-customisable var here as well.
+- [ ] less tiring lighting
+- [ ] split host and streamer?
+- [ ] Cram less with different tracks
+- [ ] Review pre-recs, even late submissions in their entirety to ensure no syncing issue
+- [ ] Tight opening-remarks, possible pre-rec.
+- [X] Asking pronunciation of name as soon as application with SA-cha CHEW-ah pattern would be good. Not a lot of diligence with it this year.
+- [ ] People need to specify their IRC handle on application (potentially forcing nick and/or first-name/last-name.
+ - suggested, but not everyone has IRC, so that&rsquo;s okay. We&rsquo;ll manage. Walk new speakers through it?
+- [ ] We might want to figure out an ffmpeg workflow for noise-suppressing on top of normalisation. Take inspiration from Audacity macros.
+- [ ] Having a more relaxed Saturday might give us time to adjust to tech-stack.
+- [X] Creating BBB rooms in anticipation and/or automatically, before or during, might make for smoother check-in; right now, people keep wanting to check in via email even though we told them to use chat
+ - One BBB room per talk
+- [ ] Pre-recs were a little blocky wrt encoding; we might want to bump the bitrate next year
+- [ ] we can see if bot + pads + merging will help next year, and we can also experiment with multiple streams if there are enough people to pull it off so that speakers don&rsquo;t feel like they&rsquo;ve just been dropped in a room and left to their own devices :)
+
+
+## Lessons learned for next year
+
+
+### CFP & Review period
+
+- Ask for public e-mail or contact information, IRC handle in CFP
+- Be even more stringent about the 10/20/40-min splits. A lot of
+ speakers still default to the 20- or 40-min formats without
+ providing us shorter formats, and that puts strain on our schedule
+ and requires us to use a different template for the notification
+ (which can be confusing). We need to stress that not respecting the
+ format makes it harder not only for the organizers, but also for the
+ speakers themselves (since they will have to rethink their
+ presentation). Maybe we can have an e-mail template for a quick
+ reply that says something like &ldquo;Just in case we need to squeeze
+ talks into shorter times, could you please also propose an outline
+ for a possible 10-minute talk that could get people interested in
+ your topic and point them to where they can find out more?&rdquo;
+- Two people is the sweet number of reviewers to have for the
+ proposals before sending the notifications, and there’d be
+ diminishing returns with more. Two is enough to release the pressure
+ on SCHED, verify the metadata (esp. speaker availability), and
+ suggest a different ordering where appropriate. It can take a long
+ time to comb through the proposals (roughly 10 proposals per hour),
+ and whilst it’d be difficult to justify more in-depth reviewers,
+ other orgas can do a shallow-pass to catch red-flags or discuss the
+ submissions as they come in. Other organizers can always chime in on
+ topics they particularly care about so that their encouraging
+ comments or suggestions can be included in the acceptance e-mail.
+- We extended CFP-end by two weeks this year, but that made it coincide
+ with speaker-notifs, and that’s awkward. Next time, we should only
+ extend the CFP by one week to avoid having to scramble with the
+ schedule until the very last day.
+- Some people assume that they have to suggest longer formats even if
+ they intend their talks to be 10′ or 20′. We should change the
+ wording on the CFP to ask them to only provide alternatives for
+ shorter formats, not longer.
+- It was hard to squeeze all the org/hyperbole talk on day-1.
+ Generally, the people who submit these kinds of talk come from all
+ over the world, and US mornings are more accommodating than US
+ evenings when it comes to timezones. We might consider having two org
+ **mornings** rather than an org **day**; it would give us more flexibility
+ with those talks.
+- We’re starting to reach critical mass on the org-talks. We might want
+ to consider splitting the org-talks and the dev-talks into two
+ distinct events to allow them to grow independently.
+- We should associate time-of-day with CFP-deadline; otherwise, the
+ scheduler has to be on edge until the very end of the day. It’s worse
+ this year because we made CFP-end coincide with speaker-notif, so this
+ might not be as much of a problem next year.
+- It’s easier for us to extend beyond 5pm than to go before 9am
+ (especially for the West coast). Extending beyond 5pm puts strain on
+ European organizers and volunteers, though.
+- Sometimes, ikiwiki on front0 took a lot of time to process the new
+ commits. sachac assumed this is due to a faulty regex parsing. We
+ should be able to find out more by looking at the logs from ikiwiki
+ after a slow commit.
+- Ask for preferred timezone in CFP
+- Check with John Wiegley re: schedule - we always happen to coincide with his work trips
+
+
+### When processing prerecs
+
+- We should flesh out the prepare.md section on audio-recording because
+ some speakers have annoying coil-whines when recording from their
+ laptop’s microphone which are particularly hard to remove. We should
+ ask speaker to record some silence, listen to it in isolation, and
+ gauge how silent it actually is. It’s not a biggie though, since we
+ can usually degrade the audio quality for the sake of removing the
+ noise.
+- We can ask for silence in a separate recording so that we don&rsquo;t have to worry about cutting it out.
+
+
+## Possible big projects for next year
+
+
+### Prolog’ing the schedule
+
+
+### Designing the EmacsConf suite (to make it easier for people other us to run their own versions)
+
diff --git a/2022/organizers-notebook/emergency-back-to-one-sat-pm.svg b/2022/organizers-notebook/emergency-back-to-one-sat-pm.svg
new file mode 100644
index 00000000..47586081
--- /dev/null
+++ b/2022/organizers-notebook/emergency-back-to-one-sat-pm.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="200" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="0" y="15" opacity="0.8" width="59" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(57,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:47- 2:02 Linking personal info with Hyperbole implicit buttons</title> <rect x="139" y="15" opacity="0.8" width="44" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(181,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:44- 3:09 Real estate and Org table formulas</title> <rect x="308" y="15" opacity="0.8" width="74" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(380,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:09- 3:34 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="382" y="15" opacity="0.8" width="74" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(454,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 4:00- 4:20 Edit live Jupyter notebook cells with Emacs</title> <rect x="533" y="15" opacity="0.8" width="59" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(590,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 4:42- 4:52 orgvm: a simple HTTP server for org</title> <rect x="657" y="15" opacity="0.8" width="29" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(684,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:24- 5:29 Saturday closing remarks</title> <rect x="782" y="15" opacity="0.8" width="14" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(794,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:21- 1:46 Using SQLite as a data source: a framework and an example</title> <rect x="62" y="100" opacity="0.8" width="74" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(134,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 2:03- 2:43 Revisiting the anatomy of Emacs mail user agents</title> <rect x="186" y="100" opacity="0.8" width="118" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(302,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:45 Bidirectional links with eev</title> <rect x="459" y="100" opacity="0.8" width="29" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(486,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 3:45- 4:00 Short hyperlinks to Python docs</title> <rect x="488" y="100" opacity="0.8" width="44" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(530,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 4:21- 4:41 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="595" y="100" opacity="0.8" width="59" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(652,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:53- 5:23 Haskell code exploration with Emacs</title> <rect x="690" y="100" opacity="0.8" width="88" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(776,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(177,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(355,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(533,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(711,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg> \ No newline at end of file
diff --git a/2022/organizers-notebook/emergency-back-to-one-sun-am.svg b/2022/organizers-notebook/emergency-back-to-one-sun-am.svg
new file mode 100644
index 00000000..fe5d88ac
--- /dev/null
+++ b/2022/organizers-notebook/emergency-back-to-one-sun-am.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Sunday</title> <rect width="800" height="200" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="19" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(17,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:35 Results of the 2022 Emacs Survey</title> <rect x="19" y="15" opacity="0.8" width="114" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(131,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:55 This Year in Org</title> <rect x="133" y="15" opacity="0.8" width="76" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(207,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 10:15-10:40 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="285" y="15" opacity="0.8" width="95" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(378,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 11:20-11:30 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="533" y="15" opacity="0.8" width="38" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(569,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:45-11:55 orgvm: a simple HTTP server for org</title> <rect x="628" y="15" opacity="0.8" width="38" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(664,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 9:55-10:15 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="209" y="100" opacity="0.8" width="76" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(283,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:40-11:05 rde Emacs introduction</title> <rect x="380" y="100" opacity="0.8" width="95" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(473,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 11:05-11:20 Tree-sitter beyond syntax highlighting</title> <rect x="476" y="100" opacity="0.8" width="57" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(531,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 11:30-11:45 justl: Driving recipes within Emacs</title> <rect x="571" y="100" opacity="0.8" width="57" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(626,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:55-12:15 What I'd like to see in Emacs</title> <rect x="666" y="100" opacity="0.8" width="76" height="84" stroke="black" stroke-dasharray="5,5,5" fill="red"></rect> <g transform="translate(740,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(228,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(457,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(685,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 12 PM</text></g></g></svg> \ No newline at end of file
diff --git a/2022/organizers-notebook/emergency-back-to-one-sun-pm.svg b/2022/organizers-notebook/emergency-back-to-one-sun-pm.svg
new file mode 100644
index 00000000..1749c973
--- /dev/null
+++ b/2022/organizers-notebook/emergency-back-to-one-sun-pm.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Sunday</title> <rect width="800" height="200" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 1:00- 1:10 Emacs development updates</title> <rect x="0" y="15" opacity="0.8" width="26" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(24,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:13- 1:53 Powerful productivity with Hyperbole and Org Mode</title> <rect x="34" y="15" opacity="0.8" width="106" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(138,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 2:14- 2:39 Org workflows for developers</title> <rect x="197" y="15" opacity="0.8" width="66" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(261,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 3:00- 3:20 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="320" y="15" opacity="0.8" width="53" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(371,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:46- 4:06 Putting Org Mode on the Indieweb</title> <rect x="442" y="15" opacity="0.8" width="53" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(493,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:50- 5:05 Fanfare for the Common Emacs User</title> <rect x="613" y="15" opacity="0.8" width="40" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(651,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 5:08- 5:18 Sunday closing remarks</title> <rect x="661" y="15" opacity="0.8" width="26" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(685,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:56- 2:11 Getting detached from Emacs</title> <rect x="149" y="100" opacity="0.8" width="40" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(187,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 2:42- 2:57 Top 10 reasons why you should be using Eshell</title> <rect x="272" y="100" opacity="0.8" width="40" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(310,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 3:23- 3:43 Emacs was async before async was cool</title> <rect x="381" y="100" opacity="0.8" width="53" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(432,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 4:09- 4:29 The Wheels on D-Bus</title> <rect x="504" y="100" opacity="0.8" width="53" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(555,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:32- 4:47 Pre-localizing Emacs</title> <rect x="565" y="100" opacity="0.8" width="40" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(603,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(160,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(320,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(480,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(640,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="black" x="0" y="183" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg> \ No newline at end of file
diff --git a/2022/organizers-notebook/index.org b/2022/organizers-notebook/index.org
new file mode 100644
index 00000000..a778b6f4
--- /dev/null
+++ b/2022/organizers-notebook/index.org
@@ -0,0 +1,8712 @@
+# [[elisp:(org-md-export-to-markdown)][Export this file to Markdown]]
+#+todo: TODO(t) SOMEDAY STARTED INPROGRESS(i) WAITING(w) STANDBY(s) BLOCKED(b) | DONE(x) CANCELLED(c)
+#+OPTIONS: h:6 toc:nil num:nil ':t
+#+PROPERTY: header-args :results silent :exports code :tangle yes
+#+EXPORT_FILE_NAME: ../organizers-notebook.md
+#+PROPERTY: QUANTIFIED Emacs
+
+#+begin_export md
+<!-- organizers-notebook.md is exported from organizers-notebook/index.org, please modify that instead. -->
+[[!sidebar content=""]]
+
+This file is automatically exported from [/2022/organizers-notebook/index.org](/2022/organizers-notebook/index.org). You might prefer to navigate this as an Org file instead. To do so, [clone the wiki repository](https://emacsconf.org/edit/).
+#+end_export
+
+#+TOC: headlines 1
+
+Projects and tasks:
+
+#+TOC: headlines 1 :target #projects
+
+Schedule by status: (gray: waiting, light yellow: processing, yellow: to assign, light green: captioning, green: captioned and ready) - Updated by conf.org and the wiki repository
+
+[[file:schedule.svg]]
+
+* Working with this file :noexport:
+:PROPERTIES:
+:CUSTOM_ID: this
+:END:
+You can open the following links (~C-c C-o~ or ~<mouse-1>~) to run the
+associated actions:
+
+General:
+- [[elisp:(org-babel-ref-resolve "general-setup()")][General setup]] / [[elisp:(prog1 (org-babel-ref-resolve "general-setup()") (org-babel-ref-resolve "i-like-danger()"))][Risky general setup]]
+- [[elisp:(org-babel-ref-resolve "i-like-danger()")][I’m okay trading off security for convenience]] / [[elisp:(org-babel-ref-resolve "back-to-safety()")][Bring me back to safety]]
+ - [[elisp:(org-babel-ref-resolve "elisp-no-confirmation")][Do not ask for confirmation when evaluating elisp links or org-babel blocks]] (Risky)
+- [[elisp:(org-babel-execute-buffer)][Execute buffer]] (Risky and unreliable for now)
+- [[elisp:(emacsconf-show-my-agenda)][Show my agenda]] - customize emacsconf-org-tag
+
+Importing changes:
+(This file is frequently edited, so please pull before making your changes.)
+- [[elisp:(magit-pull-from-pushremote nil)][Pull from origin]]
+
+Export:
+- [[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
+- [[elisp:(emacsconf-org-publish-this-page)][Export, tangle, commit, push]]
+
+Export on save:
+- [[elisp:(org-babel-ref-resolve "md-export-on-save-toggle-on()")][Export on save]]
+- [[elisp:(org-babel-ref-resolve "md-export-on-save-toggle-off()")][Stop exporting on save]]
+
+You can use ~C-c /~ (~org-sparse-tree~) to filter this for TODOs,
+or ~C-c \~ (~org-match-sparse-tree~) to see anything tagged with your tag.
+~org-agenda~ with ~<~ for the file restriction may also be handy.
+
+
+* Overall priorities
+:PROPERTIES:
+:CUSTOM_ID: overall
+:END:
+
+This table makes it easier to move the slider depending on who wants
+to volunteer and how much we can get done. At some point, we'll figure
+out how to track our current status so we know what we need to
+scramble to do in order to get the conference off the ground. *bold*
+is our current goal. Feel free to volunteer for anything that
+interests you!
+
+| | Good | Better | Best |
+|------------------------+-------------------------------------------+--------------------------------------+--------------------------------------------------------------|
+| [[#harvest][harvesting talks & Q&A]] | *recordings trimmed if needed, published* | chapter markers | edited transcripts |
+
+Previous priorities;
+
+| [[#conforg][conf.org management]] | on sachac's laptop | S: on res.emacsconf.org | *DONE S/Z: other people know how to work with it* |
+| [[#prepare-prerec-process][prerec]] | convert to webm | normalize audio | *[[#mastering][DONE Z: reduce noise]]* |
+| [[#publish-live][talk pages]] | DONE S: link to stream, pad, IRC | *S: link to prerec when live* | embed stream, pad, IRC, prerec |
+| [[#sched-decision][schedule]] | one track | *DONE S: two tracks* | aligned times, full roster |
+| [[#upload][upload]] | FTP | *DONE S: web-based* | auto-encoded, preview (SReview?) |
+| [[#streaming][streaming]] | ffmpeg from computer | OBS | *DONE: OBS in cloud, switchable hosts* |
+| [[#other-streams][other streams]] | 480p | + Toobnix | *S: + YouTube* |
+| [[#coordinate-volunteers][volunteer coordination]] | ad-hoc | *DONE playbook* | training meetings + recordings |
+| BBB rooms | about 5 rooms that we cycle through | | *DONE S: one room per speaker* |
+| host | no host, speaker reads pad | *host reads pad* | host monitors IRC and helps with BBB as well |
+| BBB Q&A | none | *DONE open to community* | moderated by speaker and host |
+| BBB Q&A start | awkward silence while waiting | *speaker can demo a little* | host has prepared questions just in case no one shows up |
+| [[#write-viewing][watch page]] | tracks | + IRC | *DONE S: + talk info*, maybe even current/recent/next |
+| [[#etherpad][pad]] | one pad for conf | one pad per talk, wikimedia | *DONE S: one pad per talk, self-hosted* so we can access API |
+| [[#irc][IRC]] | #emacsconf, -org | *DONE #emacsconf, -gen, -dev, -org* | IRC volunteer copying to pads; maybe even IRC bots |
+| [[#irc-announce][IRC announcements]] | ERC commands | *DONE S: hook-based* | timer-based |
+| [[#publishing-sched][sched update]] | *DONE S: publish at start* | update main sched | update talk pages |
+| [[#video-platforms][other platforms]] | *S: Toobnix & YT after event* | | S: Toobnix + YT when live |
+| schedule view | text table | imagemap fallback | *DONE S: interactive SVG* |
+| [[#caption-workflow][caption workflow]] | YT autosubs | Whisper autosubs | *DONE: Whisper + more granular timestamps* |
+| [[#wiki-design][wiki]] | plain text, markdown | *DONE S: some JS and CSS enrichment* | more JS and CSS, embeds, videoplayer |
+| [[#ansible][ansible]] | none | *DONE S: some automation* | comprehensive, can also work against containers |
+| [[#intro][intro and exit]] | DONE: slide on screen, host on Mumble | *per-talk video, recorded voiceover* | Emacs thing so we can display info, countdowns, IRC |
+* Next comms update
+SCHEDULED: <2022-12-18 Sun>
+:PROPERTIES:
+:CUSTOM_ID: update
+:CREATED: [022-12-11 Sun 10:0]
+:END:
+
+- all the Q&A videos are available
+- updated GRAIL talk, uploaded orgvm talk
+- volunteers: next step is to make chapter markers, large model VTTs are now available
+- [2022-12-15 Thu] all Q&A videos posted, large model VTTs available
+- [2022-12-12 Mon] Updated grail, updated backstage view
+- [2022-12-11 Sun] Thank-you notes sent to all the speakers with Toobnix and YouTube URLs, BBB playback info
+
+* Projects and other long-running tasks
+:PROPERTIES:
+:CUSTOM_ID: projects
+:END:
+
+#+TOC: headlines 1 local
+** Harvest live talks and Q&A
+:PROPERTIES:
+:CUSTOM_ID: harvest
+:END:
+*** DONE Add audio-only options to the publishing process
+CLOSED: [2022-12-15 Thu 16:38]
+:PROPERTIES:
+:Effort: 0:30
+:END:
+*** Learn from how other conferences harvest their talks and Q&A
+- DebConf posts the talk video (prerecorded + in person Q&A), no transcripts or index
+ Ex: https://debconf22.debconf.org/talks/71-sequoia-pgp-v5-openpgp-authentication-and-debian/ . They link to the video and the Etherpad.
+- FOSSDEM has directory listings by track: https://video.fosdem.org/2022/D.conference/
+ also embedded video and links to slides, video recording, chat room (but not logs) https://archive.fosdem.org/2022/schedule/event/community_contributions/
+- LibrePlanet has thumbnails:
+ https://media.libreplanet.org/u/libreplanet/tag/libreplanet-2022-video/ . Talk page has video and links to slides, download.
+ https://media.libreplanet.org/u/libreplanet/m/taking-back-the-web-with-haketilo/
+- NeovimConf: YouTube playlist, lots of comments on YouTube, key moments
+- VS Code Day: link to YouTube video, edited CC captions in YouTube, links and a hashtag in the video description, key moments
+- TED: transcript button, shows transcript in a scrollable area on the right
+*** DONE Publish more Q&A recordings
+CLOSED: [2022-12-15 Thu 10:27]
+**** DONE Check status
+CLOSED: [2022-12-15 Thu 00:39]
+#+begin_src emacs-lisp :results replace :eval no
+(emacsconf-collect-prop :slug
+ (seq-remove
+ (lambda (o)
+ (or (null (string-match "live" (or (plist-get o :q-and-a) "")))
+ (null (emacsconf-talk-file o "--bbb-webcams.webm"))
+ (and (emacsconf-talk-file o "--answers.webm")
+ (plist-get o :qa-public))))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+#+end_src
+
+#+RESULTS:
+:results:
+nil
+:end:
+
+**** DONE Write code to make it easy to do so
+emacsconf-extract-publish-qa
+**** DONE Fetch the reencoded maint answers and post it to backstage
+CLOSED: [2022-12-12 Mon 11:30]
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 09:53]
+:END:
+:LOGBOOK:
+- State "DONE" from "TODO" [2022-12-12 Mon 11:30]
+:END:
+
+*** DONE Document this phase of the conference
+CLOSED: [2022-12-08 Thu 20:54]
+:PROPERTIES:
+:CREATED: [2022-12-08 Thu 19:33]
+:END:
+
+We're now in the harvesting phase of the conference, where we work on
+collecting the ideas that people shared in the Q&A sessions as well as
+any talks that were not available as pre-recorded videos. It's a great
+way to help speakers get stuff out of their heads and into a form we
+can all learn from. =)
+
+Status of talks and Q&A sessions:
+
+- All talks except for the new version of grail should now be
+ available at https://media.emacsconf.org/2022/ and on talk pages
+- Links to the BBB playbacks and to the various BBB resources (--bbb-*
+ for each talk) are now in the backstage area for speakers and/or
+ volunteers to review
+- RMS Q&A audio has been uploaded (--questions.ogg)
+- grail talk will be reuploaded by the speaker
+- IRC logs have been copied to the backstage area; see the links at
+ the top of the backstage area
+- Etherpads have been converted to Markdown and included on the talk pages
+- BBB chats have been converted to Markdown and included on the talk pages
+
+Here's a good/better/best scale for stuff we can do during this phase:
+
+- Good:
+ - Look at IRC log at the top of the backstage area and copy
+ anonymized questions/answers/feedback to the wiki pages as well,
+ if they weren't already on the page
+ - Somewhat manual because of overlapping conversations; might be
+ easier to have one volunteer do all the talks in one shift
+ (Saturday morning gen, Saturday morning dev, Saturday afternoon
+ gen, etc.), so you can e-mail to call dibs if you like. We
+ usually remove names from the public log as well. Most of the
+ conversations should be in the track-specific channels, but some
+ might have ended up in #emacsconf as well. You can check the
+ talk page to see if the questions are already there. If you're
+ already set up to edit the wiki or you can figure out the
+ slightly complicated setup for editing, feel free to edit the
+ page directly. If not, you can email a Markdown or Org Mode
+ snippet to emacsconf-submit@gnu.org and let me know what page to
+ put it on.
+- Better:
+ - Review the BBB recording to check if there's anything that needs
+ to be deleted from the recording before we publish it so that
+ people can listen to things themselves; publish the recording or
+ excerpts of it
+ - Might be easier with the transcript, but can also be done
+ without one. asmblox, async, buttons, dbus, detached, and eshell
+ have --bbb-webcams.vtt as the autogenerated Whisper transcripts.
+- Even better than that:
+ - Make chapter markers for the Q&A recording so that people can jump
+ to the question they're particularly interested in. You can write
+ them in the form:
+ mm:ss text goes here
+ mm:ss more text
+ and I can turn those into chapter headings.
+- Totally awesome:
+ - Edited captions/transcripts for the Q&A
+ - Answers copied into the Q&A section, possibly with linked timestamps
+**** Process for reviewing and trimming the videos
+
+Helper function:
+- emacsconf-extract-publish-qa (call with C-u in order to specify a time for truncating the video)
+
+
+Skim the transcript and the videos to see if anything needs to be removed, and which video to use
+
+BigBlueButton gives us the webcams and audio as one video
+(`--bbb-webcams.webm`) and the screenshare (if any) as another video
+(`--bbb-deskshare.webm`). If the speaker shared their screen, we can
+focus on that instead of their webcam. The following ffmpeg command
+combines the audio from the webcams (which has been previously
+extracted into a separate file, `--bbb-webcams.opus`) with the video
+from the screenshare.
+
+ ffmpeg -i example--bbb-webcams.opus -i example--bbb-deskshare.webm -c copy example--answers.webm
+
+We also want to check if people accidentally shared sensitive
+information on their screen, or if anyone said something that they
+might not have said if they remembered that the the Q&A videos will be
+shared after the talk. Sometimes there's some time before we get
+around to closing the meeting at the end of the Q&A. Usually, a quick
+read of the transcript will show anything that needs to be trimmed.
+Here's how to stop the recording at a specified time:
+
+ ffmpeg -i input.webm -to hh:mm:ss -c copy output.webm
+
+Cutting out stuff from the middle of a recording is slightly more
+complicated. It might be easier to use a nonlinear video editor such
+as kdenlive to edit the video. If you want to use ffmpeg, using
+filters to select the frames and reencode the video will probably work
+out better than splitting the file into multiple parts and then
+concatenating them without reencoding, as the latter tends to need to
+be split on keyframes. Here's a sample command based on this
+[StackOverflow](https://stackoverflow.com/questions/64866231/remove-a-section-from-the-middle-of-a-video-without-concat) answer that removes the section between 15 seconds and
+45 seconds:
+
+ ffmpeg -i input.webm \
+ -vf "select='not(between(t,15,45))', setpts=N/FRAME_RATE/TB" \
+ -af "aselect='not(between(t,15,45))', asetpts=N/SR/TB" \
+ output.webm
+
+Alternatively, you can let us know what parts needs to be trimmed, and
+we can figure that part out.
+
+
+
+
+*** TODO Prepare groundwork for volunteers to help
+**** CANCELLED Document IRC/pad/BBB chat extraction tasks
+CLOSED: [2022-12-08 Thu 20:35]
+
+Experience level: no technical background needed; slightly easier if you've set up your computer for editing the wiki, which needs ssh and git
+
+There were lots of interesting notes and Q&A on IRC and the pad. If we can copy them to the talk page on the wiki, then we can catch any questions that hadn't been answered and forward feedback to the speaker. It's a little challenging because the IRC conversation might get mixed up when another talk starts, so it helps to read the IRC log and decide what lines to include. We usually remove names from the public log as well. Most of the conversations should be in the track-specific channels, but some might have ended up in #emacsconf as well.
+
+I've added IRC chat logs to the top of the backstage page. Each talk also links to the HTML (--pad.html) and Markdown (--pad.md) version of the pad.
+
+You can see the 2021 talks (ex: https://emacsconf.org/2021/talks/frownies/ , https://emacsconf.org/2021/talks/pattern/ ) for an example of how the discussions were archived on the talk pages. Sometimes we organize them by type of comment, so it's easy to see Q&A vs. notes vs. feedback about the talk itself.
+
+To avoid duplicating work, maybe we can use this Etherpad to call dibs on talks to process. You can write your name or nick next to the talk(s) you're archiving.
+
+If you're already set up to edit the wiki or you can figure out the slightly complicated setup for editing, feel free to edit the page directly. If not, you can email a Markdown or Org Mode snippet to emacsconf-submit@gnu.org and let me know what page to put it on.
+*** TODO Split up relevant sections from IRC logs so that volunteers can go through them
+
+*** DONE Check duration of Q&A BBB recordings
+CLOSED: [2022-12-08 Thu 20:35]
+
+About 15 hours total
+#+begin_src emacs-lisp :eval no
+(format-seconds "%h:%.2m:%.2s"
+ (/ (apply '+
+ (seq-keep (lambda (o)
+ (and (file-exists-p (expand-file-name (concat (plist-get o :video-slug) "--bbb-webcams.opus") emacsconf-cache-dir))
+ (compile-media-get-file-duration-ms
+ (expand-file-name (concat (plist-get o :video-slug) "--bbb-webcams.opus") emacsconf-cache-dir))))
+ (emacsconf-get-talk-info)))
+ 1000)) ;; "14:52:28"
+#+end_src
+around 4 hours to process asmblox: 14 minutes (/ (* 4 60) 14.0) ~17x recorded time
+(/ (* 17 15) 24.0) 10.625
+
+*** DONE Get the playback links for the BBB talks
+CLOSED: [2022-12-06 Tue 09:52]
+
+Added as BBB_PLAYBACK properties (:bbb-playback in the plist).
+on orga@res:
+
+- /data/emacsconf/2022/bbb-playbacks has the files from the web-based playback
+- /data/emacsconf/2022/bbb-raw has the raw files
+
+
+**** DONE Download all the BBB playback files
+ #+begin_src emacs-lisp :eval no
+ (let ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (mapconcat
+ (lambda (o)
+ (when (plist-get o :bbb-playback)
+ (let ((meeting-id (when (string-match "meetingId=\\(.+\\)"
+ (plist-get o :bbb-playback))
+ (match-string 1 (plist-get o :bbb-playback)))))
+ (concat "mkdir " (plist-get o :slug) "\n"
+ "cd " (plist-get o :slug) "\n"
+ (mapconcat
+ (lambda (file)
+ (concat
+ "wget https://bbb.emacsverse.org/presentation/"
+ meeting-id "/" file "\n")
+ )
+ '("video/webcams.webm" "metadata.xml" "deskshare/deskshare.webm" "panzooms.xml" "cursor.xml" "deskshare.xml" "captions.json" "presentation_text.json" "slides_new.xml")
+ ""
+ )
+ "cd ..\n"
+ ))
+ )
+ )
+ info
+ ""))
+ #+end_src
+
+**** DONE Convert to Opus in preparation for transcription
+
+find -name webcams.webm -exec bash -c 'ffmpeg -i {} -c:a copy $(echo {} | sed 's/webm/opus/')' \;
+
+**** TODO Transcribe serially
+in bbb-whisper
+#+begin_src sh :eval no
+for SLUG in *; do
+ echo Processing $SLUG $(date -Iseconds) | tee -a bbb-whisper.log
+ (
+ cd $SLUG;
+ if [[ ! -f webcams.txt ]]; then
+ whisper --model large --language en --verbose True webcams.opus
+ else
+ echo "Skipping, already exists"
+ fi
+ )
+done
+#+end_src
+*** DONE Extract RMS Q&A from dump
+CLOSED: [2022-12-08 Thu 20:35]
+17:48 of current
+
+**** DONE Ffmpeg
+CLOSED: [2022-12-08 Thu 20:35]
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:18]
+:END:
+
+[19:26] <bandali> rsyncing the stream dumps from live0:/data/emacsconf-2022-* into fh-vm01:~orga/live0-streams/
+[19:26] <bandali> i'll probably rsync a copy to my own laptop as well, for backup
+[19:29] <bandali> a reminder that the stream dumps shouldn't be used as-is, and should first be remuxed using ffmpeg to fix the timestamps
+[19:30] <bandali> using something like this: ffmpeg -i myfile.webm -acodec copy -vcodec copy myfile-remuxed.webm >> myfile.log 2>&1
+
+*** DONE Extract orgvm talk
+CLOSED: [2022-12-08 Thu 20:35]
+*** DONE Post IRC logs to backstage so that volunteers can split them up
+CLOSED: [2022-12-06 Tue 09:55]
+
+See links at the top of backstage
+
+*** SOMEDAY Copy logs for analysis
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:41]
+:END:
+
+*** DONE Transcribe recordings
+CLOSED: [2022-12-15 Thu 00:40]
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:38]
+:END:
+
+*** DONE Collect recordings from bbb
+CLOSED: [2022-12-08 Thu 20:36]
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:38]
+:END:
+
+*** DONE Back up all the pads
+CLOSED: [2022-12-08 Thu 20:35] SCHEDULED: <2022-12-05 Mon>
+*** DONE Extract bbb chat and add to backstage
+CLOSED: [2022-12-08 Thu 20:35]
+:PROPERTIES:
+:CREATED: [2022-12-06 Tue 12:04]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-06 Tue 13:51]--[2022-12-06 Tue 22:11] => 8:20
+:END:
+
+*** SOMEDAY Awesome Speaker Diarization | awesome-diarization
+:PROPERTIES:
+:CREATED: [2022-12-06 Tue 12:00]
+:END:
+
+https://wq2012.github.io/awesome-diarization/
+
+*** SOMEDAY Document irc, bbb chat, pad tasks
+:PROPERTIES:
+:CREATED: [2022-12-05 Mon 15:36]
+:END:
+
+Experience level: no technical background needed; slightly easier if you've set up your computer for editing the wiki, which needs ssh and git
+
+There were lots of interesting notes and Q&A on IRC and the pad. If we can copy them to the talk page on the wiki, then we can catch any questions that hadn't been answered and forward feedback to the speaker. It's a little challenging because the IRC conversation might get mixed up when another talk starts, so it helps to read the IRC log and decide what lines to include. We usually remove names from the public log as well. Most of the conversations should be in the track-specific channels, but some might have ended up in #emacsconf as well.
+
+I've added IRC chat logs to the top of the backstage page, and each talk also links to the HTML (--pad.html) and Markdown (--pad.md) version of the pad.
+
+You can see the 2021 talks (ex: https://emacsconf.org/2021/talks/frownies/ , https://emacsconf.org/2021/talks/pattern/ ) for an example of how the discussions were archived on the talk pages. Sometimes we organize them by type of comment, so it's easy to see Q&A vs. notes vs. feedback about the talk itself.
+
+To avoid duplicating work, maybe we can use this Etherpad to call dibs on talks to process. You can write your name or nick next to the talk(s) you're archiving.
+
+If you're already set up to edit the wiki or you can figure out the slightly complicated setup for editing, feel free to edit the page directly. If not, you can email a Markdown or Org Mode snippet to emacsconf-submit@gnu.org and let me know what page to put it on.
+
+*** STARTED Write some code to copy the events.xml to the backstage
+:PROPERTIES:
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-11 Sun 14:14]
+:END:
+
+recording timestamp is 2022-12-03T09:41:30.888-08
+bandali user ID is w_uwwpzp4fjtqq
+joined 2022-12-03T10:07:06.066-08
+aaaaaah, hmm. recording timestamp seems earlier, that might just be when BBB starts the whole thing.
+aha! The raw directory has the whole thing, not just the recorded part, and the recording timestamp is the beginning of the meeting. So let's find out where the actual recording starts.
+
+Maybe StartWebRTCShareEvent ?
+ParticipantStatusChangeEvent might be the webcam start.
+Is it DeskShareStartRTMP ?
+
+*** TODO [#C] Improve visualization for Q&A sessions, especially when there's nothing else to look at
+**** SOMEDAY Consider the challenge of aligning video segments with a timeline
+:PROPERTIES:
+:CREATED: [2022-12-08 Thu 16:31]
+:END:
+
+**** SOMEDAY windows - Reducing command-line shortcomings caused by excessive number of FFmpeg inputs - Super User
+:PROPERTIES:
+:CREATED: [2022-12-09 Fri 20:24]
+:END:
+
+https://superuser.com/questions/1369843/reducing-command-line-shortcomings-caused-by-excessive-number-of-ffmpeg-inputs
+
+**** SOMEDAY kkroening/ffmpeg-python: Python bindings for FFmpeg - with complex filtering support
+:PROPERTIES:
+:CREATED: [2022-12-09 Fri 20:26]
+:END:
+
+https://github.com/kkroening/ffmpeg-python
+
+**** SOMEDAY Extension repository - Inkscape Wiki
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:59]
+:END:
+
+https://wiki.inkscape.org/wiki/index.php/Extension_repository#Generator
+
+**** SOMEDAY how to render a long text in an area with automatic wrap - Legacy ImageMagick Discussions Archive
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 23:01]
+:END:
+
+https://www.imagemagick.org/discourse-server/viewtopic.php?t=27325
+
+**** SOMEDAY svg to tex with svg package and inkscape: make the text to wrap inside a shape - TeX - LaTeX Stack Exchange
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:58]
+:END:
+
+https://tex.stackexchange.com/questions/325711/svg-to-tex-with-svg-package-and-inkscape-make-the-text-to-wrap-inside-a-shape
+
+**** SOMEDAY tikz API documentation
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:40]
+:END:
+
+https://allefeld.github.io/pytikz/tikz/
+
+**** SOMEDAY tikz pgf - Absolute positioning in beamer - TeX - LaTeX Stack Exchange
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:36]
+:END:
+
+https://tex.stackexchange.com/questions/6185/absolute-positioning-in-beamer
+
+**** SOMEDAY CTAN: Package textpos
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:36]
+:END:
+
+https://ctan.org/pkg/textpos
+
+**** SOMEDAY positioning - How do I put some text in specific position on a page horizontally with the prosper class? - TeX - LaTeX Stack Exchange
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:34]
+:END:
+
+https://tex.stackexchange.com/questions/35602/how-do-i-put-some-text-in-specific-position-on-a-page-horizontally-with-the-pros
+
+**** SOMEDAY Exporting LaTeX TikZ as Image Files | Baeldung on Computer Science
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:33]
+:END:
+
+https://www.baeldung.com/cs/exporting-tikz-as-images
+
+**** SOMEDAY OpenAI Whisper tutorial: Whisper - Transcription and diarization (speaker identification) | LabLab
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:23]
+:END:
+
+https://lablab.ai/t/whisper-transcription-and-speaker-identification
+
+**** TODO Consider ffmpeg to make speaker labels so that I can overlay them on webcams.webm
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 21:53]
+:END:
+
+**** TODO could be fancy to have an FFMPEG compose the videos with names and webcams on the right side
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 14:41]
+:END:
+
+**** SOMEDAY Try using the single webcam view of the speaker
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 18:03]
+:END:
+
+*** SOMEDAY Think about how I want to format the VTT for the RMS Q&A
+:PROPERTIES:
+:CREATED: [2022-12-08 Thu 13:53]
+:END:
+
+**** SOMEDAY Use word data, maybe reflow based on it
+:PROPERTIES:
+:CREATED: [2022-12-08 Thu 18:35]
+:END:
+*** SOMEDAY Combine webcams and deskshare
+:PROPERTIES:
+:CREATED: [2022-12-09 Fri 21:24]
+:END:
+
+*** TODO Extract comments from IRC
+**** SOMEDAY Auto-add A: marker for speaker
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 22:19]
+:END:
+
+*** DONE compare deskshare with webcams
+
+#+begin_src emacs-lisp :eval no
+(mapcar (lambda (o)
+ (cons (emacsconf-get-slug-from-string o)
+ (- (compile-media-get-file-duration-ms o)
+ (compile-media-get-file-duration-ms (replace-regexp-in-string "deskshare" "webcams" o))) )
+
+ )
+ (directory-files emacsconf-cache-dir t "-deskshare.webm"))
+#+end_src
+
+#+RESULTS:
+:results:
+((/home/sacha/proj/emacsconf/cache/emacsconf-2022-async--emacs-was-async-before-async-was-cool--michael-herstine--bbb-deskshare.webm . -9.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-buttons--linking-personal-info-with-hyperbole-implicit-buttons--mats-lidell--bbb-deskshare.webm . -7.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-dbus--the-wheels-on-dbus--ian-eure--bbb-deskshare.webm . -24.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-grail--graila-generalized-representation-and-aggregation-of-information-layers--sameer-pradhan--bbb-deskshare.webm . -8.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-mail--revisiting-the-anatomy-of-emacs-mail-user-agents--mohsen-banan--bbb-deskshare.webm . -7.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--bbb-deskshare.webm . 12.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-rde--rde-emacs-introduction--andrew-tropin--bbb-deskshare.webm . -49.0) (/home/sacha/proj/emacsconf/cache/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--bbb-deskshare.webm . 5.0))
+:end:
+
+*** Improve segmented audio normalization
+**** SOMEDAY How to normalize the volume of an audio file in python? - Stack Overflow
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 21:03]
+:END:
+
+https://stackoverflow.com/questions/42492246/how-to-normalize-the-volume-of-an-audio-file-in-python
+
+
+**** SOMEDAY Execute Macro from Script - Audacity Forum
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 20:59]
+:END:
+
+https://forum.audacityteam.org/viewtopic.php?t=121821
+
+*** TODO subtitle hyperorg
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 20:07]
+:END:
+
+*** DONE Check duration
+
+#+begin_src emacs-lisp :eval no
+(/ (apply '+
+ (mapcar #'compile-media-get-file-duration-ms
+ (directory-files emacsconf-cache-dir t "\\(main\\|webcams\\).webm\\|rms.*ogg")))
+ 3600000.0)
+#+end_src
+
+28.860543888888888
+
+- 29 hours including Q&A
+- 14 hours of talks, 15 hours of Q&A
+
+
+(* 28 0.0075 60)
+12.6
+
+*** SOMEDAY Copy irc, haven't actually done that yet
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 15:39]
+:END:
+
+*** SOMEDAY [#C] Create harvesting etherpad if needed to track the status?
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 18:53]
+:END:
+
+*** DONE Update task status now that I have TO_REVIEW_QA, TO_INDEX_QA, TO_CAPTION_QA
+CLOSED: [2022-12-13 Tue 09:55]
+:LOGBOOK:
+- State "DONE" from "TODO" [2022-12-13 Tue 09:55]
+:END:
+
+#+begin_src emacs-lisp :eval no
+(with-current-buffer (find-file-noselect emacsconf-org-file)
+ (org-map-entries
+ (lambda ()
+ (if (file-exists-p (expand-file-name (concat (org-entry-get (point) "VIDEO_SLUG") "--answers.webm")
+ emacsconf-cache-dir))
+ (org-todo "TO_INDEX_QA")
+ (org-todo "TO_REVIEW_QA")))
+ "TODO=\"TO_ARCHIVE\"+SLUG={.}")
+ )
+
+(with-current-buffer (find-file-noselect emacsconf-org-file)
+ (org-map-entries
+ (lambda ()
+ (unless (file-exists-p (expand-file-name (concat (org-entry-get (point) "VIDEO_SLUG") "--bbb-webcams.webm")
+ emacsconf-cache-dir))
+ (org-todo "TO_ARCHIVE")))
+ "TODO=\"TO_REVIEW_QA\"+SLUG={.}")
+ )
+#+end_src
+
+*** TODO consider number-anonymizing the IRC chat
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 09:34]
+:END:
+
+*** TODO switch to resources view
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 01:16]
+:END:
+*** TODO Harvest the closing remarks
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 00:59]
+:END:
+*** TODO Check normalization of answers
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 00:11]
+:END:
+https://stackoverflow.com/questions/42492246/how-to-normalize-the-volume-of-an-audio-file-in-python
+**** SOMEDAY Scripting - Audacity Manual
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 00:02]
+:END:
+
+https://manual.audacityteam.org/man/scripting.html
+
+*** SOMEDAY Post transcripts, start working on chapter workflow
+:PROPERTIES:
+:CREATED: [2022-12-14 Wed 22:24]
+:END:
+
+*** SOMEDAY Add audio-only handler for media card
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 01:18]
+:END:
+
+*** SOMEDAY How to chunk text into paragraphs using python | by N Polovinkin | Medium
+:PROPERTIES:
+:CREATED: [2022-12-14 Wed 17:17]
+:END:
+
+https://medium.com/@npolovinkin/how-to-chunk-text-into-paragraphs-using-python-8ae66be38ea6
+
+*** STARTED Figure out ways to make sense of IRC logs
+:PROPERTIES:
+:CREATED: [2022-12-13 Tue 16:37]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-20 Tue 10:34]--[2022-12-20 Tue 13:16] => 2:42
+:END:
+ssh
+Possible: thread speaker messages?
+Manual:
+- search backward to find the lines, put something under
+- avy to indent it under that line
+- use properties to suggest lines
+- copy everything, use Emacs News code to refile entries
+- anonymize after
+
+*** TODO improve nil note for missing resources
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 16:52]
+:END:
+*** CANCELLED Trim grail if needed
+CLOSED: [2022-12-16 Fri 21:35]
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 22:24]
+:END:
+*** DONE I uploaded the Q&A sessions to Toobnix. :sachac:
+CLOSED: [2022-12-16 Fri 13:53]
+:LOGBOOK:
+- State "DONE" from "TODO" [2022-12-16 Fri 13:53]
+:END:
+
+Least extra work if I do it after chapter markers, but I can just do them now and then update them later
+
+#+begin_src emacs-lisp :eval yes
+(mapc (lambda (o)
+ (let ((default-directory "~/vendor/PeerTube/"))
+ (when (emacsconf-publish-upload-answers o 'toobnix)
+ (emacsconf-go-to-talk o)
+ (shell-command "xdotool mousemove 1782 370 click 1 sleep 1 key Ctrl+r sleep 4 mousemove 1584 546 click 3 sleep 1 mousemove 1664 746 click 1 mousemove 1584 546 sleep 1 key Alt+Tab sleep 1")
+ (org-entry-put
+ (point) "QA_TOOBNIX"
+ (read-string (format "URL for %s: "
+ (org-entry-get (point) "SLUG")))))))
+ (seq-remove
+ (lambda (o)
+ (or (null (emacsconf-talk-file o "--answers.webm"))
+ (plist-get o :qa-toobnix)))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+#+end_src
+*** DONE Upload answers to Youtube :sachac:
+CLOSED: [2022-12-16 Fri 21:35] SCHEDULED: <2022-12-17 Sat>
+:PROPERTIES:
+:CREATED: [2022-12-16 Fri 08:01]
+:header-args: :eval no
+:END:
+:LOGBOOK:
+- State "WAITING" from "SOMEDAY" [2022-12-16 Fri 12:58] \\
+ quota
+:END:
+
+Set eval to yes and work carefully.
+
+#+NAME: not-done
+#+begin_src emacs-lisp
+(defun emacsconf-publish-answers-python (talk)
+ (interactive)
+ (concat "filename = \"\"\"" (emacsconf-talk-file talk "--answers.webm") "\"\"\"\n"
+ "title = \"\"\"" (emacsconf-publish-answers-title talk 100) "\"\"\"\n"
+ "description = \"\"\"" (emacsconf-publish-answers-description talk 'youtube) "\"\"\"\n"))
+(plist-get
+ (seq-find (lambda (talk)
+ (not (or (null (emacsconf-talk-file talk "--answers.webm"))
+ (plist-get talk :qa-youtube))))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info)))
+ :slug)
+
+
+#+end_src
+
+#+RESULTS: not-done
+:results:
+nil
+:end:
+:end:
+
+quota, continue tomorrow
+**** Setup
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays
+from playwright.sync_api import Playwright, sync_playwright, expect
+from pathlib import Path
+import json
+
+playwright = sync_playwright().start()
+browser = playwright.firefox.launch(headless=False)
+context = browser.new_context()
+page = context.new_page()
+context.add_cookies(json.loads(Path("cookies.json").read_text()))
+page.goto("https://studio.youtube.com/")
+#+end_src
+
+#+RESULTS:
+:results:
+<Response url='https://studio.youtube.com/' request=<Request url='https://studio.youtube.com/' method='GET'>>
+:end:
+
+Save the cookies after it's all set up
+
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays
+Path("cookies.json").write_text(json.dumps(cookies))
+#+end_src
+
+#+RESULTS:
+:results:
+:end:
+
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays
+context.add_cookies(json.loads(Path("cookies.json").read_text()))
+page.goto("https://studio.youtube.com/channel/UCwuyodzTl_KdEKNuJmeo99A")
+#+end_src
+
+
+#+RESULTS:
+:results:
+:end:
+
+1. Upload the file
+
+#+NAME: create
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays :noweb yes :results silent
+#page.get_by_role("dialog", name="Video processing").get_by_role("button", name="Close").click()
+page.locator("#create-icon").click()
+page.get_by_text("Upload videos").click()
+page.get_by_role("button", name="Select files").click()
+<<talk()>>
+#+end_src
+
+2. Set the talk details and copy the URL.
+
+#+begin_src emacs-lisp :var slug=not-done :var url=set_details :results silent
+(save-window-excursion
+ (emacsconf-go-to-talk (emacsconf-resolve-talk slug))
+ (org-entry-put (point) "QA_YOUTUBE" url))
+#+end_src
+***** Background code
+#+NAME: talk
+#+begin_src emacs-lisp :var slug=not-done :noweb yes
+(let ((talk (emacsconf-resolve-talk slug)))
+ (kill-new (emacsconf-talk-file talk "--answers.webm"))
+ (emacsconf-publish-answers-python talk))
+#+end_src
+
+#+RESULTS: talk
+:results:
+filename = """/home/sacha/proj/emacsconf/cache/emacsconf-2022-health--health-data-journaling-and-visualization-with-org-mode-and-gnuplot--david-otoole--answers.webm"""
+title = """EmacsConf 2022 Q&A: Health data journaling and visualization with Org Mode and gnuplot"""
+description = """David O'Toole (he/him)
+
+This is the Q&A for the talk at https://youtu.be/YmQ1CYMz-OY .
+
+You can view this and other resources using free/libre software at https://emacsconf.org/2022/talks/health .
+This video is available under the terms of the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
+"""
+:end:
+
+#+NAME: set_details
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays :results output :noweb yes
+<<talk()>>
+page.locator("#title-textarea").click()
+page.keyboard.press("Control+KeyA")
+page.keyboard.press("Delete")
+page.keyboard.type(title)
+page.locator("#description-textarea #textbox").fill(description)
+page.locator('ytcp-video-metadata-playlists .dropdown-trigger-text').click()
+page.get_by_role("dialog", name="Choose playlists").get_by_text("EmacsConf 2022").click()
+page.get_by_role("button", name="Done").click()
+page.get_by_role("button", name="Show more").click()
+page.get_by_placeholder("Add tag").fill("emacs, emacsconf, answers")
+page.get_by_placeholder("Add tag").click()
+href = page.locator('a.ytcp-video-info').get_attribute('href')
+page.locator("#step-badge-3").click()
+page.locator(".ytcp-video-visibility-select[name=PUBLIC]").click()
+page.get_by_role("button", name="PUBLISH").click()
+print(href)
+#+end_src
+
+#+RESULTS: set_details
+:results:
+https://youtu.be/XTDpzx9QHSI
+:end:
+
+#+RESULTS:
+:results:
+https://youtu.be/Q453L_whGEc
+:end:
+
+*** TODO Add links to Q&A to Youtube video descriptions
+:PROPERTIES:
+:CREATED: [2022-12-16 Fri 14:12]
+:END:
+
+*** SOMEDAY Make a podcast feed of the talks
+:PROPERTIES:
+:CREATED: [2022-12-17 Sat 14:26]
+:END:
+
+*** TODO Check that webms have latest vtts
+:PROPERTIES:
+:CREATED: [2022-12-17 Sat 08:09]
+:END:
+
+*** TODO Break autocaptions every 5 minutes or so, so that they can be included on the webpage
+SCHEDULED: <2022-12-20 Tue>
+:PROPERTIES:
+:CREATED: [2022-12-15 Thu 22:05]
+:END:
+
+*** DONE Add maint chapter markers to Toobnix and Youtube, automate it
+:PROPERTIES:
+:CREATED: [2022-12-21 Wed 09:45]
+:Effort: 1:00
+:QUANTIFIED: Emacs
+:END:
+:LOGBOOK:
+- State "DONE" from "STARTED" [2022-12-21 Wed 10:30]
+CLOCK: [2022-12-21 Wed 10:06]--[2022-12-21 Wed 10:30] => 0:24
+:END:
+
+#+NAME: answers-chapters
+#+begin_src emacs-lisp :eval no
+(setq talk (emacsconf-resolve-talk "maint"))
+(replace-regexp-in-string
+ "\\\\" "\\\\\\\\"
+ (json-encode
+ (list
+ :qa-youtube (plist-get talk :qa-youtube)
+ :qa-toobnix (plist-get talk :qa-toobnix)
+ :slug (plist-get talk :slug)
+ :answers-description-youtube (emacsconf-publish-answers-description talk 'youtube)
+ :answers-description-toobnix (emacsconf-publish-answers-description talk 'youtube))))
+#+end_src
+
+Update YouTube
+
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays :var talk_json=answers-chapters :noweb yes :results output
+from playwright.sync_api import Playwright, sync_playwright, expect
+from pathlib import Path
+import json
+import re
+
+talk = json.loads("""<<talk()>>""")
+playwright = sync_playwright().start()
+browser = playwright.firefox.launch(headless=False)
+context = browser.new_context()
+page = context.new_page()
+context.add_cookies(json.loads(Path("cookies.json").read_text()))
+m = re.search("[^/=]+$", talk['qa-youtube'])
+page.goto("https://studio.youtube.com/video/" + m.group(0) + "/edit")
+page.locator("#description-textarea #textbox").fill(talk['answers-description-youtube'])
+ page.get_by_role('button', name="Save").click()
+#+end_src
+
+Update Toobnix:
+
+#+begin_src python :dir "/home/sacha/proj/plays" :session plays :var talk_json=answers-chapters :noweb yes :results output
+talk = json.loads("""<<talk()>>""")
+m = re.search("[^/=]+$", talk['qa-youtube'])
+page.goto("https://toobnix.org/videos/update/" + m.group(0))
+page.locator("#description").fill(talk['answers-description-toobnix'])
+page.locator('.orange-button').click()
+#+end_src
+
+
+#+RESULTS:
+:results:
+:end:
+
+** TODO Send thanks
+:PROPERTIES:
+:CUSTOM_ID: thanks
+:END:
+*** TODO Send thank-you notes to speakers
+
+Dependencies:
+- youtube, toobnix urls
+- bbb playback urls
+- pads copied
+
+ #+begin_src emacs-lisp
+(defvar emacsconf-mail-thank-speaker-open-youtube t
+ "If non-nil, browse to the YouTube page so we can mention views and stuff.")
+
+(defun emacsconf-mail-thank-speaker (group &optional template)
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (delete-other-windows)
+ (with-selected-window
+ (split-window-right)
+ (emacsconf-edit-wiki-page (plist-get (cadr group) :slug))
+ (when (> (length (cdr group)) 1)
+ (mapc
+ (lambda (talk)
+ (with-selected-window (split-window-below)
+ (emacsconf-edit-wiki-page (plist-get talk :slug))))
+ (cddr group))
+ (balance-windows)))
+ (let ((with-bbb (seq-filter (lambda (talk) (plist-get talk :bbb-playback)) (cdr group))))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "thanks-speaker"))
+ (car group)
+ (list
+ :email (car group)
+ :conf-name emacsconf-name
+ :year
+ emacsconf-year
+ :plural
+ (if (= (length (cdr group)) 1) "" "s")
+ :video-is
+ (if (= (length (cdr group)) 1) "video is" "videos are")
+ :bbb-note
+ (if with-bbb
+ (concat
+ " We'd like to publish the audio (and possibly the video as well)
+ with chapter markers and maybe even captions, depending on
+ volunteers. In case you want to revisit your Q&A session in
+ order to remember anything particularly cool that you'd like to
+ follow up on (or anything particularly sensitive/embarrassing
+ that you'd like us to omit), you can view the BigBlueButton
+ playback at " (mapconcat (lambda (talk) (plist-get talk :bbb-playback)) with-bbb " , ") " . Volunteers will be working on harvesting the Q&A over the next few weeks/months. If you'd like to help with the processing, I've added the files
+to ${backstage} and documented our harvesting process at
+https://emacsconf.org/harvesting/ . The files start with --bbb in the backstage area. This is
+totally optional and just there in case you feel like taking advantage
+of it. =)")
+ "")
+ :backstage
+ (mapconcat (lambda (talk)
+ (concat "https://media.emacsconf.org/" emacsconf-year "/backstage/#" (plist-get talk :slug)))
+ (cdr group) " , ")
+ :urls
+ (mapconcat (lambda (talk)
+ (plist-get talk :absolute-url))
+ (cdr group) " , ")
+ :toobnix-url
+ (mapconcat (lambda (talk)
+ (plist-get talk :toobnix-url))
+ (cdr group) " , ")
+ :youtube-url
+ (mapconcat (lambda (talk)
+ (plist-get talk :youtube-url))
+ (cdr group) " , ")
+ :speakers-short (plist-get (cadr group) :speakers-short)))
+ (when emacsconf-mail-thank-speaker-open-youtube
+ (mapc (lambda (talk)
+ (when (plist-get talk :youtube-url)) (browse-url (plist-get talk :youtube-url)))
+ (cdr group)))))
+ #+end_src
+
+**** Template
+:PROPERTIES:
+:EMAIL_ID: thanks-speaker
+:TO: ${email}
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}, sacha@sachachua.com
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}, sacha@sachachua.com
+:FUNCTION: emacsconf-mail-thank-speaker
+:CC: emacsconf-submit@gnu.org
+:LOG_NOTE: thanked speaker
+:SUBJECT: ${conf-name} ${year}: Thank you for presenting
+:END:
+
+Hi, ${speakers-short}!
+
+Thank you so much for being part of EmacsConf ${year}! Hundreds of
+people enjoyed it, and I'm sure even more will come across the videos
+in the days to follow.
+
+Your ${video-is} available on the talk page${plural} at ${urls} , and
+we've added the discussions from Etherpad/IRC.${bbb-note}${wrap}
+
+We've also uploaded your talk video${plural} to Toobnix (a PeerTube
+instance) at ${toobnix-url} and YouTube at ${youtube-url} . If you
+want to reupload the video to your own channel, please feel free to do
+so. If you let me know where you've uploaded it, I think I can switch
+our playlist to include your version of the video instead. That way,
+it might be easier for you to respond to comments on videos.${wrap}
+
+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!
+
+Sacha
+
+
+*** TODO Send thank-you notes to volunteers
+** STARTED Finalize the files to be used for streaming
+SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CUSTOM_ID: files
+:Effort: 0:15
+:END:
+
+Verify that all the files load
+
+#+begin_src emacs-lisp :results replace
+(let ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (mapconcat
+ (lambda (track)
+ (concat "- " (plist-get track :name) "\n"
+ (mapconcat
+ (lambda (talk)
+ (if (plist-get talk :video-file)
+ (format " - [ ] [[elisp:(emacsconf-stream-play-talk-on-change \"%s\")][Play %s]]\n"
+ (plist-get talk :slug) (plist-get talk :slug))
+ ""))
+ (emacsconf-filter-talks-by-track track info))))
+ emacsconf-tracks))
+#+end_src
+
+#+RESULTS:
+:results:
+- General
+- Development
+:end:
+
+How about the ones that might be live
+#+begin_src emacs-lisp :results replace
+(let ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (mapconcat
+ (lambda (track)
+ (concat "- " (plist-get track :name) "\n"
+ (mapconcat
+ (lambda (talk)
+ (if (null (plist-get talk :video-file))
+ (format " - [ ] [[elisp:(emacsconf-stream-play-talk-on-change \"%s\")][Play %s]]\n"
+ (plist-get talk :slug) (plist-get talk :slug))
+ ""))
+ (emacsconf-filter-talks-by-track track info))))
+ emacsconf-tracks))
+#+end_src
+
+#+RESULTS:
+:results:
+- General
+- Development
+:end:
+
+*** TODO Fix my audio volume for intros
+*** DONE [#C] Remove first eight seconds of Jupyter if possible, and the last 16 seconds or so
+CLOSED: [2022-12-02 Fri 10:27] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 21:53]
+:END:
+:LOGBOOK:
+- State "WAITING" from "TODO" [2022-12-02 Fri 08:00] \\
+ waiting for ffmpeg to finish
+:END:
+
+screen -S jupyter-trim ffmpeg -y -ss 8 -to 00:16:40 -i emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--final.webm emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--trimmed.webm
+*** TODO Regenerate overlays to accommodate different layout
+
+** [#A] Look for ways to reduce risk :derisk:
+:PROPERTIES:
+:CUSTOM_ID: derisk
+:END:
+https://pad.emacsconf.org/premortem
+*** DONE [#C] Click on stuff with xdotool
+CLOSED: [2022-12-01 Thu 08:29]
+
+(emacsconf-stream-bbb "journalism")
+(emacsconf-stream-xdotool-set-up-bbb "journalism")
+;; get into backstage area
+xdotool mousemove 806 385 click 1
+
+(progn
+)
+
+(let ((pos (emacsconf-stream-xdotool "General" "getmouselocation")))
+ (when (string-match "x:\\([0-9]+\\) y:\\([0-9]+\\)" pos)
+ (insert (format "(emacsconf-stream-xdotool \"General\" \"mousemove %s %s click 1\")\n" (match-string 1 pos) (match-string 2 pos)))))
+
+
+
+
+(emacsconf-stream-track-ssh
+ (emacsconf-get-track "General")
+ (split-string "xdotool "))
+
+
+xdotool mousemove 253 176 click 1
+xdotool mousemove 215 164 click 1
+xdotool key f11
+*** DONE [#A] Make copyable version of bbb redirect :derisk:
+CLOSED: [2022-11-22 Tue 10:06] SCHEDULED: <2022-11-21 Mon>
+:PROPERTIES:
+:CREATED: [2022-11-21 Mon 06:45]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-22 Tue 08:37]--[2022-11-22 Tue 10:06] => 1:29
+:END:
+*** DONE Make sure all the important tasks are scheduled over the next two weeks
+CLOSED: [2022-11-21 Mon 14:49] SCHEDULED: <2022-11-21 Mon>
+:PROPERTIES:
+:Effort: 0:30
+:QUANTIFIED: Emacs
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-21 Mon 13:17]--[2022-11-21 Mon 13:56] => 0:39
+:END:
+
+#+begin_src emacs-lisp :eval yes
+(defun emacsconf-prep-agenda ()
+ (interactive)
+ (let* ((notebook (expand-file-name "index.org" (expand-file-name "organizers-notebook" (expand-file-name emacsconf-year emacsconf-directory))))
+ (org-agenda-custom-commands
+ `(("a" "Agenda"
+ ((tags-todo "-PRIORITY=\"C\"-SCHEDULED={.}-nextyear"
+ ((org-agenda-files (list ,notebook))))
+ (agenda ""
+ ((org-agenda-files (list ,notebook))
+ (org-agenda-span 7)))
+ )))))
+ (org-agenda nil "a")))
+#+end_src
+*** DONE Try a reboot before the resize :sachac:
+CLOSED: [2022-12-02 Fri 09:06] SCHEDULED: <2022-12-02 Fri>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 12:48]
+ :END:
+
+- After rebooting live0, we should still be able to:
+ - [X] SSH to it
+ - [X] Stream gen to it
+ - [X] Start up the fallbacks: screen-fallbacks
+ - test: mpv https://live0.emacsconf.org/gen-fallback.webm
+ - [X] Play gen stream: mpv https://live0.emacsconf.org/gen.webm
+ - [X] Play gen 480p stream: mpv https://live0.emacsconf.org/gen-480p.webm
+ - [X] Go to watch page for gen:
+ - https://emacsconf.org/2022/watch/gen/
+ - https://live.emacsconf.org/2022/watch/gen/
+ - [X] Start test restream to toobnix
+ - screen-restream-test-toobnix.sh
+ - https://toobnix.org/w/dmibQFkBTNcJyTVVQTyd5C
+ - Test dev as well (optional)
+ - [X] Stream dev to it
+ - [X] Play dev stream
+ - [X] Play dev 480p stream
+ - [X] Go to watch page for dev
+- After rebooting front0, we should still be able to:
+ - [X] View the wiki https://emacsconf.org/2022/
+ - [X] Update the status page [[file:/ssh:front0.emacsconf.org:/var/www/status.emacsconf.org/index.html][edit]] https://status.emacsconf.org
+ - [ ] Go to the pad: https://pad.emacsconf.org/2022
+
+*** DONE [#A] icecast fallback :derisk:sachac:
+SCHEDULED: <2022-11-28 Mon>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 12:51]
+ :Effort: 1:00
+ :QUANTIFIED: Emacs
+ :CUSTOM_ID: fallback
+ :END:
+:LOGBOOK:
+CLOCK: [2022-11-27 Sun 15:30]
+:END:
+**** Creating the files
+ffmpeg -y -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -loop 1 -r 20 -t 10 -i sorry.png -c:v libvpx -c:a libvorbis -color_primaries 1 -color_trc 1 -colorspace 1 -crf 30 -g 120 -minrate 1.5M -b:v 1500 -g 120 -maxrate 1.5M -cluster_time_limit 5100 -shortest sorry.webm
+
+ffmpeg -y -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -loop 1 -r 20 -t 10 -i sorry.png -vf scale=854:480 -c:v libvpx -c:a libvorbis -color_primaries 1 -color_trc 1 -colorspace 1 -crf 30 -g 120 -minrate 1.5M -b:v 1500 -g 120 -maxrate 1.5M -cluster_time_limit 5100 -shortest sorry-480p.webm
+
+icecast 2.4.4
+ Stream #0:0: Video: vp8, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 20 fps, 20 tbr, 1k tbn, 1k tbc (default)
+ Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
+
+ Okay. I can ffmpeg to /gen-sorry.webm with
+ orga@live0:/usr/share/icecast2/web$ ffmpeg -r 20 -re -stream_loop -1 -i gen-fallback.webm -f webm -content_type video/webm -c:a copy -c:v copy icecast://emacsconf:$PASSWORD@localhost:8001/gen-sorry.webm
+***** TODO [#C] Add test pattern to part of the screen
+***** gen
+
+Input #0, matroska,webm, from 'http://live0.emacsconf.org:8001/gen.webm':
+ Metadata:
+ ENCODER : Lavf58.20.100
+ icy-pub : 0
+ icy-metadata : 1
+ Duration: N/A, start: 39.061000, bitrate: N/A
+ Stream #0:0: Video: vp8, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 20 fps, 20 tbr, 1k tbn, 1k tbc (default)
+ Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
+
+***** fallback
+
+Input #0, matroska,webm, from 'http://live0.emacsconf.org:8001/gen.webm':
+ Metadata:
+ ENCODER : Lavf58.20.100
+ icy-pub : 0
+ icy-metadata : 1
+ Duration: N/A, start: 19.473000, bitrate: N/A
+ Stream #0:0: Video: vp8, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 20 fps, 20 tbr, 1k tbn, 1k tbc (default)
+ Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
+**** DONE Create fallback for 480p as well
+CLOSED: [2022-11-28 Mon 19:59]
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-28 Mon 19:00]--[2022-11-28 Mon 19:59] => 0:59
+:END:
+**** DONE Create fallback video
+ CLOSED: [2022-11-27 Sun 16:25]
+:LOGBOOK:
+- State "DONE" from "TODO" [2022-11-27 Sun 16:25]
+:END:
+**** DONE Add more ffmpeg options from the OBS profile to try to get them to match as closely as possible
+CLOSED: [2022-11-28 Mon 14:24] SCHEDULED: <2022-11-28 Mon>
+:PROPERTIES:
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-28 Mon 13:24]--[2022-11-28 Mon 13:41] => 0:17
+:END:
+**** DONE Detect fallback and reload the video player
+CLOSED: [2022-11-28 Mon 14:46] SCHEDULED: <2022-11-28 Mon>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 17:53]
+ :Effort: 0:30
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-28 Mon 14:24]--[2022-11-28 Mon 14:46] => 0:22
+ :END:
+
+https://stackoverflow.com/questions/36280764/audio-stops-playing-while-moving-to-fallback-mount-using-icecast#36332739
+
+#+begin_src js :eval no
+ // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0
+ // Copyright (c) 2022 Sacha Chua - CC0 Public Domain
+var video = document.querySelector('video.reload');
+if (video) {
+ var myVar = setInterval(reloadAsNeeded, 1000);
+ var oldTime = '';
+ function reloadAsNeeded() {
+ if ((video.paused != true && (video.currentTime - oldTime) == 0 && video.currentTime != 0)) {
+ var source = video.querySelector('source');
+ var oldVideo = source.src;
+ source.src = '';
+ source.src = oldVideo;
+ video.load();
+ video.play();
+ }
+ oldTime = video.currentTime;
+ };
+}
+// @license-end
+#+end_src
+*** DONE [#A] Make sure things are okay for me to handle both streams :sachac:
+CLOSED: [2022-11-29 Tue 14:51] SCHEDULED: <2022-11-29 Tue>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 12:41]
+ :CUSTOM_ID: both
+ :END:
+**** DONE Add keyboard shortcuts
+CLOSED: [2022-11-29 Tue 08:17] SCHEDULED: <2022-11-30 Wed>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-29 Tue 08:04]--[2022-11-29 Tue 08:17] => 0:13
+:END:
+
+
+| S-g | gen VNC |
+| S-d | dev VNC |
+| S-G | gen console |
+| S-D | dev console |
+| S-o | orga@res console |
+
+**** DONE figure out left/right to keep track of both streams
+CLOSED: [2022-11-29 Tue 08:02] SCHEDULED: <2022-11-28 Mon>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 12:20]
+ :Effort: 0:30
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-29 Tue 07:50]--[2022-11-29 Tue 08:02] => 0:12
+ :END:
+
+ I'm just going to do this with pavucontrol so that it's not too complicated
+
+**** CANCELLED [#C] Tweak my audio setup for push-to-talk?
+CLOSED: [2022-11-29 Tue 14:51] SCHEDULED: <2022-11-30 Wed>
+https://news.ycombinator.com/item?id=23160101
+https://gist.github.com/zouppen/bdd40a42c77ca387fae8bace0f2ed3e0
+
+**** DONE [#B] Guard against over-announcing by paying attention to erc
+CLOSED: [2022-11-29 Tue 14:50] SCHEDULED: <2022-11-29 Tue>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 18:32]
+ :Effort: 0:45
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-29 Tue 12:49]--[2022-11-29 Tue 14:50] => 2:01
+ CLOCK: [2022-11-29 Tue 08:18]--[2022-11-29 Tue 08:27] => 0:09
+ CLOCK: [2022-11-29 Tue 08:03]--[2022-11-29 Tue 08:03] => 0:00
+ :END:
+
+Goal: Don't spam the channel with talk announcements
+
+If it was announced in the last 5 minutes, don't reannounce it as part
+of the hook, but allow reannouncements if called manually.
+
+How to detect announcements:
+
+
+If it was the most recently announced talk in the channel, don't re-announce it
+
+(with-eval-after-load 'erc (add-hook 'erc-insert-pre-hook 'emacsconf-erc-notice-announcements))
+
+** CANCELLED [#C] Make checkin and Q&A process slide :sachac:
+CLOSED: [2022-12-06 Tue 10:01]
+ :PROPERTIES:
+ :CREATED: [2022-11-20 Sun 10:04]
+ :Effort: 0:30
+ :CUSTOM_ID: qa
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-22 Tue 11:38]--[2022-11-23 Wed 09:37] => 21:59
+ :END:
+Low-priority because people were able to manage fine last year
+Even better if we can add in-between slides (ex:
+https://media.emacsconf.org/2022/in-between/journalism) for slide #2
+
+asked corwin about access to bbb.emacsverse.org because uploading
+presentations seems to not work on our instance. In the meantime, we
+can paste in https://emacsconf.org/2022/qa/ for tips.
+
+** [#B] Caption talks and make chapter headings
+:PROPERTIES:
+:CUSTOM_ID: caption
+:END:
+*** DONE Nudge volunteers to e-mail me captions by Dec 1 :mail:sachac:
+CLOSED: [2022-11-28 Mon 13:23] SCHEDULED: <2022-11-28 Mon>
+*** DONE [#C] Copy chapter headings for mail talk :emacsconf:captions:
+CLOSED: [2022-11-28 Mon 00:23]
+:PROPERTIES:
+:CREATED: [2022-11-21 Mon 20:50]
+:END:
+
+*** DONE Caption the new talks :sachac:
+CLOSED: [2022-12-01 Thu 12:39] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:47]
+:END:
+** [#A] Prepare intros for the hosts to read
+:PROPERTIES:
+:CUSTOM_ID: host-intros
+:END:
+https://pad.emacsconf.org/intros
+also in :INTRO_NOTE: in conf.org so that we can plop it into the hyperlists.
+*** DONE Write intros for all the other talks
+CLOSED: [2022-11-28 Mon 00:22] SCHEDULED: <2022-11-28 Mon>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-24 Thu 21:34]--[2022-11-25 Fri 10:57] => 13:23
+:END:
+
+so that people on other platforms can come across EmacsConf
+*** DONE Record a few sample intros to test the workflow
+CLOSED: [2022-11-26 Sat 15:34]
+
+mogrify -alpha off file.png
+
+*** DONE [#A] Write the restreaming shell scripts
+CLOSED: [2022-11-21 Mon 14:49] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-21 Mon 13:56]--[2022-11-21 Mon 14:49] => 0:53
+:END:
+
+*** DONE Create the events and save the keys :sachac:
+CLOSED: [2022-11-19 Sat 11:58]
+[[file:~/proj/emacsconf/private/conf.org::*Other platforms][Other platforms]]
+
+$1 is of the form rtmp://.../stream_key
+
+ #+begin_src sh :eval no :exports code
+ 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
+
+Creating the events
+- YouTube: Create - Go Live - Schedule Stream - Streaming Software
+- Toobnix: Publish - Go live
+ - max live is 5 hours
+
+***** EmacsConf 2022 - General track
+
+This is for the general track of EmacsConf, the conference about the joy of Emacs and Emacs Lisp.
+
+Schedule:
+Saturday Dec 3, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+Sunday Dec 4, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+
+Watch using free/open source software: https://live.emacsconf.org/2022/watch/gen/
+Conference info: https://emacsconf.org/2022/
+Schedule: https://emacsconf.org/2022/talks/
+Chat on #emacsconf-dev via https://chat.emacsconf.org or irc.libera.chat
+Etherpad: https://pad.emacsconf.org/2022
+
+Videos are shared under the terms of the Creative Commons Attribution-ShareAlike 4.0
+International (CC BY-SA 4.0) license. Please observe the guidelines for conduct: https://emacsconf.org/conduct/
+
+***** EmacsConf 2022 - Development track
+
+This is for the development track of EmacsConf, the conference about the joy of Emacs and Emacs Lisp.
+
+Schedule:
+Saturday Dec 3, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+Sunday Dec 4, 2022, 9 AM - 12 PM EST, 1 PM - 5 PM EST
+
+Watch using free/open source software: https://live.emacsconf.org/2022/watch/dev/
+Conference info: https://emacsconf.org/2022/
+Schedule: https://emacsconf.org/2022/talks/
+Chat on #emacsconf-dev via https://chat.emacsconf.org or irc.libera.chat
+Etherpad: https://pad.emacsconf.org/2022
+
+Videos are shared under the terms of the Creative Commons Attribution-ShareAlike 4.0
+International (CC BY-SA 4.0) license. Please observe the guidelines for conduct: https://emacsconf.org/conduct/
+*** DONE Test start restream on a timer :emacsconf:
+CLOSED: [2022-11-24 Thu 09:54] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 19:06]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-24 Thu 09:05]--[2022-11-24 Thu 09:54] => 0:49
+:END:
+
+ssh live0.emacsconf.org
+confirm that Toobnix test stream isn't playing
+
+echo '/bin/bash /home/orga/screen-restream-test-toobnix.sh' | at 'now + 1 minute'
+echo '/bin/bash /home/orga/screen-restream-test-toobnix.sh' | at 8:30
+
+
+*** TODO [#C] Process the other intros
+:PROPERTIES:
+:CREATED: [2022-11-26 Sat 10:38]
+:END:
+
+*** DONE Record more intros :zaeph:
+CLOSED: [2022-12-01 Thu 14:08] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-30 Wed 00:02]
+:END:
+
+*** DONE [#A] Record two-part introduction for RMS talk
+CLOSED: [2022-12-01 Thu 10:32] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:46]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-01 Thu 09:44]--[2022-12-01 Thu 10:32] => 0:48
+:END:
+
+Before Richard Stallman shares what he'd like to see in Emacs, we will first play Richard Stallman's 2014 TEDx talk called "Free Software, Free Society". The TEDx talk is licensed under the Creative Commons Attribution - No Derivative Works 3.0 license.
+
+
+The next talk is called "What I'd like to see in Emacs," by Richard Stallman. This talk will be under the Creative Commons Attribution - ShareAlike license like the other talks at EmacsConf. Afterwards, he will answer questions via a moderated Q&A, so please put your questions in the Etherpad or IRC.
+
+*** DONE [#A] Add images to zaeph's intros :sachac:
+CLOSED: [2022-12-01 Thu 18:36] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 12:52]
+:END:
+*** DONE Add subtitles to intros
+CLOSED: [2022-12-01 Thu 23:07]
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 18:34]
+:Effort: 1:00
+:END:
+:LOGBOOK:
+
+CLOCK: [2022-12-01 Thu 20:09]--[2022-12-01 Thu 23:07] => 2:58
+:END:
+*** DONE rerecord zachary, pronunciation
+CLOSED: [2022-12-01 Thu 23:07]
+*** DONE rerecord buddy, got mixed up with meetups
+CLOSED: [2022-12-01 Thu 23:07]
+*** DONE redo visual for health, changed the title case
+CLOSED: [2022-12-01 Thu 23:07]
+*** DONE [#C] rerecord indieweb, accent on the wrong syllable
+CLOSED: [2022-12-01 Thu 23:07]
+*** DONE [#C] rerecord jupyter intro, repetitive
+CLOSED: [2022-12-01 Thu 23:07]
+*** TODO [#C] consider rerecording meetups to add
+SCHEDULED: <2022-12-02 Fri>
+
+Spanish subtitles are also available for this talk.
+
+You can find them on the talk page.
+
+*** TODO [#C] Contextualize journalism talk
+SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 01:26]
+:END:
+
+** DONE Set up talks on Toobnix and YouTube :sachac:yt:toobnix:
+CLOSED: [2022-11-30 Wed 18:54] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CUSTOM_ID: video-platforms
+:Effort: 1:00
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-30 Wed 14:32]--[2022-11-30 Wed 15:21] => 0:49
+:END:
+so that people can find the videos on other video platforms
+waiting for prerecs
+
+category 15: science and technology
+license 2: attribution - share alike
+language: en
+privacy 2: unlisted
+tags: emacs,emacsconf
+
+
+#+begin_src emacs-lisp
+
+#+end_src
+
+
+*** DONE Add toobnix url on schedule
+CLOSED: [2022-11-23 Wed 22:57]
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 20:50]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-23 Wed 21:52]--[2022-11-23 Wed 22:57] => 1:05
+:END:
+*** Upload to YouTube
+
+#+begin_src emacs-lisp :eval no
+(insert
+ (string-join
+ (seq-take
+ (seq-keep
+ (lambda (o)
+ (when (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :youtube-url)))
+ (format "./youtube-upload --client-secrets=../../client_secret.json --title=%s --description=%s --category=%s --tags=emacs,emacsconf --recording-date=%s --default-language=en --default-audio-language=en --embeddable=True %s"
+ (shell-quote-argument
+ (concat emacsconf-name " " emacsconf-year ": " (plist-get o :title) " - " (plist-get o :speakers-with-pronouns)))
+ (shell-quote-argument
+ (emacsconf-publish-video-description o))
+ (shell-quote-argument "Science & Technology")
+ (format-time-string "%Y-%m-%dT%H:%M:%S.0Z" (plist-get o :start-time) t)
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir)
+ )))
+ (emacsconf-get-talk-info)) 1)
+ "\n"))
+./youtube-upload --client-secrets=../../client_secret.json --title=EmacsConf\ 2022\:\ Writing\ and\ organizing\ literature\ notes\ for\ scientific\ writing\ -\ Vidianos\ Giannitsis --description=https\://emacsconf.org/2022/talks/science'
+''
+'00\:00\:00\ My\ second\ brain'
+'00\:28\ Contents\ of\ the\ talk'
+'01\:40\ Bibliography\ management'
+'02\:35\ Creating\ literature\ notes\:\ ivy-bibtex-edit-notes'
+'03\:04\ org-roam\ reference\ template'
+'04\:40\ Demo'
+'05\:40\ Annotating\ with\ org-noter'
+'06\:44\ Annotating\ in\ English'
+'07\:02\ Afterthoughts\ on\ an\ article'
+'07\:30\ Adding\ a\ note'
+'08\:21\ Creating\ permanent\ notes\ from\ reference\ material'
+'09\:01\ The\ organization\ problem'
+'09\:21\ zetteldesk.el'
+'10\:43\ The\ zetteldesk-desktop'
+'11\:45\ Filtering\ with\ ivy-bibtex'
+'12\:09\ Inserting\ literature'
+'13\:46\ Composing\ the\ final\ article'
+'15\:19\ Thanks'
+''
+'You\ can\ view\ this\ and\ other\ resources\ using\ free/libre\ software\ at\ https\://emacsconf.org/2022/talks/science\ .'
+'This\ video\ is\ available\ under\ the\ terms\ of\ the\ Creative\ Commons\ Attribution-ShareAlike\ 4.0\ International\ \(CC\ BY-SA\ 4.0\)\ license. --category=Science\ \&\ Technology --tags=emacs,emacsconf --recording-date=2022-12-03T15:45:00.0Z --default-language=en --default-audio-language=en --embeddable=True /home/sacha/proj/emacsconf/cache/emacsconf-2022-science--writing-and-organizing-literature-notes-for-scientific-writing--vidianos--final.webm
+#+end_src
+
+*** Toobnix
+
+
+#+begin_src emacs-lisp :eval no
+(insert
+ (string-join
+ (seq-keep
+ (lambda (o)
+ (when (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--main.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :toobnix-url)))
+ (format "cd ~/vendor/PeerTube; node dist/server/tools/peertube.js upload -f %s -n %s -l 2 -c 15 -P 2 -t emacs,emacsconf -L en -C emacsconf -d %s"
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--main.webm")
+ emacsconf-cache-dir)
+ (shell-quote-argument
+ (concat emacsconf-name " " emacsconf-year ": " (plist-get o :title) " - " (plist-get o :speakers-with-pronouns)))
+ (shell-quote-argument
+ (emacsconf-publish-video-description o)))))
+ (emacsconf-get-talk-info))
+ "\n"))
+#+end_src
+
+*** DONE Upload the rest of the talks to Toobnix
+CLOSED: [2022-12-06 Tue 10:32]
+*** DONE Add Toobnix talks to a playlist
+CLOSED: [2022-12-06 Tue 13:44]
+#+begin_src emacs-lisp :eval no
+(mapc (lambda (o)
+ (when (plist-get o :toobnix-url)
+ (browse-url (plist-get o :toobnix-url))
+ (shell-command "xdotool sleep 5 mousemove 1815 1030 click 1 sleep 2 mousemove 1684 799 click 1 key Alt+Tab")
+ (read-string "Continue?")))
+ (let ((talks (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+ (seq-drop talks
+ (1+ (seq-position talks
+ (seq-find (lambda (o) (string= (plist-get o :slug) "haskell")) talks)))))
+ )
+
+#+end_src
+*** DONE Add Youtube talks to a playlist
+CLOSED: [2022-12-06 Tue 13:21]
+*** DONE Upload talks to YouTube
+CLOSED: [2022-12-06 Tue 13:21] SCHEDULED: <2022-12-05 Mon>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:47]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-02 Fri 12:56]--[2022-12-02 Fri 15:59] => 3:03
+:END:
+
+#+begin_src emacs-lisp :eval yes :results replace list
+(seq-keep
+ (lambda (o)
+ (when (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :youtube-url)))
+ (concat (plist-get o :video-slug) "--final.webm")))
+ (emacsconf-get-talk-info))
+#+end_src
+
+#+RESULTS:
+:results:
+- nil
+:end:
+
+#+begin_src emacs-lisp :eval no
+;; This buffer is for text that is not saved, and for Lisp evaluation.
+;; To create a file, visit it with C-x C-f and enter text in its buffer.
+
+(let ((pos (shell-command-to-string "xdotool getmouselocation")))
+ (when (string-match "x:\\([0-9]+\\) y:\\([0-9]+\\)" pos)
+ (insert (format "(shell-command \"xdotool mousemove %s %s click 1\")\n" (match-string 1 pos) (match-string 2 pos)))))
+
+(setq list (seq-filter (lambda (o)
+ (and
+ (file-exists-p
+ (expand-file-name
+ (concat (plist-get o :video-slug) "--final.webm")
+ emacsconf-cache-dir))
+ (null (plist-get o :youtube-url))))
+ (emacsconf-prepare-for-display (emacsconf-get-talk-info))))
+(setq list (cons talk list))
+
+(while list
+ (progn
+ (shell-command "xdotool mousemove 707 812 click 1 sleep 2")
+
+ (setq talk (pop list))
+ ;; click create
+ (shell-command "xdotool mousemove 843 187 click 1 sleep 1")
+ ;; video
+ (shell-command "xdotool mousemove 833 217 click 1 sleep 1")
+ ;; select files
+ (shell-command (concat "xdotool mousemove 491 760 click 1 sleep 4 type "
+ (shell-quote-argument (concat (plist-get talk :video-slug) "--final.webm"))))
+ ;; open
+ (shell-command "xdotool mousemove 1318 847 click 1 sleep 5")
+
+ (kill-new (concat
+ emacsconf-name " "
+ emacsconf-year ": "
+ (plist-get talk :title)
+ " - "
+ (plist-get talk :speakers-with-pronouns)))
+ (shell-command "xdotool sleep 1 mousemove 331 440 click :1 key Ctrl+a Delete sleep 1 key Ctrl+Shift+v sleep 2")
+
+ (kill-new (emacsconf-publish-video-description talk t))
+ (shell-command "xdotool mousemove 474 632 click 1 sleep 1 key Ctrl+a sleep 1 key Delete sleep 1 key Ctrl+Shift+v"))
+ (read-string "Press a key once you've pasted in the description")
+
+ ;; next
+ (when (emacsconf-captions-edited-p (expand-file-name (concat (plist-get talk :video-slug) "--main.vtt") emacsconf-cache-dir))
+ (shell-command "xdotool mousemove 352 285 click 1 sleep 1")
+
+ ;; add captions
+ (shell-command "xdotool mousemove 877 474 click 1 sleep 3")
+ (shell-command "xdotool mousemove 165 408 click 1 sleep 1")
+ (shell-command "xdotool mousemove 633 740 click 1 sleep 2")
+ (shell-command (concat "xdotool mousemove 914 755 click 1 sleep 4 type "
+ (shell-quote-argument (concat (plist-get talk :video-slug) "--main.vtt"))))
+ (read-string "Press a key once you've loaded the VTT")
+ (shell-command "xdotool mousemove 910 1037 sleep 1 click 1 sleep 4")
+ ;; done
+ (shell-command "xdotool mousemove 890 297 click 1 sleep 3")
+ )
+
+
+ (progn
+ ;; visibility
+ (shell-command "xdotool mousemove 810 303 click 1 sleep 2")
+ ;; public
+ (shell-command "xdotool mousemove 119 614 click 1 sleep 2")
+ ;; copy
+ (shell-command "xdotool mousemove 882 669 click 1 sleep 1")
+ ;; done
+ (shell-command "xdotool mousemove 908 1089 click 1 sleep 5 key Alt+Tab")
+
+ (emacsconf-with-talk-heading talk
+ (org-entry-put (point) "YOUTUBE_URL" (read-string "URL: "))
+ ))
+ )
+
+ ;; (shell-command "xdotool mousemove 165 408 click 1 sleep 1")
+ ;; (shell-command "xdotool mousemove 2312 1483 click 1 sleep 1")
+ ;; ;; schedule
+ ;; (shell-command "xdotool mousemove 1527 752 click 1")
+ ;; (message "%s" (format-time-string "%Y-%m-%d %I:%M %p" (plist-get talk :start-time)
+ ;; emacsconf-timezone))))
+ ;; ;; (shell-command (concat "xdotool mousemove 1695 611 click 1 key Shift+PgDn Ctrl+a Del type "
+ ;; ;; (format-time-string "%I:%M %p"
+ ;; ;; (plist-get talk :start-time)
+ ;; ;; emacsconf-timezone)))
+ ;; ;; copy link
+
+ ;; (progn
+ ;; (shell-command "xdotool mousemove 2284 668 click 1 sleep 1 click 1")
+ ;; ;; schedule
+ ;; (shell-command "xdotool mousemove 2324 1498 click 1 sleep 3")
+
+ ;; ;; close
+ ;; (shell-command "xdotool mousemove 2100 996 click 1")
+ ;; )
+#+end_src
+*** DONE upload the rest of the files onto Toobnix
+CLOSED: [2022-12-02 Fri 12:54] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 08:16]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-02 Fri 12:47]--[2022-12-02 Fri 12:54] => 0:07
+:END:
+*** TODO [#C] Upload more Toobnix and YouTube talks
+SCHEDULED: <2022-12-05 Mon>
+:PROPERTIES:
+:CREATED: [2022-12-03 Sat 07:01]
+:END:
+
+** DONE [#A] Do another run
+CLOSED: [2022-11-28 Mon 00:21] SCHEDULED: <2022-11-27 Sun>
+:PROPERTIES:
+:CUSTOM_ID: dry-run
+:END:
+
+Summary:
+- bandali will stream from his computer; confirmed can stream to dev
+- corwin will probably connect to gen by VNC; confirmed can connect to VNC and click around, need to become more familiar with setup after trip
+- sachac will be backup streamer if bandali or corwin are unavailable
+
+Goals:
+- Good: Streamers are set up to broadcast from their own OBS if needed (could be a backup plan, could be the main plan)
+- Better: Streamers can connect to the VNC session for their track, manage OBS, start videos (with overlays), and browse the Q&A links
+- Best: Streamers can connect via emacsclient in orga@res.emacsconf.org, manage the task status, and have everything working
+
+Agenda:
+- Get familiar with the setup
+- Consider whether we want to prioritize local OBS (more screen real estate) or stream OBS (easier swapping, can be controlled remotely)
+- Consider whether we want mumble to be able to quickly add audio; how do we want to set it up scene-wise?
+
+*** Checklist for later dry run
+
+ 1. Streams
+ - [ ] General stream
+ - [ ] Development stream
+ - [ ] 480p streams
+ 2. Scenes
+ - [ ] Intro
+ - [ ] Prerec
+ - [ ] Q&A: live
+ - [ ] Q&A: IRC
+ - [ ] Q&A: pad
+ 3. [ ] IRC channels
+ - [ ] Announce
+ - [ ] Question handling
+ - [ ] Timers
+ 4. [ ] Watching pages
+ - [ ] Before launch
+ - [ ] Streaming
+ - [ ] Emergency announcement
+ 5. [ ] Pads
+ 6. [ ] Wiki
+ - [ ] Schedule update
+ - [ ] Message on the schedule
+ - [ ] Prerec live
+ 7. [ ] Wind everything down
+
+
+Later on
+- [ ] Toobnix stream
+- [ ] YouTube stream
+*** Create test
+
+gst-launch-1.0 compositor name=mix sink_1::xpos=1180 sink_1::ypos=470 ! videoconvert ! autovideosink filesrc location=community-title.svg ! rsvgdec ! imagefreeze num_buffers=100 ! mix. videotestsrc ! video/x-raw,width=400,height=300 ! mix. audiotestsrc freq ! autoaudiosink
+
+gst-launch-1.0 compositor name=mix sink_1::xpos=1200 sink_1::ypos=600 ! videoconvert ! autovideosink \
+filesrc location=community-title.svg ! rsvgdec ! imagefreeze num_buffers=100 ! mix. \
+filesrc location=background.opus ! oggdemux ! opusdec ! audioconvert ! audioresample ! mix.
+videotestsrc ! video/x-raw,width=400,height=300,framerate=25/1 num_buffers=(25 * (4 * 60 + 5)) ! mix.
+
+gst-launch-1.0 webmmux name=mux ! filesink location=community.webm \
+compositor name=mix sink_1::xpos=1200 sink_1::ypos=600 ! videoconvert ! vp8enc ! queue ! mux.video_0 \
+filesrc location=community-title.svg ! rsvgdec ! imagefreeze num_buffers=2450 ! mix. \
+filesrc location=background.opus ! oggdemux ! opusdec ! audioconvert ! audioresample ! vorbisenc ! queue ! mux.audio_0 \
+videotestsrc num_buffers=2450 ! video/x-raw,width=400,height=300,framerate=10/1 ! mix.
+
+1251,/home/sacha/proj/emacsconf/private/assets/titles% find -name community-title.svg -exec inkscape --export-type=png --export-width=1280 --export-height=720 --export-background-opacity=0 {} \;
+
+
+*** DONE Do mini dry run
+CLOSED: [2022-11-19 Sat 11:09]
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 07:49]
+:END:
+**** DONE Revisit OBS and streaming setup to prepare for the dry run next weekend
+CLOSED: [2022-11-19 Sat 11:09]
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 08:00]
+:Effort: 1:00
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-19 Sat 09:47]--[2022-11-19 Sat 11:09] => 1:22
+:END:
+**** DONE Make mini dry run hyperlist with buttons
+CLOSED: [2022-11-29 Tue 11:02]
+:PROPERTIES:
+:CREATED: [2022-11-28 Mon 22:40]
+:Effort: 1:00
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-29 Tue 10:21]--[2022-11-29 Tue 11:02] => 0:41
+CLOCK: [2022-11-29 Tue 08:27]
+:END:
+
+- hh:mm slug
+ - hyperlist note
+ - set talk playing
+ - play intro
+ - play talk
+ - set talk closed q
+ - join bbb
+ - set talk open q
+ - set talk to archive
+
+(emacsconf-hyperlist-show-streamer-day "2022-12-03")
+(emacsconf-hyperlist-show-streamer-day "2022-12-04")
+
+
+Testing:
+
+| | intro | talk | Q&A | Expected |
+| journalism | recorded | live | | |
+| school | recorded | recorded | IRC | |
+| handwritten | recorded | recorded | BBB | |
+| treesitter | | | | |
+| health | live | recorded | BBB | |
+| jupyter | live | live | BBB | |
+
+- journalism: recorded intro, recorded talk, live
+
+(emacsconf-hyperlist-show-streamer-day "2022-12-03" nil
+(list "journalism" "school" "treesitter" "handwritten" "health" "jupyter"))
+
+
+*** DONE [#A] Do a dry run for the dry run
+CLOSED: [2022-11-28 Mon 00:21] SCHEDULED: <2022-11-27 Sun>
+:PROPERTIES:
+:CREATED: [2022-11-25 Fri 13:28]
+:END:
+
+** TODO [#C] Turn off file upload service on media.emacsconf.org :sachac:infra:
+SCHEDULED: <2022-12-03 Sat>
+:PROPERTIES:
+:CUSTOM_ID: upload-off
+:END:
+so that nginx can have more memory and we don't risk slowdowns
+** DONE Review notebook for tasks, priorities, and scheduling
+CLOSED: [2022-11-21 Mon 14:34]
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 08:01]
+:CUSTOM_ID: review
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-19 Sat 11:17]--[2022-11-19 Sat 11:29] => 0:12
+:END:
+*** TODO Review tasks
+SCHEDULED: <2022-12-02 Fri>
+** Use Mumble for backchannel coordination and also on-stage
+:PROPERTIES:
+:CUSTOM_ID: mumble
+:END:
+
+[2022-11-19 Sat] sachac: Confirmed that you can join the emacsconf-dev or emacsconf-gen channel if you have access, and you can speak on air in just that channel
+
+*** DONE Update the Mumble setup :bandali:
+CLOSED: [2022-11-19 Sat 11:15]
+- [X] Add emacsconf-gen and emacsconf-dev channels
+- [X] Give the emacsconf-gen and emacsconf-dev users access to them
+- [X] Give the other organizers access to emacsconf-gen, emacsconf-dev, and org-private
+- [X] Get emacsconf-gen and -dev to join the right channels
+*** DONE E-mail volunteers and help them get on Mumble :bandali:
+CLOSED: [2022-11-19 Sat 09:03]
+
+**** Template
+
+We plan to use Mumble as a virtual walkie-talkie during the conference
+so that we can quickly talk to each other as needed. It can also be a
+way for us to add our audio to the streams. Please set up your system
+as follows:
+
+1. Install a Mumble client on the device you want to use to connect to
+ the voice channel. It can be your computer or phone. You can choose
+ the username that you would like to log in with.
+2. Create and backup your certificate. (This is part of the wizard for
+ the desktop client, and it might be automatic on a phone client.)
+3. Connect to mumble.emacsconf.org with your desired username.
+4. Register your account on the server using the ~Self > Register~
+ command. This reserves your username using your certificate and
+ allows me to add you to ACLs.
+5. Let me know (sachac on #emacsconf-org in IRC or
+ sacha@sachachua.com) when you've registered so that I can add you
+ to the access control lists for the private channels. If I'm around
+ on mumble (sachac), you can say hi to me there and confirm that
+ it's working.
+
+You can enter a channel by double-clicking on it. (On Mumla for
+Android, entering a channel is instead done by clicking on the arrow
+to the right of the channel.) Then your audio will go to that channel,
+and you can hear audio from that channel. We can use the
+~emacsconf-gen~ and ~emacsconf-dev~ channels to speak on air, and we
+can use the ~backstage~ channel for coordination.
+
+Looking forward to hearing from you!
+
+Sacha
+
+*** DONE Generate certificates, add them to conf.org, and register the users :sachac:
+CLOSED: [2022-11-08 Tue 11:33]
+*** DONE Set up Mumble and bring the volunteers on board
+CLOSED: [2022-11-21 Mon 18:07] SCHEDULED: <2022-11-26 Sat>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 07:59]
+:END:
+
+| | Emailed | Onboarded |
+|------------+---------+------------------------------------------|
+| FlowyCoder | X | [2022-11-19 Sat] access granted, briefed |
+| jman | X | [2022-11-21 Mon] access granted, briefed |
+| vetrivln | X | [2022-11-19 Sat] access granted, briefed |
+
+*** DONE set up Mumble channels for host-dev and host-gen?
+CLOSED: [2022-11-26 Sat 22:22] SCHEDULED: <2022-11-27 Sun>
+ :PROPERTIES:
+ :CREATED: [2022-11-20 Sun 10:38]
+ :END:
+zaeph wants to make it easy to talk to the host without distracting them all the time
+
+*** DONE add dry-run check of whispering to hosts
+CLOSED: [2022-11-21 Mon 18:09] SCHEDULED: <2022-11-25 Fri>
+ :PROPERTIES:
+ :CREATED: [2022-11-20 Sun 10:34]
+ :END:
+
+** Satellite events
+:PROPERTIES:
+:CUSTOM_ID: satellite
+:END:
+*** Zurich
+**** DONE Link to satellite events on the wiki :bandali:
+CLOSED: [2022-11-21 Mon 13:53]
+https://200ok.ch/posts/2022-11-01_emacsconf__with_a_new_physical_venue.html
+
+on the watch page
+**** DONE announce on the emacsconf-discuss mailing list :bandali:
+CLOSED: [2022-11-21 Mon 13:53]
+** Volunteer update
+:PROPERTIES:
+:CUSTOM_ID: volunteer-2022-11-14
+:END:
+
+- talk banners, akshay
+
+** Make a linear hyperlist for managing EmacsConf :sachac:
+:PROPERTIES:
+:CUSTOM_ID: hyperlist
+:END:
+
+Goal:
+- Volunteers should be able to coordinate everything by stepping through a linear list of things to do
+- The hyperlist will primarily live on orga@res.emacsconf.org and be accessed through emacsclient. (Maybe sat.org and sun.org)
+- Volunteers should be able to take breaks as needed
+
+emacsconf-hyperlist-show-streamer-day
+
+[[#coordination][How do we want to coordinate during the conference itself?]]
+*** DONE Try writing it to an Etherpad
+CLOSED: [2022-11-14 Mon 14:14] SCHEDULED: <2022-11-19 Sat>
+
+*** DONE [#A] Revisit the hyperlists to make sure they make sense
+CLOSED: [2022-11-23 Wed 13:14] SCHEDULED: <2022-11-23 Wed>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 07:49]
+:END:
+*** DONE [#B] Add intro notes and specific talk notes to the hyperlist
+CLOSED: [2022-11-22 Tue 11:29] SCHEDULED: <2022-11-22 Tue>
+*** DONE [#A] Make a hyperlist for checking people in for easier copying and pasting
+CLOSED: [2022-11-23 Wed 13:14] SCHEDULED: <2022-11-23 Wed>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-23 Wed 10:15]--[2022-11-23 Wed 13:14] => 2:59
+:END:
+*** DONE Send FlowyCoder hyperlist for checking people in :mail:
+CLOSED: [2022-11-28 Mon 12:25] SCHEDULED: <2022-11-28 Mon>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 09:26]
+:END:
+
+[[file:~/proj/emacsconf/wiki/2022/organizers-notebook/index.org::*Use Mumble for backchannel coordination and also on-stage][Use Mumble for backchannel coordination and also on-stage]]
+
+**** DONE [#A] make sure live talks are on the checkin list
+CLOSED: [2022-11-30 Wed 10:50]
+:PROPERTIES:
+:CREATED: [2022-11-28 Mon 21:38]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-30 Wed 09:38]--[2022-11-30 Wed 10:50] => 1:12
+:END:
+
+*** DONE Make backstage redirects for pad and qa so that hosts and streamers can have an easier time
+CLOSED: [2022-11-22 Tue 11:32] SCHEDULED: <2022-11-22 Tue>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 13:54]
+:END:
+
+ex:
+https://media.emacsconf.org/2022/backstage/current/pad/journalism
+https://media.emacsconf.org/2022/backstage/current/room/journalism
+
+Pattern:
+https://media.emacsconf.org/2022/backstage/current/slug/pad
+https://media.emacsconf.org/2022/backstage/current/slug/room
+https://media.emacsconf.org/2022/backstage/current/pad/slug
+https://media.emacsconf.org/2022/backstage/current/room/slug
+
+
+*** CANCELLED [#B] Regenerate hyperlist if sched changes
+ CLOSED: [2022-11-23 Wed 13:17] SCHEDULED: <2022-11-23 Wed>
+ :PROPERTIES:
+ :CREATED: [2022-11-17 Thu 22:17]
+ :END:
+
+*** CANCELLED Put shell commands on a separate line so they're easy to select and run
+CLOSED: [2022-11-24 Thu 08:57] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 20:50]
+:END:
+
+*** DONE [#A] Make a hyperlist for hosts
+CLOSED: [2022-11-30 Wed 10:50]
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 21:19]
+:END:
+
+*** DONE [#A] Update etherpad hyperlist
+CLOSED: [2022-11-30 Wed 10:50]
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 21:19]
+:END:
+
+*** DONE Adjust audio levels from hyperlist
+CLOSED: [2022-11-30 Wed 13:03]
+:PROPERTIES:
+:CREATED: [2022-11-30 Wed 11:52]
+:END:
+*** TODO [#C] Adjust audio levels from hyperlist with a repeat-mode keymap
+
+*** DONE Link pamix to a konsole ssh
+CLOSED: [2022-12-01 Thu 09:31] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:47]
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-01 Thu 09:18]--[2022-12-01 Thu 09:31] => 0:13
+:END:
+*** DONE Add monitoring the streams to the hyperlist / shortcuts
+CLOSED: [2022-12-01 Thu 09:38] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:50]
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-01 Thu 09:31]--[2022-12-01 Thu 09:38] => 0:07
+:END:
+*** TODO Test hyperlist on obs and record quick demos
+SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 06:58]
+:END:
+
+** TODO [#C] Record intro/outro for day-1 and day-2 :zaeph:
+:PROPERTIES:
+:CUSTOM_ID: rec-intro
+:END:
+
+- Opening remarks Sat
+ - Welcome to EmacsConf 2022
+ - What's new at EmacsConf?
+ - This year, we have two tracks: General and Development.
+ - Prerecorded videos will be published as soon as possible (aiming
+ for publishing them as the talks stream), so you can check the
+ talk page for the video and the transcript a few minutes after the
+ talk starts.
+ - How to participate
+ - You can watch at live.emacsconf.org using free and open source software.
+ - Select the stream you're interested in.
+ - There are quick shortcuts on the watch page so that you can
+ open the Etherpad, Q&A, or IRC.
+ - We recommend adding notes asking questions in the Etherpad
+ for the talk. That way, it's easier to organize the
+ questions and answers, and the host can read questions out
+ to the speaker as needed.
+ - You can also use the track-specific IRC channels
+ (#emacsconf-gen and #emacsconf-dev).
+ - You can look at the schedule to see what else is going on.
+ - IRC:
+ - You can use #emacsconf for hallway conversations.
+ - If you need to reach conference organizers, you can use the
+ #emacsconf-org IRC channel or e-mail sacha@sachachua.com .
+ - General feedback in pad.emacsconf.org/2022
+ - Accessibility
+ - Streaming with open captions thanks to speakers and volunteers
+ - Talks indicated with "captioned" on the schedule
+ - Transcript available on talk pages
+ - Encourage people to add notes, questions, and answers to the
+ Etherpad, which will be archived as plain text on the talk
+ pages after the conference
+ - If you need additional support, ask in #emacsconf-accessible or #emacsconf-org
+- Closing remarks Sat
+ - Thanks
+ - Thank you to all the speakers and participants.
+ - This year's conference will be hosted by zaeph, bandali, and
+ vetrivln, and streamed by corwin, bandali, and jman.
+ - Thanks to our captioning volunteers: sachac, bhavin192, Tom
+ Purl, Hannah Miller, triko, and anush, and also to the speakers
+ who captioned their own talks. Thanks to quiliro for translating
+ the meetups talk into Spanish. and to Akshay Gaikwad for
+ contributing some designs.
+ - Thanks to the Free Software Foundation for the mailing
+ lists. Thanks to Ry P for the server that we're using for OBS
+ streaming and for processing videos.
+ - Come back tomorrow
+- Closing remarks Sun
+ - Thanks
+ -
+*** DONE Review opening remarks from last year
+CLOSED: [2022-11-25 Fri 11:29] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-24 Thu 07:17]
+:END:
+
+https://emacsconf.org/2021/talks/day1-open/
+
+** TODO [#C] Add category tags and possibly links between talks across 2022 and all previous years :quiliro:wiki:
+:PROPERTIES:
+:CUSTOM_ID: link-pages
+:END:
+
+- Prerequisite: Can edit wiki pages (https://emacsconf.org/edit/)
+- Goal: Make it easier for people to discover interesting related talks
+
+- List of talks for EmacsConf 2022: https://emacsconf.org/talks/
+- List of talks: https://emacsconf.org/talks/
+- List of categories: https://emacsconf.org/CategoryCategory/
+- To add something to a category, add =\[[!taglink CategoryName]]= to the bottom of its talk page (ex: 2022/talks/maint.md is in CategoryCommunity)
+- You can create new categories by making up new CategoryNames.
+- You can also link to a talk with a link like this: =\[[/2022/talks/maint|Maintaining the Maintainers: Attribution as an Economic Model for Open Source]]=
+ You can make a new heading called =# Related talks=
+** TODO [#C] JS/CSS enhancement :emacsconf:
+:PROPERTIES:
+:CREATED: [2022-10-22 Sat 15:15]
+:CUSTOM_ID: watch-css
+:END:
+
+*** TODO [#C] Add start and end attributes to the brief stuff for possible JS/CSS
+:PROPERTIES:
+:CREATED: [2022-10-20 Thu 22:26]
+:END:
+
+*** TODO [#C] Consider putting the subtitles outside the video https://stackoverflow.com/questions/61826237/is-there-a-simple-way-to-position-subtitles-below-the-hlml5-video :emacsconf:
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 15:00]
+:END:
+
+[[file:~/sync/orgzly/Inbox.org]]
+
+*** SOMEDAY [#C] Make video sticky and move it to the right :js:css:nextyear:
+
+https://webdesign.tutsplus.com/tutorials/how-to-create-a-sticky-floating-video-on-page-scroll--cms-28342
+
+** TODO [#C] Build up the ansible playbook :sachac:opal:
+:PROPERTIES:
+:CUSTOM_ID: ansible
+:END:
+git@git.emacsconf.org:pub/emacsconf-ansible
+
+Goals:
+
+Playbook will be able to reproduce:
+- [[#etherpad][Etherpad]]: probably okay to deploy on VPS
+- web-based file upload: probably in a docker
+- publishing environment for schedule etc.
+
+in prod or docker container
+
+*** DONE restreamers on live0
+CLOSED: [2022-11-22 Tue 08:37] SCHEDULED: <2022-11-24 Thu>
+[[#other-streams][Set up stream events on Toobnix and YouTube]]
+*** DONE icecast on live0
+CLOSED: [2022-10-29 Sat 09:56]
+:PROPERTIES:
+:Effort: 1:00
+:END:
+:LOGBOOK:
+[2022-10-20 Thu 12:36]
+:END:
+
+(find-file "/ssh:live|sudo::/etc/icecast2/icecast.xml")
+**** DONE Set up watch/gen-480p
+CLOSED: [2022-10-29 Sat 09:56]
+
+
+*** DONE publishing environment
+CLOSED: [2022-11-19 Sat 11:12]
+*** DONE Get ansible to run against a clean docker
+CLOSED: [2022-10-11 Tue 12:20]
+*** DONE Set up Etherpad with MySQL
+
+*** TODO Make the upload ansible configuration controllable via a variable
+:PROPERTIES:
+:CREATED: [2022-12-13 Tue 09:43]
+:END:
+** SOMEDAY [#C] Consider breakout rooms for lunch break
+:PROPERTIES:
+:CREATED: [2022-11-07 Mon 08:12]
+:CUSTOM_ID: breakouts
+:END:
+
+** CANCELLED [#C] Work on the OBS scenes :zaeph:corwin:sachac:
+CLOSED: [2022-11-28 Mon 00:21] SCHEDULED: <2022-11-27 Sun>
+:PROPERTIES:
+:CUSTOM_ID: obs-scenes
+:END:
+- [ ] corwin is out from Nov 11-20, and we should start working on them before then.
+** INPROGRESS [#C] Plan Etherpad use and hosting :sachac:ansible:
+:PROPERTIES:
+:CUSTOM_ID: etherpad
+:END:
+
+- Relevant links:
+ - Per-pad, nicely structured info with abstract, watching information, etc. CarpentryCon 2022 Schedule • CarpentryCon 2022 https://2022.carpentrycon.org/
+ - One pad per session: https://meta.wikimedia.org/wiki/Arctic_Knot_Conference_2021/Program#Friday,_June_25th
+ - [[https://community.jitsi.org/t/tutorial-etherpad-integration-in-jitsi-meetings/99697][Etherpad integration in Jitsi ]]
+
+- Good: One pad per session
+- Better: Some kind of monitoring so that we can link to the pads or embed
+ the pads even before the conference starts while not risking too
+ much vandalism
+- Best:
+ - Pad can be easily regenerated from Emacs Lisp with a check to see if people have been adding to it
+ - Pad links to next talks
+
+Where should we host this?
+- live0: gets scaled up the most, lots of people connect to it for the conference, didn't hit performance constraints last time
+- front0: lower risk of interfering with stream
+- bbb: will already be put on strain with the concurrent streams (test showed it was stable with up to 10 concurrent video streams and 40 total participants)
+- opal’s: no news from owner, but beefy server that we used for reencode last year
+- new Linode (probably 4GB or 8GB shared CPU): can easily be spun up, yay Ansible
+
+[[#ansible][Ansible notes]]
+
+Consider if we need extra scaling beyond being on a beefy live0?
+- Scale calculator: https://scale.etherpad.org/
+ - assuming 3 concurrent authors, 100 lurkers per pad, 3 concurrent pads
+ - 1 core, 4GB RAM, bandwidth Mb/s: 7.488
+- https://mclear.co.uk/2021/09/08/deploying-etherpad-at-scale-in-one-minute/
+- https://github.com/ether/etherpad-load-test
+
+Will need to try this again when we resize nodes. Probably just the extra memory will be enough and the CPU use from node won't step on the streaming, but not sure
+
+*** DONE Create pads for all the talks
+CLOSED: [2023-10-17 Tue 09:46] SCHEDULED: <2023-11-05 Sun>
+:PROPERTIES:
+:CUSTOM_ID: create-pads
+:CREATED: [023-10-13 Fri 10:1]
+:END:
+
+Because the pads refer to the next and previous talks and include the talk titles, this is best redone after the schedule has settled down.
+
+
+*** DONE Use the API to create pages based on all the slugs
+CLOSED: [2022-10-11 Tue 20:41]
+*** CANCELLED Figure out monitoring; maybe get everything daily and commit to git repo?
+CLOSED: [2022-10-12 Wed 20:31]
+History or regeneration will be fine. We'll probably link to it shortly before the event, and we can also turn off the service until we're ready.
+*** DONE Generate talk-specific pad content
+CLOSED: [2022-10-12 Wed 20:31]
+*** DONE Set up nginx reverse proxy
+CLOSED: [2022-10-13 Thu 12:19]
+*** DONE Load-test
+CLOSED: [2022-10-13 Thu 12:32]
+
+tl;dr: Either a separate 4GB Linode or being on live0 will probably be
+okay, but I'm not 100% sure due to the limitations of my load-testing
+setup. I don't know if we need to shard by pad.
+
+It looks like etherpad-load-test tends to max out at ~40 connections
+on a specific node. I used GNU Parallel to run the loadtesting tool
+against a 4GB Linode instance (shared CPU) from five nodes at the same
+time (my X220, my 2GB Linode instance, front0, and the node with the
+pad), and they all reached about 35-45 clients before failure (not
+updating within 100ms).
+
+#+begin_src sh :eval no
+echo 'node node_modules/etherpad-load-test/app.js http://170.187.195.5:9001 -d 120 > ~/output.txt' | parallel -J loadtest -j 1 --onall --verbose --tag
+#+end_src
+
+#+begin_src sh :eval no :results output replace
+echo 'grep Local ~/output.txt | tail -1' | parallel -J loadtest -j 1 --onall --tag
+#+end_src
+
+#+RESULTS:
+:results:
+: Local Clients Connected: 43
+front Local Clients Connected: 43
+live Local Clients Connected: 44
+root@170.187.195.5 Local Clients Connected: 38
+web Local Clients Connected: 42
+:end:
+
+Files were created at roughly the same time, so the max loads probably
+overlapped. It would be good to have finer control over the
+etherpad-load-test tool. Haven't figured out how to properly use ~-l~
+and ~-a~ yet.
+
+#+begin_src sh :eval no :results output replace
+echo 'stat -c %y ~/output.txt' | parallel -J loadtest -j 1 --onall --tag
+#+end_src
+
+#+RESULTS:
+:results:
+: 2022-10-13 12:42:32.212744774 -0400
+front 2022-10-13 16:42:34.466605650 +0000
+live 2022-10-13 16:38:46.818016379 +0000
+root@170.187.195.5 2022-10-13 16:39:01.738965567 +0000
+web 2022-10-13 12:39:14.417086960 -0400
+:end:
+
+CPU graph went only up to 5%. Network max was 2.36 Mb/s in, 1.25 Mb/s out.
+looking at top, CPU seems to go only up to about 12% or so.
+*** DONE Set up pad.emacsconf.org to point to live0.emacsconf.org :bandali:
+CLOSED: [2022-10-17 Mon 00:31] DEADLINE: <2022-11-12 Sat>
+*** DONE Set up letsencrypt
+CLOSED: [2022-10-16 Sun 14:42]
+Waiting for DNS
+add to /etc/dehydrated/domains.txt
+sudo sh -x /etc/cron.daily/renew-https-cert-local
+*** DONE [#A] Link to pad from talk page
+CLOSED: [2022-11-21 Mon 13:55] SCHEDULED: <2022-11-20 Sun>
+*** DONE Add links to general conference pad
+CLOSED: [2022-10-19 Wed 09:22]
+for collecting feedback
+*** TODO [#C] Prototype shift pads for easier scrolling
+if we can get the anchor plugin
+*** DONE Be able to fall back to wikimedia if necessary, maybe with nginx redirects
+CLOSED: [2022-10-13 Thu 13:55]
+*** DONE Export pad initial content HTML to make it easier to reimport into wikimedia or elsewhere
+CLOSED: [2022-10-13 Thu 13:46]
+~emacsconf-pad-export-initial-content-for-all-talks~
+*** SOMEDAY [#C] Cache pad times in a json or el :emacsconf:
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 22:06]
+:END:
+
+*** DONE Confirm that we can use the time slider to move back in time
+CLOSED: [2022-11-22 Tue 10:06]
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 10:00]
+:END:
+:LOGBOOK:
+- State "DONE" from "TODO" [2022-11-22 Tue 10:06]
+:END:
+
+*** TODO [#C] Consider monospace font for Etherpad? :nextyear:
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 09:00]
+ :END:
+
+** TODO [#C] Write about EmacsConf behind the scenes :sachac:
+SCHEDULED: <2022-12-26 Mon>
+:PROPERTIES:
+:CUSTOM_ID: writing
+:END:
+*** TODO Write about scheduling and tracks
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:41]
+:END:
+
+*** TODO Write about scheduling and summing up properties
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:41]
+:END:
+*** TODO Write about scheduling and SVG
+*** TODO Write about timers and todo state change hooks
+*** TODO Write about TRAMP and workaround of shifting talks
+*** TODO Write about OBS on VNC
+*** TODO Write about BBB redirects and opening things up
+*** TODO Write about ERC announcements
+*** TODO Write about copying files to backstage
+*** TODO Write about captions
+
+*** SOMEDAY Write about setup for vnc
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 18:38]
+:END:
+
+*** SOMEDAY Write about setting org properties from a region, looking at tables, summing it up
+:PROPERTIES:
+:CREATED: [2022-12-08 Thu 15:15]
+:END:
+
+*** SOMEDAY Record animation of changing the schedule
+:PROPERTIES:
+:CREATED: [2022-12-09 Fri 21:07]
+:END:
+
+*** SOMEDAY Write about mail merge
+:PROPERTIES:
+:CREATED: [2022-12-10 Sat 10:22]
+:END:
+
+*** #EmacsConf behind the scenes: Testing the schedule with SVGs
+
+#+begin_quote
+Org mode allows you to have inline images, and you can return them as the results of Org Babel
+blocks. I wanted to test different #EmacsConf scheduling strategies quickly. I used Emacs's XML and
+SVG support to create the SVGs based on the scheduling data I gave it. Splitting my window made it
+easy to change the schedule, use `C-c C-c` to execute the block, and see the schedule image
+(including any validation notes) in the other window. The code is in
+https://git.emacsconf.org/emacsconf-el/tree/emacsconf-schedule.el .
+
+[[https://emacs.ch/system/media_attachments/files/109/485/992/555/721/586/original/7bf3ab2a89fdcaec.png][Screenshot of how I tested #EmacsConf scheduling strategies using inline images in an Org file]]
+#+end_quote
+
+[[https://emacs.ch/@sachac/109486006078029919]]
+
+*** SOMEDAY https://graz.social/@publicvoit/109496340869869181
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 13:04]
+:END:
+
+publicvoit@graz.social - Organizers of online #video #conferences: take a look at the amazing work the organizers of #EmacsConf are doing with the pre- and post-processing of a 9 minute demo #video: https://emacsconf.org/2022/talks/orgsuperlinks/
+
+Subtitles, transcript, (Q&A from the live discussion are following), chapter marks, discussion thread from the #Etherpad used, ...
+
+I only wrote the 'Description' section and contributed the raw video file. It's really impressive what @sachac and the other organizers + volunteers are doing here.  
+
+* Ideas for next year :nextyear:
+:PROPERTIES:
+:CUSTOM_ID: maybe-projects
+:END:
+
+** Possible talks
+*** SOMEDAY Is eMacs worth using/learning for non programmers? I.e are there non programming applications for it?
+:PROPERTIES:
+:CREATED: [2023-01-10 Tue 08:18]
+:END:
+
+https://www.reddit.com/r/emacs/comments/107y169/is_emacs_worth_usinglearning_for_non_programmers/
+Interesting comments
+
+** SOMEDAY https://www.reddit.com/r/i3wm/comments/b1hgxm/i3wm_over_vnc_with_dual_monitors/?utm_source=share&utm_medium=android_app&utm_name=androidcss&utm_term=2&utm_content=share_button might be interesting to have dual monitors next year
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 22:42]
+:END:
+
+** SOMEDAY Suggest public submissions next time
+ :PROPERTIES:
+ :CREATED: [2022-09-22 Thu 21:09]
+ :END:
+would it be interesting to see if other people can build on what's submitted?
+
+** SOMEDAY [#C] Match /names with speakers, maybe make a page with people currently online
+ :PROPERTIES:
+ :CREATED: [2022-10-01 Sat 23:58]
+ :END:
+
+** SOMEDAY EmacsWiki: Erc Robot
+ :PROPERTIES:
+ :CREATED: [2022-10-01 Sat 21:11]
+ :END:
+
+https://www.emacswiki.org/emacs/ErcRobot
+
+After I get ikiwiki sorted out, I can use Erc to control it so that I can test it a lot before letting it mess with the real thing
+
+Goals:
+Update schedule
+Publish prerec when talk is playing
+
+*** SOMEDAY [#C] Irc bot for opening
+SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 22:35]
+:END:
+
+notice the message
+open the Q&A specified by slug, or look it up from the channel
+
+** TODO Consider making a bot to support announcing, updating, publishing, who's here, announcing when speakers are here
+ :PROPERTIES:
+ :CREATED: [2022-10-03 Mon 23:43]
+ :END:
+
+https://salsa.debian.org/rhonda/schedulebot
+
+- announces:
+ - $talk will start in $min minutes
+ - $talk has just begun
+ - $talk has just finished
+- seen
+
+** SOMEDAY indentation - CSS - successive indenting of siblings after headings - Stack Overflow
+ :PROPERTIES:
+ :CREATED: [2022-10-07 Fri 21:15]
+ :END:
+
+https://stackoverflow.com/questions/31872535/css-successive-indenting-of-siblings-after-headings
+
+** SOMEDAY html - Indent everything after h1, h2, etc. before the next, one, while stacking the indents, with CSS - Stack Overflow
+ :PROPERTIES:
+ :CREATED: [2022-10-07 Fri 21:13]
+ :END:
+
+https://stackoverflow.com/questions/69711847/indent-everything-after-h1-h2-etc-before-the-next-one-while-stacking-the-in
+
+** Video
+*** SOMEDAY infrastructure/source-recording.sh at master · FOSDEM/infrastructure
+ :PROPERTIES:
+ :CREATED: [2022-10-04 Tue 00:11]
+ :END:
+
+https://github.com/FOSDEM/infrastructure/blob/master/ansible/playbooks/roles/video-bbb/files/scripts/source-recording.sh
+
+*** SOMEDAY c3voc/voctomix - Docker Image | Docker Hub
+ :PROPERTIES:
+ :CREATED: [2022-10-04 Tue 00:09]
+ :END:
+
+https://hub.docker.com/r/c3voc/voctomix/
+
+*** SOMEDAY DebConf video team / vogol · GitLab
+ :PROPERTIES:
+ :CREATED: [2022-10-04 Tue 00:07]
+ :END:
+
+https://salsa.debian.org/debconf-video-team/vogol
+
+*** SOMEDAY roles/vogol · master · DebConf video team / ansible · GitLab web interface for voctomix
+ :PROPERTIES:
+ :CREATED: [2022-10-04 Tue 00:06]
+ :END:
+
+https://salsa.debian.org/debconf-video-team/ansible/-/tree/master/roles/vogol
+
+*** SOMEDAY CarlFK/veyepar: Video Eyeball Processor and Review
+ :PROPERTIES:
+ :CREATED: [2022-10-04 Tue 00:02]
+ :END:
+
+https://github.com/CarlFK/veyepar
+
+*** SOMEDAY timvideos/streaming-system: Tim Video's - Live Streaming for user groups and other events.
+ :PROPERTIES:
+ :CREATED: [2022-10-04 Tue 00:01]
+ :END:
+
+https://github.com/timvideos/streaming-system
+
+*** SOMEDAY <no title> — DebConf Videoteam Ansible documentation
+ :PROPERTIES:
+ :CREATED: [2022-10-03 Mon 23:40]
+ :END:
+
+https://debconf-video-team.pages.debian.net/ansible/ansible_roles/etherpad.html
+
+*** SOMEDAY DebConf video team / ansible · GitLab
+ :PROPERTIES:
+ :CREATED: [2022-10-03 Mon 23:38]
+ :END:
+
+https://salsa.debian.org/debconf-video-team/ansible
+
+** SOMEDAY handprint · PyPI
+ :PROPERTIES:
+ :CREATED: [2022-11-14 Mon 23:22]
+ :END:
+
+https://pypi.org/project/handprint/
+That might be interesting for reviewing text recognition output
+
+** TODO Update websocket
+ SCHEDULED: <2022-12-18 Sun>
+
+** TODO Idea for next year: save talk details in an org note so that I can easily send e-mails comparing previous with current
+ :PROPERTIES:
+ :CREATED: [2022-11-20 Sun 10:31]
+ :END:
+
+[[file:~/proj/emacsconf/wiki/2022/speakers.md::you beforehand.]]
+
+** DONE What ideas do we want to borrow from other conferences?
+:PROPERTIES:
+:CUSTOM_ID: other-confs
+:END:
+
+- FOSDEM had a conference track
+ - https://archive.fosdem.org/2022/schedule/track/conference_organisation/
+- DebConf
+ - Thorough documentation at https://debconf-video-team.pages.debian.net/docs/
+ - https://debconf-video-team.pages.debian.net/docs/online_volunteer_roles.html
+ - Ansible: https://salsa.debian.org/debconf-video-team/ansible , https://debconf-video-team.pages.debian.net/ansible
+ - SReview for cutting videos?
+ - https://wiki.debian.org/Teams/DebConf/Video/Subtitles
+ - Pentabarf https://lists.debian.org/debconf-team/2008/08/msg00147.html
+ - Schedule shows local time and DebConf time: https://debconf21.debconf.org/schedule/
+- LibrePlanet https://libreplanet.org/2022/
+ - libreadventure, minetest?
+
+ - https://www.collabmagazine.com/organizing-a-multi-track-virtual-conference-with-microsoft-teams-live-events-a-technical-playbook-and-lessons-learned/ : 4-person team, post-prod, break commercials
+
+*** SOMEDAY virtual-conf-resources/foss-north.md at master · e8johan/virtual-conf-resources
+ :PROPERTIES:
+ :CREATED: [2022-10-01 Sat 23:50]
+ :END:
+
+https://github.com/e8johan/virtual-conf-resources/blob/master/foss-north.md
+
+*** SOMEDAY e8johan/virtual-conf-resources: Resources for virtual conferences
+ :PROPERTIES:
+ :CREATED: [2022-10-01 Sat 23:49]
+ :END:
+
+https://github.com/e8johan/virtual-conf-resources
+
+** TODO Consider hosting reveal.js for EmacsConf
+:PROPERTIES:
+:CREATED: [2022-11-25 Fri 10:55]
+:END:
+** TODO back up media and bbb
+SCHEDULED: <2023-01-26 Thu>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 13:07]
+ :END:
+
+** TODO figure out how zaeph can run ansible
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 08:23]
+:END:
+** TODO [#A] Check that the restreams can handle hiccups
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:48]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-01 Thu 12:39]--[2022-12-01 Thu 18:36] => 5:57
+:END:
+
+
+https://toobnix.org/w/dmibQFkBTNcJyTVVQTyd5C
+
+ugh might need to restart restreams
+PTS 233286211, next:63716000 invalid dropping st:0
+DTS 233286223, next:63828674 st:1 invalid dropping
+
+screen -S restream-test-toobnix -X quit; screen-restream-test-toobnix.sh
+screen -S restream-test-youtube -X quit; screen-restream-test-youtube.sh
+screen -S restream-gen-toobnix -X quit; screen-restream-gen-toobnix.sh
+screen -S restream-gen-youtube -X quit; screen-restream-gen-youtube.sh
+screen -S restream-dev-toobnix -X quit; screen-restream-dev-toobnix.sh
+screen -S restream-dev-youtube -X quit; screen-restream-dev-youtube.sh
+
+ugh sound timestamps get all messed up
+
+** TODO Figure out how to have a test talk for publishing
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 09:03]
+:END:
+** TODO figure out back button
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 21:45]
+:END:
+
+<bandali> hmm, for some reason with firefox the back button doesn't seem to
+ work as expected on after clicking on one of the tracks on
+ live.emacsconf.org [21:44]
+<bandali> seems like there's an additional redirect or something. doesn't
+ matter too much tho [21:45]
+
+** TODO Erc bot so bandali and zaeph can check time remaining
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 16:16]
+:END:
+
+** TODO make hotkeys for kicking the 480p streams
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 14:52]
+:END:
+** SOMEDAY Add timezones to all schedules
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 20:40]
+:END:
+
+** SOMEDAY https://social.coop/@jotaemei/109456544613400591
+:PROPERTIES:
+:CREATED: [2022-12-04 Sun 18:10]
+:END:
+
+jotaemei@social.coop - This year’s #Emacs Conference is taking place right now; its official website is naturally RMS/FSF/MIT flavored. The video feed is not working on my mobile phone browser. So, the alternative instructions are to open a link in MPV (will VLC work?) on a desktop. The event times that are given in the schedule do not display a timezone. And presentation notes and collection of audience questions are provided via Etherpad. 😆 I hope the recordings will be available. ☺️ https://emacsconf.org/2022/watch/dev/
+
+** SOMEDAY Consider idle timer for wiki publishing the wiki, at for running things
+:PROPERTIES:
+:CREATED: [2022-12-03 Sat 21:21]
+:END:
+
+** SOMEDAY Re: How to avoid the user triggering "Forbidden reentrant call of Tramp"
+:PROPERTIES:
+:CREATED: [2022-12-03 Sat 20:32]
+:END:
+
+https://lists.gnu.org/archive/html/tramp-devel/2021-04/msg00036.html
+
+** TODO Make it easier to ship a last-minute update
+
+1. Upload file to backstage
+2. make all
+3. Copy to orga@res:~/stream
+4. Sync it to orga@res:~/cache
+
+** SOMEDAY [#C] Add timezone note above every schedule table
+:PROPERTIES:
+:CREATED: [2022-12-03 Sat 01:41]
+:END:
+
+** TODO Braindump things that worked well and things I'm looking forward to tweaking
+SCHEDULED: <2022-12-05 Mon>
+** TODO Incorporate zaeph's braindump
+** SOMEDAY https://social.coop/@jotaemei/109468491432592197
+:PROPERTIES:
+:CREATED: [2022-12-06 Tue 15:57]
+:END:
+
+jotaemei@social.coop - @sachac I like this idea of a timezone converter for people displayed on (or by) the listing. For me, the cause was that I was trying to find my way around the site at the last second and was afraid I’d missed a presentation I saw someone post earlier about coming up, but I think it was just that the speakers were running a little behind schedule.
+
+** SOMEDAY Add export/txt to the pad announcements next year - dto
+:PROPERTIES:
+:CREATED: [2022-12-05 Mon 23:16]
+:END:
+
+** TODO Learn from other conferences
+*** Neovimconf
+*** SOMEDAY Normconf: The Normcore Tech Conference
+:PROPERTIES:
+:CREATED: [2022-12-07 Wed 00:09]
+:END:
+
+https://normconf.com/
+** SOMEDAY Look into properly streaming to YouTube, Toobnix, and 480p
+:PROPERTIES:
+:CREATED: [2022-12-08 Thu 21:27]
+:END:
+
+** TODO Consider practising with ffmpeg in the cloud so that we can handle last-minute submissions
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 11:07]
+:END:
+
+https://cloud.google.com/functions/docs/console-quickstart-1st-gen
+https://aws.amazon.com/marketplace/pp/prodview-ixe3igo3gsu24#pdp-pricing
+or a VM
+
+*** TODO https://github.com/tuomastik/ffmpeg-google-cloud
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 11:07]
+:END:
+
+https://cloud.google.com/functions/docs/console-quickstart-1st-gen
+
+*** SOMEDAY Investigate bacalhau compute over data
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 17:14]
+:END:
+
+*** SOMEDAY Using video transcoding on Amazon ECS - Amazon Elastic Container Service
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 20:52]
+:END:
+
+https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-vt1.html
+
+** SOMEDAY Add timer for 5 minute and 2 minute warnings to go to emacsconf-org
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 16:36]
+:END:
+
+** TODO make the Org agenda versions more visible
+:PROPERTIES:
+:CREATED: [2022-12-13 Tue 10:54]
+:END:
+** SOMEDAY Explore idea of OBS virtual webcam showing the question vs screenshare
+:PROPERTIES:
+:CREATED: [2022-12-13 Tue 16:38]
+:END:
+
+** SOMEDAY Ideas for people to reach out to for talks?
+*** Using emacs mail to prefilter mail
+https://www.reddit.com/r/emacs/comments/zp0qn6/a_tragic_story_of_emacs_lover/j0r7i1f/
+
+** SOMEDAY Check ffmpeg benchmarks and recommendations; can we speed up our encoding for last-minute submissions?
+:PROPERTIES:
+:CREATED: [2022-12-13 Tue 15:38]
+:END:
+
+*** SOMEDAY https://www.reddit.com/r/AV1/comments/k7colv/encoder_tuning_part_1_tuning_libvpxvp9_be_more/?utm_source=share&utm_medium=android_app&utm_name=androidcss&utm_term=2&utm_content=share_button
+:PROPERTIES:
+:CREATED: [2022-12-13 Tue 20:58]
+:END:
+
+** TODO https://owncast.online/faq/
+:PROPERTIES:
+:CREATED: [2022-12-23 Fri 10:46]
+:END:
+
+instead of Icecast? uses RTMP
+** STARTED Jingle
+:PROPERTIES:
+:CREATED: [2022-12-09 Fri 08:46]
+:Effort: 0:15
+:QUANTIFIED: Emacs
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-09 Fri 09:15]
+:END:
+
+[02:38] <dto> tweaked it https://usercontent.irccloud-cdn.com/file/akHATPq3/emacsconf.ogg
+
+* Things to figure out / decisions to make
+:PROPERTIES:
+:CUSTOM_ID: decisions
+:END:
+
+#+TOC: headlines 1 local
+** Do we want to drop talks?
+:PROPERTIES:
+:CUSTOM_ID: drop
+:END:
+
+- *Keep the slot open, allow people to speak live*
+ - If they don't show up, continue with previous Q&A or have an open room
+
+
+** How do we want to coordinate during the conference itself?
+:PROPERTIES:
+:CUSTOM_ID: coordination
+:END:
+
+- Considerations:
+ - Good to have something that the hosts and streamers can walk through step by step
+ - Do we want the check-in volunteer to also keep something
+ - Announcing and publishing are easier if the task states are updated
+
+- Mumble for walkie-talkie communications?
+ - Can we keep it off the stream more reliably, but still be able to choose to put it on the stream?
+ - We can keep it in the combined sink and then manually go to that
+ channel in our clients when we want to talk on stream
+ - Should we have a Gen channel and a Dev channel so that we can choose to speak into ?
+- Checklist
+ - Etherpad
+ - All the volunteers can access it easily
+ - Tasks can be updated through SSH commands
+ - conf.org
+ - Run Emacs commands directly from it
+ - A little trickier in terms of access
+
+** How do we want to make the full schedule more manageable?
+:PROPERTIES:
+:CUSTOM_ID: sched-decision
+:END:
+
+Host role:
+- Give the speaker a heads-up before their Q&A session begins
+- If needed, read the questions from the pad to the speaker (Many speakers are comfortable reading the pad on their own.)
+- Give the speaker time warnings before the end of their Q&A session on the stream. Interested participants can continue
+
+Streamer role:
+- Switch between playing the prerec and joining the Q&A session
+- Adjust audio volume at the beginning of the Q&A session
+- (optional) Switch scene layouts to focus on different things
+
+Shifts will be Sat AM, Sat PM, Sun AM, or Sun PM per track. People can take multiple shifts.
+
+https://emacsconf.org/2022/decisions/#schedule
+
+- Figure out how hosting can be done in shifts
+ - Add notes in one place
+- Figure out how streaming can be done in shifts: OBS in the cloud?
+ - [[*Investigate streaming options, maybe OBS in the cloud][Investigate streaming options, maybe OBS in the cloud]]
+- Figure out how publishing can be done in shifts
+ - Console Emacs in a VM with everything set up for publishing to the wiki
+
+[2022-10-04 Tue]
+- Added option H: general starts with general Org use cases and moves on to more niche things on day 2.
+ - compared to A, general audience will be more interested in Org use
+ cases than in Hyperbole, and then we can look at specific
+ techniques on day 2
+
+[2022-10-04 Tue]
+- Discussed option G with zaeph on #emacsconf-org. zaeph prefers
+ option A over option G because it gives people more choices -
+ they can hop from talk to talk.
+
+[2022-10-03 Mon]
+- Discussed with bandali and zaeph on #emacsconf-org
+- Decided on Option A with B, C, or F as fallbacks depending on volunteer roster
+- Better for the viewers and the volunteers
+
+** Do we want to skip the closed Q&A and go straight to open?
+:PROPERTIES:
+:CUSTOM_ID: closed
+:END:
+
+- Closed: Less moderation needed in the beginning
+- Open: less coordination needed (since the host doesn't have to either tell me that it's okay to open it up or change the task status themselves), and people are generally good at meeting etiquette
+** How much do we want to enrich the wiki with JS?
+:PROPERTIES:
+:CUSTOM_ID: wiki-design
+:END:
+Ideas to consider:
+- Toggling local time display on the schedule
+- Making organizers-notebook nicer to browse through (or maybe use organice?)
+- Improve the video player (resolution switching? chapter markers?) - https://github.com/sampotts/plyr for video?
+
+*** SOMEDAY [#C] ?: Figure out JS and CSS niceties that will make organizers-notebook more enjoyable to browse through :css:js:
+
+
+- TODO/DONE/etc. keyword highlighting?
+- Collapsible sections?
+*** SOMEDAY [#C] ?: Find a way to add JS libraries to the wiki but shield them from anon editing :js:
+gitolite should have some options to do this
+*** SOMEDAY [#C] ?: Beautify video players :js:css:
+Might not be necessary.
+** How do we want to make better use of Etherpad?
+:PROPERTIES:
+:CUSTOM_ID: pad-decision
+:END:
+Pain points:
+- Lots of scrolling for speakers
+- Takes some effort to move questions from IRC to the pad
+*** How many pads do we want?
+- One pad for everything
+ - Scroll down, down, down
+ - Easy to set up at the beginning
+ - Inertia
+- One pad per set of talks (Saturday AM, Saturday PM, Sunday AM, Sunday PM)
+ - Less scrolling
+- One pad per talk, plus one meta pad
+ - Very little scrolling
+ - Can send people directly to the pad
+*** Do we want to host our own?
+- Use etherpad.wikimedia.org
+ - Worked fine last year
+- Host our own
+ - Might be able to use API to append questions to it, if we want to get super fancy
+*** Do we want to embed the pad as an iframe on the watch page? on talk pages?
+This guides people to use the pad for discussion/questions instead of IRC
+
+Options:
+
+- Current: None, just a link
+- Big pad on the watch page:
+- Individual pads:
+ - Watch page needs to be updated with current pad and link to previous pad
+ - Individual talk page can embed the iframe
+- Embed the IRC channel instead
+
+** Can we nudge people to ask IRC questions in a way that will make it easier for us to follow them?
+:PROPERTIES:
+:CUSTOM_ID: irc-markers
+:END:
+
+Two tracks mean two IRC channels with lots of space for Q&A, so this may become less of an issue
+
+Pain points:
+
+- Q&A/discussions often overlap with the next talks
+- Sometimes questions don't get copied to the pad
+- Fast discussions can get overwhelming
+
+Ideas:
+
+- Announce pad link at the beginning of the talk and at the start of
+ live Q&A, encourage most people to ask questions there
+- Encourage people to start questions with Q:
+ - A little extra work, but not as much as including the slug
+ - Easier to pick out when people search
+ - Volunteers can restate questions easily if people forget the Q:
+- Encourage people to start questions with Q-slug: (ex: Q-news: question about Emacs News Highlights, Q-journalism: ...)
+ - Easier to pick out questions even with overlapping Q&A/talks
+- Use two or three IRC channels so that talks can rotate among channels
+ - Easier to pick out questions even with overlapping Q&A/talks
+ - Needs logging and more organizer attention
+- Maybe a volunteer can have an ERC command that copies a question into a buffer, or even into the Etherpad
+** Do we want people to advertise any openings with their companies or any work that they're looking for?
+:PROPERTIES:
+:CUSTOM_ID: advertising
+:END:
+
+- Speakers on their page?
+- General audience on a wiki page somewhere?
+
+** Decision archive
+:PROPERTIES:
+:CUSTOM_ID: decision-archive
+:END:
+*** Where should volunteers e-mail?
+:LOGBOOK:
+- Note taken on [2022-09-23 Fri 11:26] \\
+ Discussed in #emacsconf-org
+:END:
+
+- *Default to emacsconf-org and offer emacsconf-org-private as an option*
+- emacsconf-org-private
+ - less public, e.g. if for whatever reason we might have to decline an offer of help
+ - Also, some people want to volunteer but do not want to be in the public’s eye.
+- emacsconf-org
+ - If you’re thinking about the enticement factor of having people
+ volunteer publicly, we’ll still have a well-furnished list of people
+ helping us run the conf somewhere on the wiki. [11:22]
+ - i would think if someone doesn't want to do it publicly, they could
+ opt to write to -org-private instead, but otherwise the defacto
+ should be public (-org)
+ - i just think most folks would want to do this publicly unless for
+ specific reasons, rather than the other way around
+
+*** CANCELLED Do we want to do alt-stream the same way again this year?
+
+Superseded by decision to have multiple tracks
+
+- Alt stream joins the current session and then continues with it until the Q&A finishes; people join the BBB room if they want to ask questions
+ - Nice and convivial, Q&A still gets captured
+ - Inertia means most people get the main message
+- Multiple streams with more space between talks, people choose which stream they want to watch
+ - How other conferences do it
+ - Speakers can attend related talks more easily
+*** DONE Shall we put a generic e-mail address for sending feedback, maybe with different mailtos?
+CLOSED: [2022-10-07 Fri 14:45]
+Pain points:
+- Many talk pages don't have public e-mail addresses, so it takes a
+ little extra work (or is sometimes impossible) for people to follow
+ up if they have questions
+
+Options:
+- Do nothing (current)
+- Add a mailto link to emacsconf-discuss that prepopulates the subject
+- Add a mailto link to emacsconf-org
+ - Wider discussion
+- *Add a mailto to emacsconf-org-private*
+ - Private feedback that can be forwarded to the speaker
+
+*** DONE How many BBB rooms do we want to set up?
+:PROPERTIES:
+:CUSTOM_ID: bbb-rooms
+:END:
+
+- One per talk
+ - We can send speakers a direct link to their room and they can check into it themselves
+ - Needs a little more work when setting up rooms and when extracting videos
+ - Easier for the host to join
+ - Check-in person can just keep an ear open in that room
+- Five or so, rotating among them
+ - Check-in person directs the speaker to the next available room
+ - Worked fine last time
+*** DONE How easy do we want to make it to join the BBB session?
+:PROPERTIES:
+:CUSTOM_ID: bbb-join
+:END:
+Considerations:
+- It's easier for the checkin person to deal with only the speaker
+- We may not want people to join the Q&A session at the beginning
+- We want to make it easy for people to join the Q&A session eventually
+
+Options:
+
+- PROBABLY EASIEST: Set it to anyone can join, but the meeting needs to be started by a
+ moderator. Start the meeting on the day of the talk. Announce the
+ BBB URL in the pad, IRC channel, and on the talk page when the host
+ is ready. Maybe add a rewrite rule when the host is ready.
+- Set an access code. Announce the access code when the host is ready.
+ - Access codes are annoying to copy and paste.
+ - Access codes might get accidentally unset or regenerated.
+- Set room so that moderators have to approve waiting users.
+ - Check-in has to watch out for waiting speaker.
+ - Host sets it to accept everyone who's waiting when the host is ready.
+ - Changing it to turn the option off doesn't seem to affect an
+ ongoing meeting, even though the web interface says you should be
+ able to change the setting any time.
+ - Waiting users don't make the user notification go ding.
+
+Change talk status to OPEN_Q or UNSTREAMED_Q, and change to TO_ARCHIVE when done.
+M-x emacsconf-publish-bbb-redirect to update the redirect for a single talk
+M-x emacsconf-publish-bbb-redirect-all updates all the redirects
+**** DONE Add nginx redirect from emacsconf.org
+CLOSED: [2022-11-19 Sat 11:17]
+/ssh:front|sudo::/etc/nginx/sites-available/emacsconf.org
+*** DONE How do we want to name the BBB rooms?
+CLOSED: [2022-10-19 Wed 11:08]
+:PROPERTIES:
+:CUSTOM_ID: bbb-name
+:END:
+
+Needs to be easy to:
+- share all the BBB rooms for a particular shift with the check-in volunteer
+- start the BBB rooms for the morning
+- match up the recordings with the talks afterwards
+- find the BBB room for a talk or speaker
+- remove all the BBB rooms for the year
+
+ec22-sat-am-dev Speaker Name (slugs)
+
+*** SOMEDAY [#C] Do we want to make the ikiwiki web-editable?
+:PROPERTIES:
+:CUSTOM_ID: cgi
+:END:
+Pain points:
+- Speakers usually ended up going through us
+
+Options:
+- Web-editable:
+ - Speakers and general public will be able to edit it more easily
+- Git: (current)
+ - Haven't had a problem with spam
+ - Reduces merge conflict potential
+
+** TODO Think about what to do with schedule gaps due to cancelled talks :thoughts:
+SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 17:30]
+:CUSTOM_ID: schedule-gaps
+:END:
+
+- if the previous Q&A is still going, we can stream that one
+- if there are no previous Q&As running, options:
+ - just leave it on the in-between slide: no extra effort required
+ - host a breakout room in [[https://media.emacsconf.org/current/bbb-open.html][ec22-open]]: gives people someplaco to go, might lead to interesting conversatinos
+- big gaps: consider:
+ - substitute talk
+ - rearrange conference schedule
+ - just show the IRC
+ - replay talks from previous years
+
+*** SOMEDAY [#C] Consider fillers covering conference stuff :thoughts:
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 17:43]
+:END:
+
+** CANCELLED Split rms into two talks?
+CLOSED: [2022-12-01 Thu 09:17] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 23:06]
+:CUSTOM_ID: rmstedsplit
+:END:
+
+- Split into a separate talk:
+ - Can more easily have intros
+ - Can post the transcript to the talk page
+- Same talk, stream files:
+ - Might as well learn how to do that anyway
+
+*** DONE Figure out what to do about rms sequence
+CLOSED: [2022-12-01 Thu 09:17] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-30 Wed 22:26]
+:END:
+
+Keep it at one talk, but figure out stream files thing
+
+* Roles needed
+:PROPERTIES:
+:CUSTOM_ID: roles
+:END:
+Each role comprises different responsibilities. A person may have multiple roles. An organizer might take the lead for a role, but if you want to volunteer, speak up and they'll probably be glad to share the load.
+
+Some roles are also described on the https://emacsconf.org/2022/volunteer page. If you want to encourage people to volunteer to help, add a role description there.
+** During the proposal stage
+
+The roles below are related to the proposals in the early stages of the preparation.
+
+- Scheduler (SCHED: sachac)
+ - Process talks as they come and find the best place for them in the timeline
+ - Keep track of availability and thematic constraints and find solutions that accommodate most
+- Reviewer
+ - Review the proposals sent to emacsconf-submit before the speaker-notification deadline
+ - Raise flags if there are problems with a proposal (e.g. too much content for the short format)
+- Listener
+ - Receive emails from emacsconf-submit
+ - Ensure that candidates are sticking to the prescribed format (esp. the 10/20/40 duration rule)
+ - Respond to people's requests and suggestions, pulling in other people to help as needed
+- Publisher (PUB: sachac)
+ - Set up the wiki page
+- Infrastructure
+ - Figure out streaming options
+ - Set up file upload system that speakers will use
+ - Plan other systems that people will use
+
+** When speakers have submitted their pre-recorded videos
+
+- Copy to backstage as --original.webm and --main.webm using M-x emacsconf-upload-copy-from-json
+- Copy to res /data/emacsconf/2022
+- Start /data/emacsconf/2022/process-captions.py if it's not already running
+- Use ~zaeph/scripts/reencode.sh on the file as well
+
+- Video processor (zaeph)
+ - Standardize and compress uploaded videos
+- Caption lead (sachac)
+ - Prepare videos and starting captions for captioning volunteers
+- Captioner
+ - Edit automatically-generated captions to correct misrecognized words
+ - Nice to have: Break up the captions in better places so that subtitles are neither too long nor too short
+ - Perk: Get access to prerecorded videos
+- Quality checker
+ - Doublecheck videos for potential encoding issues or compression artifacts that get in the way of viewing
+ - Doublecheck captions
+- Tech checker
+ - Help speakers check that their system works well with BBB for live Q&A
+
+** During the conference
+- Streamer (STREAM)
+ - Download prerecorded videos
+ - Send the combined stream to Icecast for broadcasting
+- Director (DIR: corwin) - possibly same as streamer
+ - Switch scenes, manage audio volumes as needed
+ - Provide timekeeping information to host (especially go-live countdowns)
+- Host (HOST: zaeph)
+ - Introduce talks and speakers
+ - Read questions
+ - Give time warnings
+ - Thank speakers and transition to next talk
+- Timekeeper - possibly same as host
+ - Manage time based on all available information (prerecs durations, speakers not showing up, etc.)
+- Check in (CHECK)
+ - Notice speakers checking into IRC
+ - Get them into the correct room and help them doublecheck their audio and video quality
+ - Troubleshoot as needed
+ - Notify host about next room to join
+ - Follow up with speakers who haven't checked in yet
+ - Check on speakers periodically so that they're not waiting alone
+- Questions
+ - Copy questions from IRC and the pad to wherever the host and speaker are looking
+- Pad scribe
+ - Organize and format people's contributions
+ - Add notes about links, key points, questions, answers
+- Accessibility (ACCESS: dto)
+ - Describe visuals in #emacsconf-accessible
+ - Nice to have: echo the captions into #emacsconf-accessible
+- Quality checker
+ - Doublecheck stream quality and audio volume
+- Publisher (PUB: sachac)
+ - Announce talks in the IRC channels
+ - Nice to have: Update the wiki page with resources (video)
+ - Nice to have: Set resources to public as each talk is played (Toobnix, YouTube)
+ - Nice to have: Update the schedule to reflect changes throughout the day
+*** Shifts
+:PROPERTIES:
+:CUSTOM_ID: shifts
+:END:
+
+#+BEGIN_EXPORT md
+<a name="shifts"></a>
+#+END_EXPORT
+
+AM: 9-12 PM EST, PM: 1-5 PM EST (plus a little extra for setup/transition)
+
+Saturday Dec 3
+#+NAME: saturday-shifts
+| | Host | Streamer | Checkin | IRC | Pad | Coord |
+|--------+---------+----------+------------+---------+------------+--------|
+| Gen AM | zaeph | sachac | corwin | dto | publicvoit | sachac |
+| Gen PM | zaeph | sachac | FlowyCoder | bandali | publicvoit | sachac |
+| Dev AM | bandali | sachac | corwin | dto | | sachac |
+| Dev PM | bandali | sachac | FlowyCoder | bandali | | sachac |
+
+publicvoit - pad until 4pm on Sat, until 2pm on Sun
+
+Sunday Dec 4
+#+NAME: sunday-shifts
+| | Host | Streamer | Checkin | IRC | Pad | Coord |
+|--------+---------+----------+------------+---------+------------+--------|
+| Gen AM | zaeph | sachac | corwin | dto | publicvoit | sachac |
+| Gen PM | zaeph | jman | FlowyCoder | bandali | publicvoit | sachac |
+| Dev AM | bandali | sachac | corwin | dto | | sachac |
+| Dev PM | bandali | sachac | FlowyCoder | bandali | | sachac |
+
+Backups:
+- dev host/streamer: bandali, sachac
+- gen host/streamer: zaeph, sachac
+- checkin, IRC, pad: sachac
+
+Interested in a shift? Please e-mail [[mailto:emacsconf-org-private@gnu.org]] and we'll help you figure out what you need to learn.
+
+#+begin_src emacs-lisp :var sat=saturday-shifts :var sun=sunday-shifts :rownames no :colnames no :results verbatim replace
+`(setq emacsconf-shifts
+ (list
+ ,@(apply #'append
+ (mapcar
+ (lambda (day)
+ (let ((headers (mapcar (lambda (field) (intern (concat ":" (downcase field))))
+ (cdr (car (cadr day))))))
+ (mapcar
+ (lambda (row)
+ (apply #'append
+ (list 'list :id
+ (when (string-match "^\\([^ ]+\\) \\(AM\\|PM\\)" (car row))
+ (format "%s-%s-%s"
+ (car day)
+ (downcase (match-string 2 (car row)))
+ (downcase (match-string 1 (car row)))))
+ :track
+ (if (string-match "^Gen" (car row)) "General" "Development")
+ :start
+ (format "%sT%s:00:00%s"
+ (elt day 2)
+ (if (string-match "AM" (car row)) "08" "13")
+ emacsconf-timezone-offset)
+ :end
+ (format "%sT%s:00:00%s"
+ (elt day 2)
+ (if (string-match "AM" (car row)) "12" "18")
+ emacsconf-timezone-offset))
+ (seq-map-indexed
+ (lambda (value index)
+ (unless (string= value "")
+ (list (elt headers index) value)))
+ (cdr row))))
+ (cdr (cadr day)))
+ ))
+ (list
+ (list "sat" sat "2022-12-03")
+ (list "sun" sun "2022-12-04"))))))
+
+#+end_src
+
+#+RESULTS:
+:results:
+(setq emacsconf-shifts (list (list :id "sat-am-gen" :track "General" :start "2022-12-03T08:00:00-0500" :end "2022-12-03T12:00:00-0500" :host "zaeph" :streamer "sachac" :checkin "corwin" :irc "dto" :pad "publicvoit" :coord "sachac") (list :id "sat-pm-gen" :track "General" :start "2022-12-03T13:00:00-0500" :end "2022-12-03T18:00:00-0500" :host "zaeph" :streamer "sachac" :checkin "FlowyCoder" :irc "bandali" :pad "publicvoit" :coord "sachac") (list :id "sat-am-dev" :track "Development" :start "2022-12-03T08:00:00-0500" :end "2022-12-03T12:00:00-0500" :host "bandali" :streamer "sachac" :checkin "corwin" :irc "dto" :coord "sachac") (list :id "sat-pm-dev" :track "Development" :start "2022-12-03T13:00:00-0500" :end "2022-12-03T18:00:00-0500" :host "bandali" :streamer "sachac" :checkin "FlowyCoder" :irc "bandali" :coord "sachac") (list :id "sun-am-gen" :track "General" :start "2022-12-04T08:00:00-0500" :end "2022-12-04T12:00:00-0500" :host "zaeph" :streamer "sachac" :checkin "corwin" :irc "dto" :pad "publicvoit" :coord "sachac") (list :id "sun-pm-gen" :track "General" :start "2022-12-04T13:00:00-0500" :end "2022-12-04T18:00:00-0500" :host "zaeph" :streamer "jman" :checkin "FlowyCoder" :irc "bandali" :pad "publicvoit" :coord "sachac") (list :id "sun-am-dev" :track "Development" :start "2022-12-04T08:00:00-0500" :end "2022-12-04T12:00:00-0500" :host "bandali" :streamer "sachac" :checkin "corwin" :irc "dto" :coord "sachac") (list :id "sun-pm-dev" :track "Development" :start "2022-12-04T13:00:00-0500" :end "2022-12-04T18:00:00-0500" :host "bandali" :streamer "sachac" :checkin "FlowyCoder" :irc "bandali" :coord "sachac")))
+:end:
+
+** After the conference
+- Video processor
+ - Extract live segments into videos
+- Captioner
+ - Add more captions
+ - Summarize Q&A
+- Publisher
+ - Post more information
+* Infrastructure notes
+:PROPERTIES:
+:CUSTOM_ID: infra
+:END:
+
+** Uh... how should ikiwiki be set up?
+:PROPERTIES:
+:CUSTOM_ID: ikiwiki
+:END:
+
+- remove the ikiwiki_src clone from the ansible config
+https://ikiwiki.info/rcs/git/
+bare repo has a post-update hook that updates the src repo
+src repo is ~ikiwiki/emacsconf
+~git/repositories/pub/emacsconf-wiki.git/hooks/post-update runs ~git/repositories/pub/emacsconf-wiki.git/hooks/post-update.h00-ikiwiki-wrapper
+there is an anon mirror that's updated with sudo -u anon /home/anon/fetch-wiki
+the git wrapper is
+/home/ikiwiki/hooks/emacsconf
+
+~anon/emacsconf-wiki.git has origin git@git.emacsconf.org:pub/emacsconf-wiki (fetch)
+but git log does not have the new stuff
+Where is the new stuff?
+... hah, maybe I forgot to push
+
+** Backstage
+:PROPERTIES:
+:CUSTOM_ID: infra-backstage
+:END:
+*** File suffixes, and what they correspond to
+Per categories, earlier suffixes come earlier in the process.
+|----------------------------+------------------------------------------------------------------------|
+| Suffix | Description |
+|----------------------------+------------------------------------------------------------------------|
+| VIDEO | |
+| --original.EXT | File as submitted by speaker |
+| --reencoded.webm | Reencode via ffmpeg incantation |
+| --final.webm | Broadcast-ready reencode with normalized audio |
+|----------------------------+------------------------------------------------------------------------|
+| AUDIO | |
+| --original.EXT | Extracted audio track from speaker upload; used for speech-recognition |
+| --normalized.opus | Normalized audio track |
+|----------------------------+------------------------------------------------------------------------|
+| SUBTITLES | |
+| --?(incomplete-)transcript | Transcript provided by speaker |
+| --main.EXT | Broadcast-ready reencode; different formats for different uses |
+|----------------------------+------------------------------------------------------------------------|
+
+* Other tasks and processes
+:PROPERTIES:
+:CUSTOM_ID: other
+:END:
+
+#+TOC: headlines 1 local
+** Giving conf.org access to a new volunteer or fake user
+:PROPERTIES:
+:CUSTOM_ID: private-access
+:END:
+This can only be done by the admins of the gitolite instance (zaeph,
+or bandali as a backup). This is because the changes need to be made
+in the gitolite-admin repo that can only be accessed by admins. In a
+pinch, people with access to the `orga` user on front0 can manually
+add themselves to the list of admins and manually rebuild the
+instance.
+
+Regular process:
+- Get public key from volunteer,
+- Add key under ~./key/dir/~,
+- Update permissions on ~./conf/gitolite.conf~,
+- Push to origin.
+
+
+** As prerecorded talks come in
+:PROPERTIES:
+:CUSTOM_ID: prerec-process
+:END:
+
+- Sacha: Parcel out captioning work to volunteers, help them get set up
+- Volunteers: Caption pre-recorded videos (usually starting from autogenerated ones for easier work)
+- Make sure all the links/resources mentioned are written down somewhere (web page and enriched captions for pasting into #emacsconf-accessible)
+*** Compress the video
+Usage: =compress-video.sh original-file output-file=:
+
+(zaeph might tinker with this)
+
+#+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.
+
+2020 version used with parallel
+
+#+begin_src sh :tangle get-and-compress.sh :eval no
+Q=$1
+WIDTH=1280
+HEIGHT=720
+AUDIO_RATE=48000
+VIDEO_FILTER="scale=w=${WIDTH}:h=${HEIGHT}:force_original_aspect_ratio=1,pad=${WIDTH}:${HEIGHT}:(ow-iw)/2:(oh-ih)/2,fps=25,colorspace=all=bt709:iall=bt601-6-625:fast=1"
+FILE=$2
+SUFFIX=$Q
+shift
+shift
+if [ ! -f $FILE ]; then
+ wget https://mirror.csclub.uwaterloo.ca/emacsconf/2020/$FILE
+fi
+ffmpeg -y -i "$FILE" -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -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 -an -threads 8 /dev/null &&
+if [[ $FILE =~ "webm" ]]; then
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a copy "${FILE%.*}--compressed$SUFFIX.webm"
+else
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a libvorbis "${FILE%.*}--compressed$SUFFIX.webm"
+fi
+rm $FILE
+#+end_src
+
+2022 version used with parallel to compress low version
+
+#+begin_src sh :eval no :tangle "compress-video-low.sh"
+Q=$1
+WIDTH=1280
+HEIGHT=720
+AUDIO_RATE=48000
+VIDEO_FILTER="scale=w=${WIDTH}:h=${HEIGHT}:force_original_aspect_ratio=1,pad=${WIDTH}:${HEIGHT}:(ow-iw)/2:(oh-ih)/2,fps=25,colorspace=all=bt709:iall=bt601-6-625:fast=1"
+FILE=$2
+SUFFIX=$Q
+shift
+shift
+ffmpeg -y -i "$FILE" -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -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 -an -threads 8 /dev/null &&
+if [[ $FILE =~ "webm" ]]; then
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a copy "${FILE%.*}--compressed$SUFFIX.webm"
+else
+ ffmpeg -y -i "$FILE" $* -pixel_format yuv420p -vf $VIDEO_FILTER -colorspace 1 -color_primaries 1 -color_trc 1 -c:v libvpx-vp9 -b:v 0 -crf $Q -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -ac 2 -threads 8 -c:a libvorbis "${FILE%.*}--compressed$SUFFIX.webm"
+fi
+
+
+#+end_src
+*** sachac
+
+- download to local cache
+ ~/proj/emacsconf/private/sync-cache
+- upload to YouTube in case we can get autogenerated subtitles from there
+ https://studio.youtube.com/channel/UCwuyodzTl_KdEKNuJmeo99A/videos/upload?filter=%5B%5D&sort=%7B%22columnType%22%3A%22date%22%2C%22sortOrder%22%3A%22DESCENDING%22%7D
+- upload to res:~/2022/captions
+- caption.sh
+- sync-cache to copy the vtt
+- emacsconf-make-backstage-index
+- send confirmation e-mail
+*** Confirmation e-mail
+:PROPERTIES:
+:CUSTOM_ID: confirm-prerec
+:END:
+**** DONE Make sure all submissions have been acknowledged
+CLOSED: [2022-11-19 Sat 11:18]
+- [X] sibi
+- [X] vidianos
+- [X] bhavin
+- [X] gopar
+- [X] bala
+- [X] andrea
+- [X] andrew
+- [X] zachary for asmblox (reception confirmed by zaeph, and no problem
+ with video)
+- [X] ramin (ack’d by zaeph)
+- [X] abin (meain, ack’d by zaeph)
+
+**** Acknowledge pre-rec submission
+:PROPERTIES:
+:CUSTOM_ID: ack-prerec
+:END:
+
+#+begin_src emacs-lisp
+(defun emacsconf-mail-acknowledge-submission (talk &optional template)
+ (interactive (list (emacsconf-complete-talk-info)))
+ (save-window-excursion
+ (emacsconf-with-talk-heading (plist-get talk :slug)
+ (emacsconf-cache-video-data talk)
+ (when (string= (plist-get talk :status) "WAITING_FOR_PREREC")
+ (org-todo "TO_PROCESS"))))
+ (emacsconf-publish-backstage-index)
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "ack-prerec"))
+ (plist-get talk :email)
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :time (plist-get talk :time)
+ :title (plist-get talk :title)
+ :email (plist-get talk :email)
+ :minutes (plist-get talk :video-time)
+ :speakers-short (plist-get talk :speakers-short)
+ :url (concat emacsconf-base-url (plist-get talk :url))
+ :year emacsconf-year)))
+#+end_src
+**** Template
+:PROPERTIES:
+:EMAIL_ID: ack-prerec
+:TO: ${email}
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:SUBJECT: EmacsConf ${year}: Thank you for uploading your video!
+:END:
+
+Hi, ${speakers-short}!
+
+Just a quick note to let you know that I've downloaded your submission
+for "${title}". We've added your submission to the backstage area at
+${backstage} (username: ${backstage-user}, password:
+${backstage-password}), and we'll post the files on your talk page
+when the talk is public. A quick check shows that your video is about
+${minutes} minutes long (${time} minutes budgeted).
+
+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 ${year}, and thank you for submitting the prerecorded video
+before the conference!
+
+Sacha Chua
+*** Mastering the prerec’s audio-track
+:PROPERTIES:
+:CUSTOM_ID: mastering
+:END:
+
+Mastering is the process of preparing an audio-track for a purpose. For
+us, the purpose is quite simple: maximize the intelligibility of the
+speaker and minimize the noise.
+
+We can get great results with Audacity for the vast majority of
+audio-tracks. Sometimes, however, some audio-tracks have intractable
+noise-profile that require the use of model-based denoising filters that
+can applied with ffmpeg.
+
+We’ll start with the average Audacity workflow, and we’ll move on to the
+model-based filters after.
+
+**** Audacity workflow
+When we process a prerec, we extract the audio of the original upload
+and add it to the backstage. You should be able to find it under the
+name --original.$audio_format or --main.$audio_format. If it’s not
+there, it’s easy to extract the audio from the original video, but
+we’d prefer if you warned core-organizers about it because it’s not
+normal.
+
+We’ve simplified the process down to these steps:
+
+1. Open the audio file in Audacity.
+
+ You might want to increase the size of the waveform by pulling on the
+ bottom of the bottom of the track.
+
+ [[https://media.emacsconf.org/misc/audacity-demo-noise-reduction.webm][audacity-demo-noise-reduction.webm]]
+
+2. Find a moment of quiet in the video, and select it.
+
+ We ask our speakers to include 5 seconds of quiet at the beginning or
+ end of their prerecs, but even if they don’t, it’s relatively.
+
+3. Effects → Noise Reduction → Get Noise Profile
+
+4. Select → All
+
+5. Effects → Noise Reduction → OK
+
+ You can select a spoken portion of the track before applying the
+ effect and preview it to test your settings. The default are usually
+ enough (Noise reduction (dB): 12, Sensitivity: 6.00, Frequency smoothing
+ (bands): 3).
+
+ [[https://media.emacsconf.org/misc/audacity-demo-noise-reduction.webm][audacity-demo-noise-reduction.webm]]
+
+6. Tools → Apply Macro → Alpha
+
+ Before you can apply the Alpha macro, you need to save its content to
+ disk and import it via Tools → Macro Manager → Import.
+
+#+begin_src txt :eval no :tangle audacity-macro-alpha.txt
+Reverb:Delay="20" DryGain="5" HfDamping="99" Reverberance="15" RoomSize="70" StereoWidth="25" ToneHigh="0" ToneLow="100" WetGain="-13" WetOnly="0"
+Amplify:Ratio="1"
+FilterCurve:f0="79.621641" f1="101.02321" FilterLength="8191" InterpolateLin="0" InterpolationMethod="B-spline" v0="5.9148936" v1="0.042552948"
+Normalize:ApplyGain="1" PeakLevel="-3" RemoveDcOffset="1" StereoIndependent="1"
+Compressor:AttackTime="0.1" NoiseFloor="-50" Normalize="1" Ratio="2" ReleaseTime="1" Threshold="-30" UsePeak="0"
+#+end_src
+
+7. Export → Export Audio… → Opus Files (.opus format)
+
+ Use the following settings:
+
+ [[https://media.emacsconf.org/misc/audacity-export-settings.png][audacity-export-settings.png]]
+
+ #+begin_quote
+ Bit Rate: 64 kbps
+ VBR Mode: On
+ Compression: 10
+ Application: Audio
+ Frame Duration: 20 ms
+ Cutoff: Disabled
+ #+end_quote
+
+
+**** Model-based denoising filter
+If you can’t manage to get a good result with Audacity, chances are it’s
+because there’s too much noise in the video, even after profile-based
+denoising. This usually happens when the noise-pattern of an
+audio-track evolves over the video, or if has an aperiodic quality. For
+those, we’re going to need a bigger boat.
+
+Model-based denoising means using an AI-generated model to remove the
+audio frequencies that are usually associated to noise and preserve
+those that aren’t. A different context (e.g. noisy room with statics,
+noisy room with people chatting, etc.) means a different model; for us,
+this means a model that minimizes background noise and maximizes clear
+voices (the speakers’).
+
+This is the model we’ve been using:
+
+[[https://media.emacsconf.org/misc/audio-denoiser-model-mp.rnnn][audio-denoiser-model-mp.rnnn]] (download link)
+
+Source: [[https://github.com/GregorR/rnnoise-models][rnnoise-models]], Model: [[https://raw.githubusercontent.com/GregorR/rnnoise-models/master/marathon-prescription-2018-08-29/mp.rnnn][marathon-prescription]]
+
+You should always apply the filter on the original’s audio, as opposed
+to an Audacity-processed audio. This is to ensure that we have the most
+information about the signal, which means we can have gather the most
+information about the noise-profile.
+
+Following is the ffmpeg incantation to use to apply the filter-model.
+Make sure to modify the ~DENOISER~ variable and adapt input/output.
+
+#+begin_src sh :tangle audio-denoiser.sh :eval no
+DENOISER="/path/to/audio-denoiser-model-mp.rnnn"
+input="original.opus"
+output="denoised.opus"
+ffmpeg -i "$input" -af "arnndn=m=$DENOISER" "$output"
+#+end_src
+
+There’s no need to customize the libopus export information; the default
+is more than enough for human-speech.
+
+When you’re done with this step, you can then process the outputted
+audio-track with Audacity, skipping the denoising steps (1 to 5).
+
+**** Questions?
+If you’ve got any question on the process, you canget in touch with me (zaeph)!
+
+** When a talk is captioned
+:PROPERTIES:
+:CUSTOM_ID: when-captioned
+:END:
+- Combine captions with talk
+- Upload captions to YT and Toobnix
+- Prepare captions for wiki inclusion
+
+** Other tasks before the conference
+:PROPERTIES:
+:CUSTOM_ID: before
+:END:
+- Coordinate volunteer schedules so all the roles are covered
+*** Test stream setup
+:PROPERTIES:
+:CUSTOM_ID: test-stream
+:END:
+[[*Stream][Stream]]
+*** Set up MPV for captions
+:PROPERTIES:
+:CUSTOM_ID: mpv-captions
+:END:
+
+mpv.conf profile tips are now at https://emacsconf.org/mpv/ .
+
+**** Suggested font: Clear Sans
+Links:
+- tar.gz with all fonts: [[https://zaeph.tk/files/emacsconf/captions/fonts.tar.gz][from zaeph's server]] (more convenient)
+- WOFF from GitHub repo: [[https://github.com/intel/clear-sans/tree/main/WOFF][clear-sans/WOFF at main · intel/clear-sans]]
+*** Download prerecorded videos from ${protected}
+:PROPERTIES:
+:CUSTOM_ID: download-videos
+: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
+
+
+
+** During the conference
+:PROPERTIES:
+:CUSTOM_ID: during-conference
+: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 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 "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 "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/
+
+***** Stream
+:PROPERTIES:
+:CUSTOM_ID: other-streams
+:END:
+****** Low-res stream
+
+ Needs the =$main480p= environment variable set to something of the form =icecast://username:password@site:port/mount-point.webm=. Icecast configuration can be found on =live0= at =/etc/icecast2/icecast.xml=. It was okay to run this command directly on =live0= in 2020, since that kept the speed at roughly 1x.
+
+ #+begin_src sh :eval no
+ while true; do ffmpeg -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 $main480p done
+ #+end_src
+
+****** Youtube
+****** Toobnix
+
+****** DONE Add IRC links to YouTube and Toobnix descriptions
+CLOSED: [2022-12-01 Thu 09:10] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 07:49]
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-01 Thu 08:53]--[2022-12-01 Thu 09:10] => 0:17
+: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
+**** DONE Automatically commit to the wiki
+CLOSED: [2022-12-02 Fri 12:43]
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-02 Fri 11:12]
+:END:
+when emacsconf-publish-autocommit-wiki is set
+
+(emacsconf-publish-update-talk (append (list :public t) (emacsconf-resolve-talk "journalism")))
+(emacsconf-publish-update-talk (append (list :public nil) (emacsconf-resolve-talk "journalism")))
+
+
+**** DONE [#B] Make sure VTTs only get published when they're edited
+CLOSED: [2022-11-25 Fri 12:59] SCHEDULED: <2022-11-25 Fri>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 08:03]
+:END:
+***** publishing
+***** webm
+***** media directory
+**** DONE [#A] Fix mapconcat error in updating task status
+CLOSED: [2022-11-22 Tue 10:17] SCHEDULED: <2022-11-21 Mon>
+:PROPERTIES:
+:CREATED: [2022-11-21 Mon 07:23]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-22 Tue 10:06]--[2022-11-22 Tue 10:17] => 0:11
+:END:
+
+**** DONE Add intros to wiki pages
+CLOSED: [2022-11-23 Wed 13:42] SCHEDULED: <2022-11-23 Wed>
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 07:45]
+:END:
+
+**** SOMEDAY [#C] Cache video data - audio processed?
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 20:40]
+:END:
+
+**** DONE Cache video data - edited captions
+CLOSED: [2022-11-23 Wed 22:57]
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 20:40]
+:END:
+***** DONE Double-check that all the edited captions have the header
+CLOSED: [2022-11-29 Tue 07:50] SCHEDULED: <2022-12-01 Thu>
+
+#+begin_src emacs-lisp :eval no
+(mapcar (lambda (o)
+ (plist-get o :slug))
+ (seq-filter
+ (lambda (o) (and
+ (string= (plist-get o :status) "TO_STREAM")
+ (null (plist-get o :captions-edited))))
+ (emacsconf-get-talk-info)))
+#+end_src
+**** DONE Automatically commit and push the wiki
+CLOSED: [2022-12-02 Fri 12:47]
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-02 Fri 11:06]
+:END:
+
+**** DONE Set publishing on a timer :sachac:
+CLOSED: [2022-11-29 Tue 12:48] SCHEDULED: <2022-11-29 Tue>
+:PROPERTIES:
+:CREATED: [2022-11-26 Sat 21:10]
+:END:
+***** DONE Single timer, batch timers for playing and closed q
+CLOSED: [2022-11-29 Tue 12:48]
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 00:47]
+:END:
+(emacsconf-stream-schedule-timers)
+
+***** DONE Take intro into account for scheduling q&a time
+CLOSED: [2022-12-01 Thu 09:44] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-30 Wed 16:28]
+:END:
+***** TODO Test the timer
+SCHEDULED: <2022-12-02 Fri>
+
+#+begin_src emacs-lisp :eval no
+(let ((info (emacsconf-inflate-sexp '(journalism
+#+end_src
+
+**** DONE Simplify manual setting of a timer to update task status :sachac:
+CLOSED: [2022-11-29 Tue 12:35] SCHEDULED: <2022-11-29 Tue>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-29 Tue 11:02]--[2022-11-29 Tue 12:35] => 1:33
+:END:
+
+emacsconf-stream-schedule-talk-status-change
+**** DONE Rename update-task-status.sh to talk :sachac:
+CLOSED: [2022-11-29 Tue 07:44] SCHEDULED: <2022-11-29 Tue>
+
+**** DONE make sure captions are included on the wiki page
+CLOSED: [2022-11-26 Sat 22:23]
+:PROPERTIES:
+:CREATED: [2022-11-24 Thu 13:58]
+:END:
+
+**** DONE Set public based on time, expose more interactive functions :sachac:
+CLOSED: [2022-11-29 Tue 07:44] SCHEDULED: <2022-11-28 Mon>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 18:31]
+ :Effort: 0:30
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-29 Tue 07:41]--[2022-11-29 Tue 07:44] => 0:03
+ :END:
+so that the wiki doesn't have to depend on synchronized conf.org state
+
+#+begin_src emacs-lisp :eval no
+(cl-assert
+ (plist-get
+ (emacsconf-add-talk-status (list :start-time (date-to-time "2022-01-01T12:00:00-0400")))
+ :public))
+(cl-assert
+ (null
+ (plist-get
+ (emacsconf-add-talk-status (list :start-time (date-to-time "2030-01-01T12:00:00-0400")))
+ :public)))
+(cl-assert
+ (plist-get
+ (emacsconf-add-talk-status (list :start-time (date-to-time "2030-01-01T12:00:00-0400")
+ :status "PLAYING"))
+ :public))
+#+end_src
+
+**** TODO [#C] figure out if we need to adapt to org-time-stamp-formats change removing brackets
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 06:40]
+:END:
+
+*** 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]]
+
+*
+*** During each talk
+:PROPERTIES:
+:CUSTOM_ID: each-talk
+:END:
+- Volunteers: post links/resources/descriptions/captions (depending on your level of energy) to #emacsconf-accessible
+- Volunteers: making sure questions get posted somewhere the speaker can see them
+*** 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
+
+** After the conference
+:PROPERTIES:
+:CUSTOM_ID: after-conference
+:END:
+*** Send thanks
+[[*Thank you, next steps][Thank you, next steps]]
+*** Extract the opening and closing remarks
+*** Extract the Q&A recordings, trimming as needed
+From https://bbb.emacsverse.org/b/admins/recordings
+#+begin_src js2 :eval no :tangle no
+console.log([...document.querySelectorAll('.email-link')].map((o) => '| ' + o.closest('tr').querySelector('time').getAttribute('datetime') + ' | ' + o.closest('tr').querySelector('#recording-text').innerHTML.trim() + ' | ' + o.getAttribute('data-pres-link').trim() + ' |').join('\n'))
+#+end_src
+
+Make an ~ids.txt~ with the IDs extracted from BBB.
+
+In the same directory:
+#+begin_src bash :eval no
+while read p; do
+ mkdir -p "$p";
+ cd "$p";
+ wget "https://bbb.emacsverse.org/presentation/${p}/slides_new.xml" \
+ "https://bbb.emacsverse.org/presentation/${p}/video/webcams.webm" \
+ "https://bbb.emacsverse.org/presentation/${p}/deskshare.xml" \
+ "https://bbb.emacsverse.org/presentation/${p}/deskshare/deskshare.webm" \
+ "https://bbb.emacsverse.org/presentation/${p}/metadata.xml"
+ cd ..;
+done <ids.txt
+#+end_src
+
+Resource explanation:
+
+- slides_new.xml :: Text chat
+- webcams.webm :: Webcam as video stream, also has audio
+- deskshare.xml :: start and stop time of desktop sharing, if any
+- deskshare.webm :: Shared desktop as video
+- metadata.xml
+
+Probably focus on grabbing the audio first and seeing what's worth keeping
+
+#+begin_src emacs-lisp
+(defun emacsconf-extract-chat (slug speaker)
+ (interactive (list
+ (emacsconf-complete-talk)
+ (completing-read "Speaker: "
+ (seq-uniq
+ (mapcar (lambda (node) (dom-attr node 'name))
+ (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline)))
+ )))
+ (let ((text
+ (mapconcat (lambda (node)
+ (when (string= (dom-attr node 'target) "chat")
+ (let ((message
+ (replace-regexp-in-string
+ "\\(^[^ +]?\\): " ""
+ (replace-regexp-in-string "<a href=\"\\(.+?\\)\" rel=\"nofollow\"><u>\\(.+?\\)</u></a>"
+ "<\\1>" (dom-attr node 'message)))))
+ (if (string-match speaker (dom-attr node 'name))
+ (format "- %s: %s\n" speaker message)
+ (format "- %s\n" message)))))
+ (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline)
+ "")))
+ (emacsconf-edit-wiki-page slug)
+ (if (re-search-forward "# Discussion" nil t)
+ (progn
+ (goto-char (match-end 0))
+ (insert "\n\n"))
+ (goto-char (point-max)))
+ (kill-new text)))
+;; TODO: Combine lines from same nick, or identify speakers with anon1/2/etc.
+(defun emacsconf-extract-chat-from-dired ()
+ (interactive)
+ (find-file (expand-file-name "slides_new.xml" (dired-get-file-for-visit)))
+ (call-interactively 'emacsconf-extract-chat))
+#+end_src
+
+#+begin_src emacs-lisp :eval no
+(defun emacsconf-make-webcams-deskshare-spans (deskshare start-ms stop-ms strategy source-dir)
+ (let ((secs (/ start-ms 1000.0))
+ (webcam-video (expand-file-name "webcams.webm" source-dir))
+ (deskshare-video (expand-file-name "deskshare.webm" source-dir))
+ spans)
+ (mapc (lambda (o)
+ (unless (or (= secs (string-to-number (dom-attr o 'start_timestamp)))
+ (= (string-to-number (dom-attr o 'start_timestamp)) 0)
+ (> secs (/ stop-ms 1000.0)))
+ (setq spans (cons (list :source webcam-video
+ :start-ms (* secs 1000)
+ :stop-ms
+ (* 1000
+ (if (eq strategy 'test)
+ (+ secs 3)
+ (max secs (string-to-number (dom-attr o 'start_timestamp))))))
+ spans)))
+ (when (and (<= (string-to-number (dom-attr o 'start_timestamp))
+ (/ stop-ms 1000.0))
+ (>= (string-to-number (dom-attr o 'stop_timestamp))
+ (/ start-ms 1000.0)))
+ (setq spans (cons (list :source deskshare-video
+ :start-ms (max (* 1000 (string-to-number (dom-attr o 'start_timestamp)))
+ start-ms)
+ :stop-ms
+ (if (eq strategy 'test)
+ (* 1000 (+ (string-to-number (dom-attr o 'start_timestamp)) 3))
+ (min (* 1000 (string-to-number (dom-attr o 'stop_timestamp)))
+ stop-ms)))
+ spans))
+ (setq secs (string-to-number (dom-attr o 'stop_timestamp)))))
+ (dom-by-tag deskshare 'event))
+ (unless (>= (floor (* secs 1000)) stop-ms)
+ (setq spans (cons (list :source webcam-video
+ :start-ms (* 1000 secs)
+ :stop-ms (if (eq strategy 'test)
+ (* 1000 (+ secs 3))
+ stop-ms))
+ spans)))
+ (if (eq strategy 'test)
+ `((video ,@(reverse spans))
+ (audio ,@(mapcar (lambda (o)
+ (list :source webcam-video
+ :start-ms (plist-get o :start-ms)
+ :stop-ms (plist-get o :stop-ms)))
+ (reverse spans))))
+ `((video ,@(nreverse spans))
+ (audio (:source ,webcam-video :start-ms ,start-ms :stop-ms ,stop-ms))))))
+
+(defun emacsconf-get-ffmpeg-to-splice-webcam-and-recording (slug start-ms stop-ms info &optional strategy)
+ "Return FFMPEG command for slicing.
+Strategies:
+- 'fast-cut-start-keyframe - find the keyframe before the start ms and cut from there, doing a fast copy.
+- 'start-keyframe-and-reencode - find the keyframe before the start ms and cut from there, reencoding.
+- 'cut-and-concat - seek to the keyframe before, slowly find the start-ms, reencode the snippet, and then do a fast copy of the remaining. May have encoding errors.
+- default: copy from start-ms to stop-ms, reencoding.
+"
+ (let* ((source-dir (expand-file-name (concat "../questions/by-slug/" slug) emacsconf-captions-directory))
+ (video-slug (plist-get (seq-find (lambda (o) (string= (plist-get o :slug) slug)) info) :video-slug))
+ (output (expand-file-name (concat video-slug "--answers.webm") emacsconf-captions-directory))
+ (webcam-video (expand-file-name "webcams.webm" source-dir)))
+ (if (file-exists-p (expand-file-name "deskshare.webm" source-dir))
+ ;; Has deskshare
+ (let* ((deskshare (xml-parse-file (expand-file-name "deskshare.xml" source-dir)))
+ (final-size (compile-media-max-dimensions
+ (expand-file-name "deskshare.webm" source-dir)
+ (expand-file-name "webcams.webm" source-dir)))
+ (duration (compile-media-get-file-duration-ms (expand-file-name "webcams.webm" source-dir)))
+ (spans (emacsconf-make-webcams-deskshare-spans deskshare start-ms stop-ms strategy source-dir))
+ (compile-media-output-video-width (car final-size))
+ (compile-media-output-video-height (cdr final-size)))
+ (compile-media-get-command spans output))
+ ;; Just webcams
+ (compile-media-get-command
+ (compile-media-split-tracks
+ (list (list :source webcam-video :start-ms start-ms :stop-ms stop-ms)))
+ output))))
+#+end_src
+
+Make a table of the form
+
+#+NAME: QA_RECORDINGS
+| Start | End | Slug | Notes | URL | Timestamp |
+|-------+-----+------+-------+-----+-----------|
+
+#+begin_src emacs-lisp :var qa=QA_RECORDINGS :eval no :dir="videos/"
+(defun emacsconf-process-qa-recordings (qa dir)
+;; (setq conf-qa-recordings qa)
+;; (memoize 'conf-ffmpeg-get-closest-keyframe-in-msecs)
+;; (memoize 'conf-ffmpeg-get-keyframes-between)
+;; (memoize 'conf-video-dimensions)
+;; (memoize 'compile-media-get-file-duration-ms)
+;; (memoize-restore 'conf-ffmpeg-get-keyframes-around)
+
+(let ((info (emacsconf-get-talk-info)))
+ (replace-regexp-in-string
+ "captions/" "answers-slow/"
+ (replace-regexp-in-string
+ dir ""
+ (string-join
+ (nreverse
+ (sort
+ (delq nil
+ (mapcar
+ (lambda (o)
+ (when (> (length (car o)) 0)
+ (emacsconf-get-ffmpeg-to-splice-webcam-and-recording
+ (elt o 2)
+ (compile-media-timestamp-to-msecs (elt o 0))
+ (compile-media-timestamp-to-msecs (elt o 1))
+ info)))
+; (seq-take qa 2)
+ qa
+ ))
+ (lambda (a b) (string-match "trim" a))))
+ "\n")))))
+#+end_src
+
+*** Update the wiki
+*** 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.
+*** STARTED Update the chapter index for answers
+SCHEDULED: <2023-03-28 Tue>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+
+- emacsconf-subed-make-chapter-file-based-on-comments
+- emacsconf-publish-process-answers-chapters
+ - Put it in wiki/year/captions/ and add it to the repository
+ - Add it to the cache directory
+ - Upload it to media.emacsconf.org:~/year
+- Update the talk page
+- Remove the help marker from the talk page
+
+ https://emacsconf.org/help_with_chapter_markers/
+ [[~/proj/emacsconf/cache]]
+*** BLOCKED [#A] Downsize the server :bandali:
+SCHEDULED: <2022-12-03 Sat>
+* In case of
+:PROPERTIES:
+:CUSTOM_ID: exceptions
+:END:
+
+See https://pad.emacsconf.org/premortem for more.
+
+#+TOC: headlines 1 local
+
+** Common broadcast (gen and dev) :stream:
+:PROPERTIES:
+:CUSTOM_ID: common
+:END:
+
+Options:
+- mpv https://live.emacsconf.org/emacsconf/gen.webm
+- mpv the same video
+- join the BBB room
+
+emacsconf-stream-rebroadcast - specify the source track
+
+[[elisp:(emacsconf-stream-rebroadcast "Development" "General")][Development -> General]]
+[[elisp:(emacsconf-stream-rebroadcast "General" "Development")][General -> Development]]
+
+** Stream OBS needs to be restarted :stream:
+:PROPERTIES:
+:CUSTOM_ID: obs-restart
+:END:
+
+- ssh to the track and run ~track-obs~
+- ssh to live0.emacsconf and run whatever's appropriate:
+ #+begin_example
+ screen -S restream-test-toobnix -X quit; screen-restream-test-toobnix.sh
+ screen -S restream-test-youtube -X quit; screen-restream-test-youtube.sh
+ screen -S restream-gen-toobnix -X quit; screen-restream-gen-toobnix.sh
+ screen -S restream-gen-youtube -X quit; screen-restream-gen-youtube.sh
+ screen -S restream-dev-toobnix -X quit; screen-restream-dev-toobnix.sh
+ screen -S restream-dev-youtube -X quit; screen-restream-dev-youtube.sh
+ #+end_example
+- check if the streams are all right
+
+
+
+** Wiki :publish:
+:PROPERTIES:
+:CUSTOM_ID: ikiwiki-stuck
+:END:
+
+Stuck:
+
+ sudo -iu ikiwiki -- ikiwiki --setup ~ikiwiki/emacsconf.setup
+
+emacsconf.setup changed:
+
+ssh orga@front0.emacsconf.org
+sudo su - ikiwiki
+ikiwiki --setup emacsconf.setup --rebuild --wrappers
+
+** Cancelled talk :schedule:
+:PROPERTIES:
+:CUSTOM_ID: cancelled
+:END:
+
+1. Update conf.org to mark the talk as cancelled.
+2. Update the ~schedule-choices~ block to fix the time for the following talk, or recalculate all the schedules. Check for any validation errors in the ~:results:~ block.
+3. When you're happy with the schedule, run the ~draft-schedule~ block.
+4. Update the talk page to add CANCELLED to the title.
+5. Publish the wiki and doublecheck it.
+ - Talk gone from the schedule?
+ - Talk listed among the cancelled talks?
+ - Talk page has cancelled info?
+6. Remove the talk from the [[#one-track][one-track emergency schedule]]
+** Last-minute prerecording submission :upload:
+:PROPERTIES:
+:CUSTOM_ID: last-minute-prerec
+:END:
+
+- COORD will copy it from the FTP upload server to orga@res.emacsconf.org:~/stream -p 46668 and name it appropriately.
+- COORD will notify STREAM with the scp command and the mpv command so that STREAM can choose.
+
+** Technical issues during a live presentation :stream:
+: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 :stream:
+:PROPERTIES:
+:CUSTOM_ID: stream-issues
+:END:
+
+[[file:/ssh:orga@front0.emacsconf.org:/var/www/status.emacsconf.org/index.html]]
+
+- HOST notifies #emacsconf and #emacsconf-org and adds a note at the top of the ${pad}.
+- HOST updates the 2022.md wiki page
+- CHECK publishes prerecordings
+ - media.emacsconf.org
+ - wiki
+ - Toobnix
+ - Peertube
+- STREAM e-mails the mailing list
+** Last-minute caption or file update :upload:
+:PROPERTIES:
+:CUSTOM_ID: last-minute-captions
+:END:
+
+- CHECK uploads the --main.vtt file to orga@res.emacsconf.org:~/stream -p 46668
+- If streaming locally, STREAM copies the VTT file and loads it into MPV with =--sub-file=
+
+ssh orga@media.emacsconf.org
+cd backstage; make all
+
+ssh orga@res.emacsconf.org -p 46668
+~/cache/update-cache
+cd ~/stream
+cp ~/cache/*$SLUG*--main.webm .
+
+
+** Pad malfunction or mess-up :infra:
+:PROPERTIES:
+:CUSTOM_ID: pad-broken
+:END:
+
+- PAD resets the pad using the time slider
+- [? still not recovered]
+ - PAD reimports the pad from backup
+
+** Speaker has not checked in :sched:
+: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.
+ - Show the questions and discussion, invite people into the Q&A to talk about the talk. They can share their experiences and comments.
+
+** Speaker does not have a prerec and has not checked in :sched:
+:PROPERTIES:
+:CUSTOM_ID: really-missing
+:END:
+- Let the previous talk do extended Q&A
+- 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
+** Conduct guidelines issue :host:
+:PROPERTIES:
+:CUSTOM_ID: conduct
+:END:
+
+- [? IRC]: IRC operator addresses it with a reminder and/or a kick or a ban
+- [? not resolved, or onscreen]
+ - 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:
+
+- COORD or STREAM does check-ins
+- HOST refers to the shift pad for Q&A preference etc.
+- STREAM checks ~/stream 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 will do the hosting.
+
+** 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
+ - Consider dropping the restream to Toobnix (lower audience?) or to Youtube
+ - Add additional node to Linode account for shared transfer pool (TODO: doublecheck)
+
+** People have a hard time seeing dark-mode presentations (or light-mode)
+:PROPERTIES:
+:CUSTOM_ID: dark-mode
+:END:
+
+mpv --vf=negate $url
+** Schedule update :sched:
+:PROPERTIES:
+:CUSTOM_ID: update-sched
+:END:
+
+- Test the new schedule using the blocks near the beginning of conf.org
+- emacsconf-publish-update-schedule
+- E-mail affected speakers - see emacsconf-mail-schedule-update function
+
+** New talk :sched:
+:PROPERTIES:
+:CUSTOM_ID: new-talk
+:END:
+- Create entry in conf.org
+- Fit it into the schedule using the emacsconf-schedule-plan variable
+- When happy, execute the draft-schedule block to update the SCHEDULED properties
+- emacsconf-generate-talk-page
+- emacsconf-update-schedule
+- emacsconf
+- emacsconf-stream-generate-assets-for-talk
+** In case we need to do things manually because the task status hooks don't work
+:PROPERTIES:
+:CUSTOM_ID: manual
+:END:
+
+export SLUG=the ID of the talk
+
+#+TOC: headlines 1 local
+*** TO_STREAM -> PLAYING :stream:
+
+play slug (ex: play journalism)
+*** CLOSED_Q -> OPEN_Q
+:PROPERTIES:
+:CUSTOM_ID: open
+:END:
+
+Example for mail talk:
+
+STATE=open; ssh orga@media.emacsconf.org "cp /home/orga/backstage/assets/redirects/$STATE/bbb-$SLUG.html /home/orga/2022/current/"
+
+*** OPEN_Q -> TO_ARCHIVE
+:PROPERTIES:
+:CUSTOM_ID: archive
+:END:
+
+Example for mail talk:
+
+STATE=after; ssh orga@media.emacsconf.org "cp /home/orga/backstage/assets/redirects/$STATE/bbb-$SLUG.html /home/orga/2022/current/"
+
+If you need to reset the state:
+
+STATE=before; ssh orga@media.emacsconf.org "cp /home/orga/backstage/assets/redirects/$STATE/bbb-$SLUG.html /home/orga/2022/current/"
+** Alternate stream volunteer wants to stream
+: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:stream-desktop-and-audio.sh]]:
+ #+begin_src sh :eval no :tangle 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] (look for “Set up sinks for sound” under 2021/)
+ - [? 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
+
+** Video playing error, need to play with mpv manually :stream:
+:PROPERTIES:
+:CUSTOM_ID: play-mpv-manually
+:END:
+
+You can skip the intro and play a video by specifying the filename, like this:
+play ~/stream/emacsconf-2022-journalism-*
+** Shift changes
+
+1. Update [[#shifts]]
+2. Evaluate the code underneath to get the setq.
+3. Put the setq in emacsconf.el.
+4. Regenerate the hyperlists: emacsconf-pad-prepopulate-hyperlists
+
+** Need to restart 480p stream :stream:
+:PROPERTIES:
+:CUSTOM_ID: restart-480p
+:END:
+
+ssh live
+
+/usr/local/bin/emacsconf-lowres-dev-on-connect
+or
+/usr/local/bin/emacsconf-lowres-gen-on-connect
+** Renamed talk :sched:
+:PROPERTIES:
+:CUSTOM_ID: renamed
+:END:
+
+1. Change conf.org heading.
+2. Change the video slug property.
+3. Rename any existing files in the backstage area.
+4. emacsconf-publish-backstage-index
+5. Change the title and heading on the wiki page.
+6. Update the schedule (emacsconf-publish-schedule).
+7. Update info pages (emacsconf-publish-info-pages).
+8. Update the watch page (emacsconf-publish-watch-pages).
+9. Update the pad, and the two previous pads.
+10. Update the in-between slide (and for the following one) and upload the assets.
+11. Redo the intros for that talk and the following one
+ SLUG=health; ffmpeg -y -loop 1 -i ../../in-between/$SLUG.png -i $SLUG.opus -i $SLUG.vtt -shortest ../$SLUG.webm; mpv $SLUG.webm
+
+*** DONE Rename lspbridge
+CLOSED: [2022-12-02 Fri 19:23]
+rerecord lspbridge intro
+
+lspbridge science
+
+*** DONE Rename health
+CLOSED: [2022-12-02 Fri 19:27]
+:PROPERTIES:
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-02 Fri 18:58]--[2022-12-02 Fri 19:27] => 0:29
+:END:
+health eev
+** TODO Need to restart the Toobnix streams so we don't exceed 5 hours
+:PROPERTIES:
+:CREATED: [2022-12-03 Sat 12:33]
+:END:
+
+screen -S restream-gen-toobnix -X quit; screen-restream-gen-toobnix.sh
+screen -S restream-dev-toobnix -X quit; screen-restream-dev-toobnix.sh
+
+* Task archive
+:PROPERTIES:
+:CUSTOM_ID: archive
+:END:
+
+** DONE Write preparation instructions :zaeph:
+CLOSED: [2022-09-29 Thu 20:45] DEADLINE: <2022-09-26 Mon>
+:PROPERTIES:
+:ARCHIVE_TIME: 2022-10-01 Sat 00:33
+:END:
+2021/prepare.md can be reused.
+
+Extra stuff to consider adding:
+- DONE Suggestions for themes (especially wrt colourscape)
+- DONE “Please don’t squeeze your talk by fast-forwarding your speech. Trimming silences and filler words can help, though. Sometimes it's easier to write, record, and edit your voiceover, and then record the video to go along with it."
+- DONE Allowing speakers to plant questions, esp. to cover tangential stuff that couldn’t fit in the prerec
+** CANCELLED Allocate extra time if possible; send e-mail :sachac:
+CLOSED: [2022-09-30 Fri 18:13] SCHEDULED: <2022-10-02 Sun>
+:PROPERTIES:
+:ARCHIVE_TIME: 2022-10-01 Sat 00:38
+:END:
+
+
+** DONE Review metadata for speakers in conf.org :zaeph:
+CLOSED: [2022-10-01 Sat 00:37] SCHEDULED: <2022-09-23 Fri>
+:PROPERTIES:
+:ARCHIVE_TIME: 2022-10-01 Sat 00:38
+:END:
+
+See the bottom of conf.org for some automated validation
+** DONE Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible [[#acceptance][early speaker notification]], Oct 7 for everything :organizers:
+CLOSED: [2022-09-29 Thu 20:29] DEADLINE: <2022-09-26 Mon>
+- zaeph: will start reviewing on Sep 21
+** DONE Write preparation instructions :zaeph:
+CLOSED: [2022-09-29 Thu 20:45] DEADLINE: <2022-09-26 Mon>
+2021/prepare.md can be reused.
+
+Extra stuff to consider adding:
+- DONE Suggestions for themes (especially wrt colourscape)
+- DONE “Please don’t squeeze your talk by fast-forwarding your speech. Trimming silences and filler words can help, though. Sometimes it's easier to write, record, and edit your voiceover, and then record the video to go along with it."
+- DONE Allowing speakers to plant questions, esp. to cover tangential stuff that couldn’t fit in the prerec
+** DONE Add more submissions (CFP deadline Sept 30) :sachac:
+CLOSED: [2022-09-30 Fri 18:13] DEADLINE: <2022-09-30 Fri>
+- Sacha: Add submissions to emacsconf-2022-private, draft 2-day schedule by Oct 10
+** DONE Publish talk pages :sachac:
+CLOSED: [2022-09-30 Fri 18:13]
+** DONE Send early acceptances :sachac:
+CLOSED: [2022-09-30 Fri 18:13] DEADLINE: <2022-09-30 Fri>
+
+Ideal sequence:
+1. publish /2022/prepare (zaeph)
+2. publish wiki pages
+3. send acceptance e-mails
+ - Allocate at most 20 minutes, say we'll try to add more time depending on the schedule (probably know by Sept 30 or Oct 1)
+ - Include review comments
+4. Send an additional e-mail introducing speakers who may want to coordinate
+
+** DONE Prepare to export talk information to wiki :sachac:
+DEADLINE: <2022-10-15 Sat>
+
+Tested code in a fork, can publish talk information once talks are approved.
+emacsconf-publish.el
+emacsconf-generate-info-pages
+emacsconf-generate-main-schedule
+emacsconf-generate-talk-pages
+
+** DONE Give access to emacsconf-2022-private to dto :zaeph:
+CLOSED: [2022-09-21 Wed 01:17]
+** DONE Write better subtitle documentation :sachac:
+CLOSED: [2022-09-22 Thu 15:12]
+https://wiki.debian.org/Teams/DebConf/Video/Subtitles
+https://emacsconf.org/captioning
+That will help more people subtitle things
+** DONE Write volunteer page :sachac:
+CLOSED: [2022-09-22 Thu 15:02]
+https://emacsconf.org/2022/volunteer
+
+** DONE Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible [[#acceptance][early speaker notification]], Oct 7 for everything :organizers:
+CLOSED: [2022-09-27 Tue 16:14] DEADLINE: <2022-09-26 Mon>
+- zaeph: will start reviewing on Sep 21
+** DONE Double-check sachac’s timezone conversions for availability :zaeph:
+CLOSED: [2022-09-27 Tue 16:14]
+
+zaeph helped with this, even catching some based on e-mail timestamps
+** DONE Copy things over from previous notebooks :sachac:
+CLOSED: [2022-09-21 Wed 14:12]
+** DONE Prepare to publish schedule :sachac:wiki:
+CLOSED: [2022-10-07 Fri 13:56]
+:PROPERTIES:
+:CUSTOM_ID: schedule-publish-old
+:END:
+
+- Should be understandable as plain text
+- Ideally responsive to take advantage of more screen space on monitors while still being understandable on mobile
+- Organize by tracks and then days
+- Links to jump to a track and day
+- Graphics to make it easier for people to see nearby talk options
+- Optionally, graphical view on talk pages as well (might need to publish a JSON somewhere to front)
+
+ Schedule inspiration:
+ - [[https://debconf22.debconf.org/schedule/][DebConf 2022]] converted times to your local timezone
+ - [[https://libreplanet.org/2022/program/][LibrePlanet 2022]] used table columns for the different tracks
+ - [[https://www.sfscon.it/programs/2022/][SFSCON 2022]] lists sessions chronologically, indicating tracks with labels and dots on a diagram. Dropdowns act as filters.
+ - https://css-tricks.com/building-a-conference-schedule-with-css-grid/
+
+
+ - With JS and grid CSS: https://imgur.com/KNpGayp
+ - Fallback https://imgur.com/HT9vX3o
+
+
+ Draft: https://emacsconf.org/2022/draft-schedule/
+*** DONE Set up main schedule as plain text
+CLOSED: [2022-10-06 Thu 21:25]
+
+general track
+day 1 and day 2
+
+dev track
+day 1 and day 2
+
+by day
+all talks
+
+
+*** DONE Set up talk page navigation
+CLOSED: [2022-10-06 Thu 21:25]
+- program phase: by track
+- schedule phase: chronological
+*** CANCELLED See if I can get the schedule to split into a nice grid on larger devices that support it
+CLOSED: [2022-10-07 Fri 13:55]
+Slightly annoying to do with JS/CSS because I want it to fall back to an interleaved schedule on small screens, so we would probably need to duplicate the elements and then use media queries.
+
+
+*** SOMEDAY [#C] Add caption icon to schedule :emacsconf:
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 22:21]
+:END:
+so that it's easier for people to see which talks are accessible
+
+*** DONE Add captioned label in talk index
+CLOSED: [2022-11-23 Wed 22:58]
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 21:46]
+:END:
+
+*** TODO [#C] Display breaks and lunch in the schedule
+:PROPERTIES:
+:CREATED: [2022-11-25 Fri 10:56]
+:END:
+
+** DONE Process confirmations as we receive them :sachac:zaeph:
+CLOSED: [2022-10-07 Fri 14:18]
+:PROPERTIES:
+:CUSTOM_ID: confirm-post-process
+:END:
+
+- Reply to the speaker and Cc -submit to confirm the confirmation. Something like "Confirming your confirmation, no reply needed to this one. Thank you!"
+- Update talk to WAITING_FOR_PREREC in conf.org
+- Add a note in the logbook (C-c C-z - org-add-note) for the talk entry
+- Add :PUBLIC_EMAIL: t if given permission to use the e-mail on the
+ talk page, or set it to an alternative e-mail if provided.
+- Update the public wiki's ${year}/talks/{$slug}.md page to add the
+ e-mail address as <mailto:person@example.com> on the speaker
+ information line.
+- At some point, use =M-x emacsconf-generate-talk-pages= to update the e-mail address used in the footer.
+
+#+begin_src emacs-lisp :results replace table :eval never-export
+(let (waiting)
+ (save-window-excursion
+ (with-current-buffer (find-file emacsconf-org-file)
+ (org-map-entries (lambda () (add-to-list 'waiting
+ (list (org-entry-get (point) "SLUG")
+ (org-entry-get (point) "ITEM")))) "TODO=\"TO_CONFIRM\"")))
+ waiting)
+#+end_src
+
+#+RESULTS:
+:results:
+:end:
+
+** CANCELLED Create Org heading for scheduling caption team's live IRC duty shifts :dto:
+CLOSED: [2022-10-07 Fri 14:24] DEADLINE: <2022-09-30 Fri>
+See [[#shifts]]
+
+** DONE Sacha: Organize volunteer information :sachac:
+** DONE Once talks are approved
+- sacha: Publish initial talk information pages
+- Double-check talk pages, format them nicely
+- Publish draft schedule
+- Confirm e-mail communication with all of the speakers
+
+Process for accepting a talk:
+
+- Create subtree for talk and populate it with properties.
+ - Required: CUSTOM_ID SLUG NAME NAME_SHORT EMAIL AVAILABILITY Q_AND_A TRACK MAX_TIME
+ - Optional: PRONOUNS PRONUNCIATION IRC PUBLIC_EMAIL MIN_TIME EMERGENCY
+ - Can be validated with ~emacsconf-validate-talk-subtree~
+ - Add a talk abstract subtree
+- Add it to emacsconf-schedule-plan and fiddle with it until the flow looks good
+- Execute the draft-schedule block to update the schedule in the Org file
+- Add the talk page to the wiki with ~emacsconf-add-talk-page~.
+- Stage, commit, and push the wiki files. Make sure to add the talk page and the info pages.
+- Doublecheck the wiki page on the web, since the e-mail refers to it.
+- E-mail the speaker the acceptance by using ~emacsconf-draft-acceptance-for-email-group~ from ~organizers-notebook/~.
+- Log the acceptance using ~C-c C-z~ in the talk subtree in ~conf.org~, noting the number of minutes.
+- Change the status to TO_CONFIRM.
+
+** DONE Remind people about confirming e-mail communications :sachac:email:speakers:
+CLOSED: [2022-10-08 Sat 18:55] SCHEDULED: <2022-10-08 Sat>
+:PROPERTIES:
+:CUSTOM_ID: confirm-email
+:END:
+
+Look for the TO_CONFIRM status in conf.org, probably include in schedule e-mail
+** DONE Send people schedule information and doublecheck their availability/Q&A preference :sachac:email:speakers:sched:
+CLOSED: [2022-10-09 Sun 09:38] SCHEDULED: <2022-10-08 Sat>
+:PROPERTIES:
+:CUSTOM_ID: check-sched
+:END:
+
+#+begin_src emacs-lisp
+(defun emacsconf-mail-schedule (group &optional template)
+ "Send draft schedule.
+GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (require 'emacsconf-ical)
+ (let ((reply-by-date (date-to-time "2022-10-14"))
+ (draft-schedule (concat emacsconf-base-url emacsconf-year "/draft-schedule/")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "check-sched"))
+ (car group)
+ (list
+ :titles
+ (mapconcat (lambda (o) (format "%s: %s"
+ (plist-get o :slug)
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ emacsconf-timezone)))
+ (cdr group) "; ")
+ :draft-schedule
+ draft-schedule
+ :speakers-short
+ (plist-get (cadr group) :speakers-short)
+ :plural
+ (if (= (length (cdr group)) 1) "" "s")
+ :email
+ (plist-get (cadr group) :email)
+ :year
+ (or (plist-get (cadr group) :year) emacsconf-year)
+ :coordination-note
+ (if (seq-find (lambda (o) (member (plist-get o :slug) '("journalism" "rolodex" "orgsuperlinks" "buttons" "hyperorg" "science")))
+ (cdr group))
+ "I've changed the order slightly from the coordination e-mail I sent you. The sequence is now journalism - science - rolodex - orgsuperlinks - buttons - hyperorg. science is now second instead of last, and the first two talks are on Sat while the last four are on Sun. That probably means you don't have to coordinate as much, but you can still do so if you would like to build on other people's talks."
+ "")
+ :schedule
+ (mapconcat
+ (lambda (o) (format "* TODO Check time for \"%s\" (%s) :emacsconf:\nDEADLINE: %s\n(Not a hard deadline, just encouragement to e-mail us before that date if you can)\nPlease e-mail [[mailto:emacsconf-submit@gnu.org]] if you need it changed\n%s track\n%s\nIn context: %s"
+ (plist-get o :title)
+ (plist-get o :slug)
+ (format-time-string (car org-time-stamp-formats) reply-by-date emacsconf-timezone)
+ (plist-get o :track)
+ (string-join
+ (let ((emacsconf-timezones
+ (if (plist-get o :timezone)
+ (seq-uniq (append (list emacsconf-timezone)
+ (split-string (plist-get o :timezone) " ")
+ (list "UTC")))
+ emacsconf-timezones)))
+ (emacsconf-timezone-strings o))
+ "\n")
+ draft-schedule))
+ (cdr group)
+ "\n----------------------------------------------------------------\n")
+ :reply-by
+ (format-time-string "%b %-e (%a)" reply-by-date emacsconf-timezone)
+ :timezone-note
+ (if (plist-get (cadr group) :timezone)
+ (format "I've included timezone conversion to %s. Let me know if you'd like me to use a different timezone in future e-mails."
+ (plist-get (cadr group) :timezone) " ")
+ "I can translate times into your local timezone. Let me know what timezone you'd like me to use.")
+ :availability-note
+ (cond
+ ((seq-find (lambda (o) (string-match "yes" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you've indicated that you're available during the conference."))
+ ((seq-find (lambda (o) (string-match "not indicated" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you didn't indicate any particular availability constraints in your submission."))
+ (t (format "I think it respects your indicated availability, which we've noted as %s."
+ (string-join
+ (seq-uniq
+ (mapcar
+ (lambda (o) (format "\"%s\"" (plist-get o :availability)))
+ (cdr group)))
+ " and "))))))))
+
+(defun emacsconf-mail-schedule-update (group &optional template)
+ "Send draft schedule update.
+GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (require 'emacsconf-ical)
+ (let ((reply-by-date (date-to-time "2022-10-14"))
+ (draft-schedule (concat emacsconf-base-url emacsconf-year "/draft-schedule/")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "check-sched"))
+ (car group)
+ (list
+ :titles
+ (mapconcat (lambda (o) (format "%s: %s"
+ (plist-get o :slug)
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ emacsconf-timezone)))
+ (cdr group) "; ")
+ :draft-schedule
+ draft-schedule
+ :speakers-short
+ (plist-get (cadr group) :speakers-short)
+ :plural
+ (if (= (length (cdr group)) 1) "" "s")
+ :email
+ (plist-get (cadr group) :email)
+ :year
+ (or (plist-get (cadr group) :year) emacsconf-year)
+ :coordination-note
+ (if (seq-find (lambda (o) (member (plist-get o :slug) '("journalism" "rolodex" "orgsuperlinks" "buttons" "hyperorg" "science")))
+ (cdr group))
+ "I've changed the order slightly from the coordination e-mail I sent you. The sequence is now journalism - science - rolodex - orgsuperlinks - buttons - hyperorg. science is now second instead of last, and the first two talks are on Sat while the last four are on Sun. That probably means you don't have to coordinate as much, but you can still do so if you would like to build on other people's talks."
+ "")
+ :schedule
+ (mapconcat
+ (lambda (o) (format "\"%s\" (%s)\n%s track\n%s\nIn context: %s"
+ (plist-get o :title)
+ (plist-get o :slug)
+ (plist-get o :track)
+ (replace-regexp-in-string
+ "^\\(.*\\)\n\\(.*\\)"
+ "\\1\nIn other timezones:\n\\2"
+ (string-join
+ (let ((emacsconf-timezones
+ (if (plist-get o :timezone)
+ (seq-uniq (append (list emacsconf-timezone)
+ (split-string (plist-get o :timezone) " ")
+ (list "UTC")))
+ emacsconf-timezones)))
+ (emacsconf-timezone-strings o))
+ "\n"))
+ draft-schedule))
+ (cdr group)
+ "\n----------------------------------------------------------------\n")
+ :reply-by
+ (format-time-string "%b %-e (%a)" reply-by-date emacsconf-timezone)
+ :timezone-note
+ (if (plist-get (cadr group) :timezone)
+ (format "I've included timezone conversion to %s. Let me know if you'd like me to use a different timezone in future e-mails."
+ (plist-get (cadr group) :timezone))
+ "I can translate times into your local timezone. Let me know what timezone you'd like me to use.")
+ :availability-note
+ (cond
+ ((seq-find (lambda (o) (string-match "yes" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you've indicated that you're available during the conference."))
+ ((seq-find (lambda (o) (string-match "not indicated" (or (plist-get o :availability) ""))) (cdr group))
+ (format "I think you didn't indicate any particular availability constraints in your submission."))
+ (t (format "I think it respects your indicated availability, which we've noted as %s."
+ (string-join
+ (seq-uniq
+ (mapcar
+ (lambda (o) (format "\"%s\"" (plist-get o :availability)))
+ (cdr group)))
+ " and "))))))))
+#+end_src
+
+*** Template
+:PROPERTIES:
+:EMAIL_ID: check-sched
+:SUBJECT: EmacsConf draft schedule: ${titles}
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:FUNCTION: emacsconf-mail-schedule
+:END:
+Hi, ${speakers-short}!
+
+Here's the tentative schedule for when your EmacsConf talk${plural}
+will be streamed. Your talk${plural} will be streamed once, but I've
+included a few timezone conversions for convenience.
+
+----------------------------------------------------------------
+${schedule}
+----------------------------------------------------------------
+
+${availability-note} You'll also have time for Q&A afterwards, which
+can be as short or as long as you like. We'll send you more
+information about how the Q&A will work as the conference gets closer.
+
+If you'd like to see the other talks for context, you can check out
+the draft schedule at https://emacsconf.org/${year}/draft-schedule/ .
+The times may move around a bit as we update the schedule, so I'll
+check in with you if things change a lot. ${coordination-note}
+
+We'd like to publish the schedule this month, so we'd love to hear
+from you by *${reply-by}* if the times don't work for you. (We can
+shuffle things around even after that date if something comes up.)
+Also, if you think your talk${plural} would go better next to a
+different talk, please let us know. ${timezone-note} Please keep
+emacsconf-submit@gnu.org in To or Cc when replying. Thanks!
+
+Sacha
+*** Schedule change affecting dev
+:PROPERTIES:
+:SUBJECT: EmacsConf draft schedule update 2 this time with the updated times: ${titles}
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:FUNCTION: emacsconf-mail-schedule-update
+:SLUGS: treesitter lspbridge asmblox wayland
+:EMAIL_ID: sched-change
+:END:
+
+(Please ignore the previous update, I included the wrong times in the
+e-mail. The web version's been fine, though! Sorry about the extra
+e-mails.)
+
+I tweaked the schedule to put treesitter and lspbridge earlier, so
+asmblox and wayland are a little later on Saturday morning. If you'd
+like to see the latest schedule for your talk, you can go to
+https://emacsconf.org/${year}/draft-schedule/ . Thanks for your
+patience!
+
+----------------------------------------------------------------
+${schedule}
+----------------------------------------------------------------
+
+(no need to reply to this to confirm, unless I broke the schedule for
+you and you want me to fix it)
+
+Sacha
+*** Schedule change for buddy/meetup
+:PROPERTIES:
+:SUBJECT: EmacsConf draft schedule update 3: ${titles}
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:FUNCTION: emacsconf-mail-schedule-update
+:SLUGS: buddy meetups
+:EMAIL_ID: sched-change-meetups
+:END:
+
+Hi ${speakers-short}!
+
+I tweaked the schedule to allocate a little more time for the meetups
+talk, and I moved the buddy talk earlier to make space. I think this
+might improve the flow as well, since the meetups will refer to how
+meeting up with a buddy is a good way to get a public Emacs meetup off
+the ground. If you'd like to see the latest schedule for your talk,
+you can go to https://emacsconf.org/${year}/talks/ . Thanks for your
+patience!
+
+----------------------------------------------------------------
+${schedule}
+----------------------------------------------------------------
+
+(no need to reply to this to confirm, unless I broke the schedule for
+you and you want me to fix it)
+
+Sacha
+
+** DONE Volunteer communications: E-mail update for Oct 9, 2022 :email:volunteers:
+CLOSED: [2022-10-09 Sun 21:16] SCHEDULED: <2022-10-09 Sun>
+:PROPERTIES:
+:CUSTOM_ID: volunteer-2022-10-09
+:END:
+
+Add your news and requests to this.
+
+*** Template so far
+:PROPERTIES:
+:SUBJECT: Getting things ready for EmacsConf 2022
+:TO: emacsconf-org@gnu.org
+:END:
+
+Hello, EmacsConf volunteers!
+
+We're starting to gear up for EmacsConf 2022, and we would love to
+figure out how to work with your skills, interests, and availability.
+<https://emacsconf.org/2022/volunteer/> has some specific task ideas and
+general roles.
+
+<https://emacsconf.org/2022/organizers-notebook/#overall> has an
+overall prioritization matrix. If any of those options look like
+something you want to learn or help with, or if you want to make
+things even better than what's in the table, let me know.
+
+Given the number of talks this year, we're going to try to see if we
+can pull off two tracks. I've posted a draft schedule at
+<https://emacsconf.org/2022/draft-schedule/> and have e-mailed speakers
+to confirm their availability. This schedule staggers live Q&A
+sessions so that the person managing the streams can jump back and
+forth as needed. We'll figure out shifts once we've sorted out the
+processes and training info, but if you want to call dibs on
+something, feel free.
+<https://emacsconf.org/2022/organizers-notebook/#shifts>
+
+Please let me know what kinds of things you'd like to learn more about
+or help out with!
+
+Sacha Chua
+
+(You're receiving this e-mail because you're on the emacsconf-org
+mailing list. Thanks for wanting to help out!)
+
+** DONE Delete all the EmacsConf BBB rooms from last year :chore:bbb:zaeph:
+CLOSED: [2022-10-11 Tue 19:32]
+:PROPERTIES:
+:CUSTOM_ID: bbb-cleanup
+:END:
+For the admins on BBB. The list is accessible here: [[https://bbb.emacsverse.org/b/admins/rooms][Organization Settings]].
+Should take no more than ~20′.
+** DONE Write volunteer update
+CLOSED: [2022-10-17 Mon 08:24] SCHEDULED: <2022-10-17 Mon>
+:PROPERTIES:
+:CUSTOM_ID: volunteer-2022-10-16
+:END:
+
+Hello, folks! Here's the weekly update on what's happening backstage
+for EmacsConf 2022 in case you notice something that you want to help
+out with. =)
+
+- All the speakers have confirmed that they've gotten the acceptance
+ e-mails. Many speakers have confirmed that the schedule works for
+ them after I reshuffled a few talks for better availability. I've
+ posted the schedule at https://emacsconf.org/2022/talks/ . We'll
+ announce the schedule on the emacsconf-discuss mailing, Reddit, and
+ various places this week.
+
+- zaeph has been working on the ffmpeg incantations for preprocessing
+ the videos that will be submitted soon. bandali is working on
+ getting the FTP and web-based uploads sorted out so that speakers
+ can submit their videos.
+
+- I created some watch pages to support viewing different tracks:
+ https://emacsconf.org/2022/watch/ . The livestreams won't work yet
+ and it would be nice to figure out something that can dynamically
+ display info for recent/current/upcoming talks, but it's a start.
+
+- We set up a self-hosted Etherpad (ex:
+ https://pad.emacsconf.org/2022-journalism) with an easy way to
+ redirect to using Wikimedia in case we run into scaling issues. I've
+ added it to our Ansible playbook
+ (git@git.emacsconf.org:pub/emacsconf-ansible) and I'm looking
+ forward to incorporating Ry P.'s improvements. Karl Voit gave
+ feedback on the first draft of the template.
+
+- vetrivln volunteered for some of the dev hosting shifts, Karl Voit
+ volunteered for some of the gen pad shifts, and FlowyCoder
+ volunteered for some of the gen check-in shifts. Thanks!
+
+Next week, we hope to:
+
+- Announce the EmacsConf 2022 schedule in the usual places (got any wording/JS/CSS suggestions?)
+- Finalize the upload instructions so that speakers can start submitting their files
+- Put together volunteer training materials
+- Set up per-speaker BBB rooms and friendly URLs
+
+Sacha
+
+** DONE Publish icals :sachac:
+CLOSED: [2022-10-19 Wed 18:46]
+:PROPERTIES:
+:CUSTOM_ID: ical
+:Effort: 1:00
+:END:
+
+It would be nice to have track-specific icals as well.
+
+*** DONE [#A] Check icals, create org schedule
+CLOSED: [2022-11-23 Wed 10:14] SCHEDULED: <2022-11-23 Wed>
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 07:29]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-23 Wed 09:37]--[2022-11-23 Wed 10:14] => 0:37
+:END:
+
+https://www.reddit.com/r/emacs/comments/yilmhv/emacsconf_2022_dec_3_4_schedule/ixgt1wr?utm_medium=android_app&utm_source=share&context=3
+
+** DONE [#A] Figure out web-based file upload :needsowner:sachac:ansible:
+CLOSED: [2022-10-19 Wed 09:20] SCHEDULED: <2022-10-18 Tue>
+:PROPERTIES:
+:CUSTOM_ID: upload
+:END:
+zaeph: I can work on it, but I’m not experienced in this domain, so I’d prefer to be a back-up.
+task is currently with bandali
+
+Lesson learned from last year: "Since people kept running into ftp
+problems, we might want to set up a web-frontend next year to minimise
+problems."
+
+Maybe we could ask some of the volunteers who wanted to help us with
+the infra? It shouldn’t be complicated to deploy a ready-made
+solution.
+
+"file drop" is a common keyword for looking for information.
+Considerations:
+- Probably run it on media.emacsconf.org
+- Bonus features:
+ - password-protected or hidden behind some kind of authentication or hidden behind some kind of URL, so we don't have to worry too much about spam
+ - extra points for sending speakers links to upload to specific folders so that we can separate resources by talk
+ - Resumable uploads would be good, since some speakers had a hard time with unreliable connections
+- What other conferences do:
+ - LibrePlanet uses plain FTP and recommends FileZilla https://libreplanet.org/wiki/Video_upload_instructions
+ - FOSSDEM uses Pentabarf to receive uploads https://archive.fosdem.org/2022/manuals/program/speaker/
+ - DebConf uses SReview(?)
+ - FOSSGIS uses Seafile https://vmx.cx/cgi-bin/blog/index.cgi/video-uploads-for-an-online-conference%3A2021-06-12%3Aen%2Cconference%2Cgeo
+- Some options:
+
+ | Project | Docker | Buster | Base | Notes |
+ | https://www.projectsend.org/ | | | php+mysql | |
+ | https://github.com/pomf/pomf | | | php+mysql | |
+ | https://github.com/psi-4ward/psitransfer | official | | node | can set upload password, resumable; data volume needs uid 1000 |
+ | https://github.com/epoupon/fileshelter | official | ppa | C++ | |
+ | https://github.com/mickael-kerjean/filestash | official | | | general FTP client |
+ | https://gitlab.com/moejo42/Jirafeau | official | | php | |
+ | https://github.com/YouTransfer/YouTransfer | official | | node | looking for maint |
+ | https://github.com/dutchcoders/transfer.sh/ | | | | |
+ | https://github.com/eikek/sharry | | | | |
+ - NextCloud
+
+ anon FTP upload currently goes to /srv/ftp/anon/ on media.emacsconf.org
+
+ [[file:/ssh:media|sudo::/etc/vsftpd.conf]]
+
+ Maybe I'll do psitransfer as a direct install
+
+*** DONE Create 2022/upload.md with the same workflow as last year for a start
+CLOSED: [2022-10-18 Tue 14:37]
+*** DONE Implement new workflow
+CLOSED: [2022-10-18 Tue 14:37]
+** DONE Update IRC instructions because of multiple tracks
+CLOSED: [2022-10-16 Sun 17:39]
+:PROPERTIES:
+:CUSTOM_ID: irc
+:END:
+
+Added to watch pages
+** DONE Move scheduling and publishing code to Emacs on a VPS so that other people can help out :sachac:
+:PROPERTIES:
+:CUSTOM_ID: publishing-sched
+:END:
+Ideal:
+- Update pages with watching information, additional resources, etc. as talks go live
+- Update the schedule as needed (cancelled or reordered talks, etc.)
+
+Where:
+- front? my own VPS?
+
+ Nice if there's an Ansible playbook
+
+ sachac's notes:
+ [[file:~/code/docker/emacsconf-publish/]]
+- probably good to set it up on front
+
+It's now on front.
+
+** DONE Prepare email for nudging speakers to send prerec, and inform on upload workflow :timesensitive:needsowner:
+CLOSED: [2022-10-22 Sat 08:42]
+:PROPERTIES:
+:CUSTOM_ID: mail-upload
+:END:
+
+*** Code
+
+#+begin_src emacs-lisp
+(defun emacsconf-mail-upload (group &optional template)
+ "Send upload instructions and reminder.
+GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (let ((action-date (date-to-time "2022-11-04")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "upload"))
+ (car group)
+ (list
+ :slugs (mapconcat (lambda (o) (plist-get o :slug)) (cdr group) " or ")
+ :speakers-short (plist-get (cadr group) :speakers-short)
+ :plural (if (= (length (cdr group)) 1) "" "s")
+ :email (plist-get (cadr group) :email)
+ :year (or (plist-get (cadr group) :year) emacsconf-year)
+ :prerec-note (emacsconf-surround
+ (make-string 64 ?-)
+ (string-join (seq-uniq (mapcar
+ (lambda (o)
+ (plist-get o :prerec-info))
+ (cdr group)))
+ "\n")
+ (make-string 64 ?-)
+ "")))))
+#+end_src
+
+*** Template
+:PROPERTIES:
+:EMAIL_ID: upload
+:FUNCTION: emacsconf-mail-upload
+:SUBJECT: EmacsConf upload instructions
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:END:
+
+Hi, ${speakers-short}!
+
+${prerec-note}Here are the instructions for uploading the
+video${plural} for your talk${plural}. You can find the latest version
+of the instructions at https://emacsconf.org/2022/upload/ . There are
+two ways to upload your talk${plural} this year, so you can pick the
+one that works best for you:
+
+- Web-based: https://ftp-upload.emacsconf.org , password emacsconf
+- FTP: host: ftp-upload.emacsconf.org, port: 21, username: anonymous
+ folder: upload-here
+
+If you upload slides and other resources, we can include them on the
+talk page when your talk goes live. If you happen to have a script or
+a transcript, please include them as well (it’ll speed up the
+captioning for us).
+
+Please add a comment or start your filenames with the ID for the talk
+that it's for: ${slugs}.
+
+If you're still working on your talk, you might find the tips at
+https://emacsconf.org/2022/prepare useful. In brief:
+
+- at least 1280x720 resolution
+- we recommend dark text on a light background, with enough contrast
+ to make it easy to read
+- if possible, use a headset or external microphone to record audio
+ in order to minimize computer noise
+- upload a separate 5 second recording of quiet or leave 5 seconds
+ of quiet at the end of your talk video so that we can process your
+ video for noise reduction
+
+Please plan to upload your talk by November 4 (next Friday) so that we
+can get started preparing it for streaming. If you can't make it by
+then, we can accept later submissions, although it's a bit more of a
+scramble and our stress levels go up as the conference approaches. =)
+We'd really appreciate the extra time for captioning and
+double-checking. Thank you for your help in getting ready for a smooth
+EmacsConf 2022!
+
+Sacha Chua
+** DONE Send backstage email
+CLOSED: [2022-10-22 Sat 09:23]
+
+#+begin_src emacs-lisp
+(defun emacsconf-mail-backstage-info (group &optional template)
+ (interactive (list (emacsconf-complete-talk-info)))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "backstage"))
+ (plist-get group :email)
+ (append group
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :conf-name emacsconf-name
+ :year emacsconf-year))))
+(defun emacsconf-mail-backstage-info-to-speakers-and-captioners ()
+ (interactive)
+ (let ((template (emacsconf-mail-merge-get-template "backstage"))
+ (speaker-groups
+ (seq-uniq
+ (mapcar
+ (lambda (talk)
+ (list
+ :name (plist-get talk :speakers-short)
+ :email (plist-get talk :email)
+ :role "speaker"
+ :backstage-use
+ "As we add more talks, you can skim through any relevant ones to
+see if there are any points you'd like to build on in your talk.
+Also, you can get a sense of what we do behind the scenes to try
+to get as many talks captioned for broadcast, and what you can do
+to make it easier. (A text file with names and technical terms
+can be helpful. No need to type out a manual transcript if you
+don't start from a script.) After you upload your talk and we
+process the files, you can use the backstage area to check the
+quality of the reencoded video."))
+ (seq-filter (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC"))
+ (emacsconf-filter-talks (emacsconf-get-talk-info))))))
+ (volunteer-groups
+ (with-current-buffer (find-file-noselect emacsconf-org-file)
+ (org-map-entries (lambda ()
+ (list :name (org-entry-get (point) "NAME_SHORT")
+ :email (org-entry-get (point) "EMAIL")
+ :role "captioning volunteer"
+ :backstage-use "If you see a talk that you'd like to caption, you can e-mail me at sacha@sachachua.com and I can reserve it for you."))
+ "captions"))))
+ (mapcar (lambda (g) (emacsconf-mail-backstage-info g template))
+ (append
+ speaker-groups
+ (seq-remove (lambda (v) (seq-find (lambda (s) (string= (plist-get s :email)
+ (plist-get v :email)))
+ speaker-groups))
+ volunteer-groups)))))
+
+#+end_src
+
+*** Template
+:PROPERTIES:
+:SUBJECT: EmacsConf backstage area with videos and other resources
+:EMAIL_ID: backstage
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:END:
+
+Hi ${name}!
+
+You're getting this e-mail because you are a ${role} for ${conf-name}
+${year}. (Thanks!)
+
+I'm so excited! =) A number of speakers have uploaded their videos,
+and OpenAI Whisper looks like a promising way to get automatically
+generated captions that we can use as a starting point.
+
+We've set up ${backstage} as the backstage area where you can view the
+videos and resources uploaded so far. You can access it with the
+username "${backstage-user}" and the password "${backstage-password}".
+Please keep the backstage password and other speakers' talk resources
+secret. ${backstage-use}
+
+Thank you!
+
+Sacha Chua
+
+** DONE Write playbooks
+CLOSED: [2022-10-22 Sat 09:25]
+*** DONE Host :zaeph:
+CLOSED: [2022-10-20 Thu 11:30]
+https://emacsconf.org/2022/volunteer/host
+
+*** CANCELLED Streamer :zaeph:
+CLOSED: [2022-10-22 Sat 09:24]
+:PROPERTIES:
+:CUSTOM_ID: inform-streamer-volunteers
+:END:
+Blocked by [[#streaming]]
+
+bandali and corwin/zaeph will do the streaming, so writing the streaming playbook is a little lower priority for now
+*** DONE Check-in
+CLOSED: [2022-10-16 Sun 21:26]
+[[https://emacsconf.org/2022/volunteer/checkin/]]
+*** DONE IRC
+CLOSED: [2022-10-16 Sun 21:38]
+https://emacsconf.org/2022/volunteer/irc/
+*** DONE Pad
+CLOSED: [2022-10-17 Mon 00:25]
+:PROPERTIES:
+:CUSTOM_ID: inform-pad-volunteers
+:END:
+https://emacsconf.org/2022/volunteer/pad/
+*** DONE Captions
+CLOSED: [2022-10-17 Mon 00:25]
+:PROPERTIES:
+:CUSTOM_ID: inform-pad-volunteers
+:END:
+https://emacsconf.org/2022/volunteer/caption/
+** CANCELLED [#C] Figure out why ikiwiki is slow :infra:wiki:
+CLOSED: [2022-10-22 Sat 09:26]
+:PROPERTIES:
+:CUSTOM_ID: ikiwiki-regex
+:END:
+complex regular expression issues?
+should the captions be outside the wiki?
+** CANCELLED Add nice-to-have stuff to prepare.md :zaeph:
+CLOSED: [2022-10-22 Sat 09:27]
+:PROPERTIES:
+:CUSTOM_ID: extra-prepare
+:END:
+- org-reveal config
+- SIL fonts choice
+
+** DONE Write volunteer update 2022-10-23 :update:
+CLOSED: [2022-10-23 Sun 10:22]
+:PROPERTIES:
+:CUSTOM_ID: volunteer-2022-10-23
+:TO: emacsconf-org@gnu.org
+:END:
+
+Hello, folks! Here's the weekly update on what's happening backstage
+for EmacsConf 2022 in case you notice something that you want to help
+out with. =)
+
+- We've e-mailed the speakers instructions for uploading their files through either a web browser or an FTP client, and three speakers have already done so! Those talks are now available in the backstage area (https://media.emacsconf.org/2022/backstage/), along with the first set of edited captions (thanks Jai Vetrivelan!). If you don't have the username and password for the backstage area and you would like to access it, please e-mail me and I'll send you the details.
+- We've created a BBB room for each speaker's live Q&A session. The URLs are in conf.org in the private repository if you need them.
+- We've drafted some documentation for different volunteer roles. If you'd like to volunteer as a captioner, check-in person (hmm, reception?), Etherpad scribe, IRC monitor, or host, please check out the appropriate link and let me know if I need to add anything to the docs:
+ - https://emacsconf.org/2022/volunteer/caption
+ - https://emacsconf.org/2022/volunteer/irc
+ - https://emacsconf.org/2022/volunteer/pad
+ - https://emacsconf.org/2022/volunteer/checkin
+ - https://emacsconf.org/2022/volunteer/host
+- Thanks to David O'Toole for signing up for some IRC shifts! If you would like to volunteer for a shift, check out https://emacsconf.org/2022/organizers-notebook/#shifts .
+- We've updated our streaming configuration for the General and Development tracks, and have started testing them using mpv and the watch pages. Videos aren't currently streaming, but you can check out the layout of the watch pages at:
+ - https://emacsconf.org/2022/watch/gen/
+ - https://live.emacsconf.org/2022/watch/gen/
+ - https://emacsconf.org/2022/watch/dev/
+ - https://live.emacsconf.org/2022/watch/dev/
+ These pages could probably be a lot prettier and easier to use. If you have some ideas for improving them or if you'd like to work on the HTML/CSS/JS, we'd love your help!
+- There are now Q&A waiting rooms with friendly URLs so that it's easier for people to join the live Q&A when the host decides it's okay to let everyone in. They're linked on the watch pages (along with the pads) and they'll be linked from the talk pages once we're ready to share them.
+- zaeph has been busy tweaking the ffmpeg workflow for reencoding and normalizing videos. Thanks to Ry P. for sharing the res.emacsconf.org server with us - we've been using it for all the processing that our laptops can't handle.
+- We experimented with using the OpenAI Whisper speech-to-text toolkit to create the auto-generated captions that captioning volunteers can edit. Looks promising! If you'd like to compare the performance between small, medium, and large models, you can look at the VTT files for the sqlite talk in the backstage area. I've also added support for tab-separated values (like Audacity label exports) and a subed-convert command to subed.el, which might give us a more concise format to work with. I'll work on getting word-level timing data so that our captioning workflow can be even easier.
+
+Next week, we hope to:
+
+- improve the prerec and captioning workflows
+- get more captions underway
+
+Lots of good stuff happening!
+
+Sacha Chua
+
+** DONE 2022-10-30 volunteer update
+CLOSED: [2022-10-30 Sun 19:46]
+:PROPERTIES:
+:CUSTOM_ID: volunteer-2022-10-30
+:END:
+
+Hello, everyone! Here's the weekly update on what's happening backstage
+for EmacsConf 2022 in case you notice something that you want to help
+out with. =)
+
+- Help wanted - Captioning: There are three talks open for captioning
+ in <https://media.emacsconf.org/2022/backstage/> , so feel free to
+ e-mail me if you'd like to reserve one. I've tweaked the captioning
+ process a little bit so that I can reflow the transcripts into
+ shorter subtitles before people edit the captions, so editing is
+ easier to do because you don't have to split along the way. (If
+ you're curious about the technical stuff, I switched to manually
+ splitting the text using emacsconf-reflow from emacsconf-el and then
+ the using aeneas for forced alignment, because I couldn't figure out
+ how to get torchaudio unstuck sometimes.)
+
+ If you don't have the username and password for the backstage area
+ and you would like to access it, please e-mail me and I'll send you
+ the details.
+
+- Help wanted - tech checks: For sessions with live Q&A, we'd like to
+ set up tech-checks with speakers to make sure that their setup works
+ well with BigBlueButton. A rough outline of the process is in the
+ tech-checking protocol heading at
+ <https://emacsconf.org/2022/organizers-notebook/#tech-checks> . If you
+ would like to help with tech-checks, please e-mail us with your
+ general availability (including timezones) and preferred public
+ contact information so that we can include you on the list at
+ <https://emacsconf.org/2022/prepare/#tech-check> and in the e-mail to
+ speakers.
+
+- Help wanted - intro/intermission slides, OBS overlay, ??: It might
+ be interesting to design something to show right before and right
+ after a talk so that people can see the title, speaker name, talk
+ page URL, Q&A info, pad URL, pronouns, etc. Ideally we'd be able to
+ generate a whole bunch of these from the talk data, so maybe SVG or
+ a TikZ picture? If this is your jam, let us know.
+
+- OBS in the cloud: We've been able to figure out how to stream both
+ streams using OBS, VNC, and PulseAudio on Ry P.'s virtual server, so
+ it's even more likely that we're going to pull off two tracks this
+ year. Yay!
+
+- Tom Purl has joined as a captioning volunteer. Hi Tom!
+
+This week we hope to get lots of talks submitted, processed, and on
+the way to being captioned. We're also planning to make the captioning
+workflow even better, and to improve the OBS streaming workflow. Whee!
+
+Sacha <sacha@sachachua.com>
+
+** Volunteer update 2022-11-07
+:PROPERTIES:
+:CUSTOM_ID: volunteer-2022-11-07
+:END:
+
+Hi everyone!
+
+Here's what's been happening backstage.
+
+- Speakers have been submitting their videos, hooray! I added a
+ schedule to the backstage page at
+ <https://media.emacsconf.org/2022/backstage/> so that people can see
+ how the schedule's coming along. We expect more talks to come in the
+ next two weeks. Not panicking yet. =)
+
+- Thanks to all the people who've been working on captions so far!
+ Bhavin, Andrea, and Ramin did the captions for their talks, and Jai
+ captioned Bala's talk. Tom, Bhavin, and Hannah are currently working
+ on captions. There are three more talks backstage if anyone wants to
+ work on them.
+
+- I just posted some notes on how I reflow and edit subtitles in case
+ they're helpful:
+ <https://media.emacsconf.org/2022/backstage/editing-captions.html>
+ It's also linked from the backstage page under More info: editing
+ captions.
+
+- We added the Emacs development updates talk from John Wiegley and
+ updated the times of other talks based on messages from the
+ speakers.
+
+- We did a dry run of the OBS streaming setup with Leo, Amin, and
+ Corwin. I think we're on track to being able to broadcast two
+ streams this year.
+
+- IRC announcements, BBB redirection, and media file publishing can
+ now all automatically happen when the talk status changes,
+ simplifying our work during the conference. Video playback and Q&A
+ browser windows can happen automatically if streaming from
+ res.emacsconf.org. I want to get the publishing workflow all
+ smoothed out too, so that talks and transcripts can be more easily
+ published to the wiki pages during the conference.
+
+Plans for this week:
+
+- More videos and captions!
+- I plan to work on talk page publishing so that it happens smoothly during the conference
+- Leo's going to review the videos submitted so far and prepare intros for them
+- Might be a good idea to reach out to speakers for tech checks and bios
+
+EmacsConf is a little less than four weeks away. Stuff is happening!
+
+Sacha
+
+** DONE Send prerec reminder :sachac:
+CLOSED: [2022-11-11 Fri 19:27] SCHEDULED: <2022-11-11 Fri>
+:PROPERTIES:
+:CUSTOM_ID: prerec-reminder
+:END:
+*** DONE Update logbook with notes from e-mails :sachac:
+CLOSED: [2022-11-11 Fri 19:27]
+*** DONE Follow up with speakers based on their availability
+CLOSED: [2022-11-11 Fri 19:27]
+*** CANCELLED Email speakers because I'll be shutting down the web upload
+CLOSED: [2022-12-02 Fri 19:30] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-11-30 Wed 22:24]
+:END:
+
+** DONE Send schedule-published email for emacsconf-discuss :needsowner:timesensitive:email:
+CLOSED: [2022-11-01 Tue 08:50] SCHEDULED: <2022-10-31 Mon> DEADLINE: <2022-10-31 Mon>
+:PROPERTIES:
+:CUSTOM_ID: announce-program
+:END:
+
+Schedule is now available; post to emacsconf-discuss, emacs-tangents
+https://lists.gnu.org/archive/html/emacsconf-discuss/2022-10/msg00000.html
+
+*** DONE Post it to r/emacs as well :reddit:zaeph:
+CLOSED: [2022-11-01 Tue 08:50]
+Please let zaeph know when it’s live so that the post can be distinguished.
+
+*** Template
+:PROPERTIES:
+:SUBJECT: [ANN] EmacsConf 2022 schedule
+:TO: emacsconf-discuss@gnu.org, emacs-tangents@gnu.org
+:END:
+
+Greetings, fellow Emacsians!
+
+On behalf of the EmacsConf 2022 organizers team, I'm very excited to
+announce the schedule for EmacsConf 2022 (Dec 3 and 4), available at:
+
+ https://emacsconf.org/2022/talks
+
+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 that the times are
+approximations, and that the schedule may change leading up to the
+conference.
+
+As the conference approaches, we'll post more details on how to watch
+and participate.
+
+You can subscribe to the emacsconf-discuss mailing list at
+https://lists.gnu.org/mailman/listinfo/emacsconf-discuss to
+be sure you'll get updates.
+
+Want to help make EmacsConf even awesomer? Volunteer!
+https://emacsconf.org/2022/volunteer/
+
+We hope to see you all around on Dec 3-4 for EmacsConf 2022!
+
+P.S. please direct all 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; thank you.
+** DONE Flesh out prepare.md for audio-recording tips before the prerec-deadline :zaeph:
+CLOSED: [2022-11-06 Sun 15:26]
+:PROPERTIES:
+:CUSTOM_ID: prepare-audio
+:END:
+** DONE Write speaker e-mail for people who have already submitted their talks
+CLOSED: [2022-11-14 Mon 20:42]
+:PROPERTIES:
+:CUSTOM_ID: speaker-after-video
+:END:
+
+To: speakers who have already submitted their talks (so that we don't distract people who are still working on their talks)
+
+#+begin_src emacs-lisp
+(defun emacsconf-mail-speaker-after-video (group &optional template)
+ (interactive (list (emacsconf-mail-complete-email-group
+ (seq-filter (lambda (o) (plist-get o :intro-note))
+ (emacsconf-active-talks (emacsconf-get-talk-info))))))
+ (setq template (or template (emacsconf-mail-merge-get-template "speaker-after-video")))
+ (let ((talks (cdr group)))
+ (emacsconf-mail-prepare
+ template
+ (car group)
+ (list :speakers-short (plist-get (cadr group) :speakers-short)
+ :plural (if (= (length (cdr group)) 1) "" "s")
+ :email (plist-get (cadr group) :email)
+ :in-between (mapconcat (lambda (talk)
+ (emacsconf-surround "<https://media.emacsconf.org/2022/in-between/" (plist-get talk :slug) ".png>" ""))
+ (cdr group)
+ ", ")
+ :intro
+ (mapconcat (lambda (talk)
+ (string-join (org-wrap (emacsconf-surround "- " (plist-get talk :intro-note) "\n" "") 70) "\n"))
+ (cdr group)
+ "")
+ :chapters
+ (mapconcat (lambda (talk)
+ (format "<https://media.emacsconf.org/2022/backstage/#%s>:\n%s"
+ (plist-get talk :slug)
+ (mapconcat
+ (lambda (chapter)
+ (concat (format-seconds "%.2h:%z%.2m:%.2s"
+ (floor (/ (elt chapter 1) 1000)))
+ " "
+ (elt chapter 3) "\n"))
+ (subed-parse-file
+ (expand-file-name (concat (plist-get talk :video-slug) "--main--chapters.vtt") emacsconf-cache-dir)))))
+ (cdr group)
+ "\n\n")
+ :caption-note
+ (if (seq-find (lambda (o) (not (string= (plist-get o :status) "TO_STREAM"))) (cdr group))
+ " The captions haven't been fully edited yet, so please ignore any errors in the captions themselves."
+ "")
+ :urls
+ (mapconcat (lambda (o) (concat "<" emacsconf-base-url (plist-get o :url) ">"))
+ (cdr group) " , ")
+ :tech-check-note
+ (if (string-match "live" (or (mapconcat (lambda (o) (or (plist-get o :q-and-a) "")) (cdr group) " ") ""))
+ (format
+ "*Tech check*
+
+Since you're planning to do a live Q&A session, you may want to
+connect to the test BBB room at <%s> to make sure you can share
+your audio, your window or screen, and your webcam (optional). Sharing
+system audio or multi-monitor setups can sometimes be tricky, so
+please let us know if you need help figuring things out. You can
+double-check by connecting with a separate device, or you can arrange
+to meet with one of the tech-check volunteers
+(<https://emacsconf.org/2022/prepare/#tech-check>).${wrap}
+
+" emacsconf-test-bbb-room) "")))
+ (add-hook 'message-sent-hook
+ `(lambda ()
+ (mapc (lambda (o)
+ (emacsconf-add-to-talk-logbook o "Sent speaker-after-video email"))
+ (list
+ ,@(mapcar (lambda (talk) (plist-get talk :slug)) talks))))
+ nil t)))
+
+(defun emacsconf-mail-speakers-after-videos ()
+ (interactive)
+ (let* ((info (seq-filter (lambda (o) (plist-get o :intro-note))
+ (emacsconf-active-talks (emacsconf-get-talk-info))))
+ (grouped (seq-group-by (lambda (o) (plist-get o :email)) info))
+ (template (emacsconf-mail-merge-get-template "speaker-after-video")))
+ (mapc (lambda (group)
+ (emacsconf-mail-speaker-after-video group template))
+ grouped)))
+
+
+#+end_src
+*** Template
+:PROPERTIES:
+:EMAIL_ID: speaker-after-video
+:FUNCTION: emacsconf-mail-speaker-after-video
+:SUBJECT: EmacsConf: miscellaneous todos now that you've sent in your video${plural}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}, sacha@sachachua.com
+:CC: emacsconf-submit@gnu.org
+:END:
+
+Hi, ${speakers-short}!
+
+Thank you for uploading your video early! Let's get a few more things
+sorted out for a smooth EmacsConf 2022.
+
+${tech-check-note}*Intro*
+
+I've written a brief (and possibly inaccurate! =) ) intro that the
+host can read out before your talk while the in-between slide
+(${in-between}) is being displayed:
+
+${intro}
+
+Would you like to tweak it to better reflect your talk?
+
+*Chapter markers*
+
+I've added chapter markers to your video in the backstage area to help
+with navigation. You can click on them in the backstage area if you
+want to easily jump around, or review the list that I've included for
+your convenience:
+
+${chapters}
+If you prefer other headings or timestamps, please let me know!${caption-note}
+
+*Bio, community support links*
+
+People often want to learn more about speakers and show their
+appreciation. If you'd like to include an author bio and any
+social/support links to your talk page${plural} (${urls}), please
+e-mail us the text that you'd like to include. You can also follow the
+instructions at <https://emacsconf.org/edit/> to edit your talk
+page${plural} directly yourself, if you want to.${wrap}
+
+Thanks again for all your contributions!
+
+Sacha
+
+** DONE Prepare for prerecs :zaeph:
+CLOSED: [2022-10-29 Sat 09:58] DEADLINE: <2022-11-04 Fri>
+:PROPERTIES:
+:CUSTOM_ID: prepare-prerec-process
+:END:
+*** DONE Optimize ffmpeg incantation
+CLOSED: [2022-10-29 Sat 09:58]
+Remember to update [[file:../prepare.md::Compression]] with the new incantation.
+
+**** Incantation from last year
+#+begin_src sh :eval no
+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
+
+#+RESULTS:
+:results:
+:end:
+
+**** New candidate
+Changelog:
+- Disable adaptive quantization by setting aq-mode to 0 (TODO: compare samples)
+- Add ~-row-mt 1~ needed to support ~tile-rows~ (2×2 is enough for 720p)
+- Also use tiles for first pass
+- Remove ~-frame-parallel 0~ because it’s disabled by default (see [[https://github.com/Kagami/webm.py/wiki/Notes-on-encoding-settings][Notes on encoding settings · Kagami/webm.py Wiki]])
+- Put number of CPU in variable and use it for ~cpu-used~ and ~threads~
+- Stick to default for ~auto-alt-ref~
+- Stick to default for ~lag-in-frames~
+#+begin_src sh :eval no
+Q=32
+CPU=8
+ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -an -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $CPU -g 240 -pass 1 -f webm -threads $CPU /dev/null &&
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a copy -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $CPU -pass 2 -g 240 -threads $CPU "$2"
+#+end_src
+
+Other considerations:
+- We might want to tweak the time before keyframes (~-g~).
+**** FFMpeg
+https://img.ly/blog/ultimate-guide-to-ffmpeg/
+*** DONE Figure out workflow for handling submitted prerecs
+CLOSED: [2022-10-29 Sat 09:54]
+We need time after the prerecs get submitted to:
+- convert the videos and check that they've been reencoded properly by watching the re-encoded ones all the way to the end
+- caption videos
+- capture any extra info
+- follow up with missing prerecs
+
+Make changes in [[#prerec-process]]
+
+** DONE Make something to display between talks :akshay196:
+CLOSED: [2022-11-07 Mon 14:46]
+:PROPERTIES:
+:CREATED: [2022-10-03 Mon 07:50]
+:CUSTOM_ID: intro
+:END:
+
+Goals:
+- Reassure people that they're in the right stream for the talk that they're looking for
+- Direct them to the pad and Q&A for the talk
+
+What to show in between talks:
+- Previous talk: title, speaker, pronouns, talk page, Q&A information (if still live)
+- Next talk: title, speaker, pronouns, talk page, Q&A information, countdown
+
+https://media.emacsconf.org/2022/backstage/gen-in-between.pdf
+https://media.emacsconf.org/2022/backstage/dev-in-between.pdf
+
+- Good: Static image, maybe created with LaTeX
+- Better: Video with unobtrusive sound so people can doublecheck that their audio works
+- Best: Emacs thing so that we can have a dynamic timer and last-minute announcements, and so that it's Emacs =)
+- Even better than that: A compact view that can be overlaid on the Q&A session using OBS
+
+See break commercials
+https://www.collabmagazine.com/organizing-a-multi-track-virtual-conference-with-microsoft-teams-live-events-a-technical-playbook-and-lessons-learned/
+
+OBS scenes (maybe?):
+
+- splash-screen when we’re on break
+- scene when broadcasting a talk (where we might want a logo and a bar or surrounding to broadcast messages like time left in
+ recording); and
+- Q&A scene with host-webcam, optional speaker-webcam, and pad with questions.
+- Q&A scene focusing on shared screen from speaker
+- Q&A scene with IRC and pad
+
+Nothing is urgent, blocking it, or being blocked by it, so you can
+play around with ideas.
+
+We're experimenting with two tracks this year, so we expect that some
+people will join midway through a talk or Q&A session and
+would like to reorient themselves. Some Q&A sessions may end
+early, so we would like to reassure people that they're in
+the right spot for the next talk. Most Q&As will be done
+live, but some Q&As will be done over IRC, so we need to
+point people to the right place.
+
+and if there's room for a little extra info like public e-mail
+addresses or pronouns, that can help people when they discuss
+things. That info will be in the pad and IRC, though, so it's
+also okay to omit it
+
+
+
+We can programmatically replace strings in
+SVG from Emacs, so we can easily use that as an overlay.
+
+
+<zaeph> …Or, if you just want to focus on the look of
+things, we can think of the content on our own.
+
+<sachac> oh yeah, totally, you can just focus on the design and use
+placeholder text
+
+Overlay considerations:
+- talk videos will likely have subtitles; no subtitles for Q&A
+- zaeph doesn't like vertical text
+*** DONE Generate talk banners :sachac:
+CLOSED: [2022-11-07 Mon 14:46]
+https://gitlab.com/akshay196/emacsconf-artwork/-/blob/main/2022/talk-banner/sample.svg
+https://gitlab.com/akshay196/emacsconf-artwork/-/blob/main/2022/overlays/src/
+
+*** TODO [#C] Make a list of different things to plug during commercial breaks, like Mastodon :sachac:
+ :PROPERTIES:
+ :CREATED: [2022-11-17 Thu 14:25]
+ :END:
+
+*** CANCELLED Create a version of in-between that we can use for Q&A, since it's no longer "Coming Next"
+CLOSED: [2022-11-24 Thu 13:15] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 12:29]
+:END:
+
+** DONE Find volunteers for tech-checks :zaeph:
+CLOSED: [2022-11-19 Sat 11:08]
+:PROPERTIES:
+:CUSTOM_ID: tech-checks
+:END:
+*** DONE Add entry in 2022/volunteer.md
+*** DONE Write protocol for adding tech-checker volunteer
+CLOSED: [2022-11-19 Sat 11:08]
+- Invite volunteer to BBB (ask core organizers)
+- Update [[file:prepare.md::Tech-check]] with new tech-checker info
+- Coach tech-checker on the protocol
+*** DONE Write the tech-checking protocol (formerly referred to as “tech-checklist”)
+CLOSED: [2022-11-19 Sat 11:08]
+From previous years:
+#+begin_quote
+- Can you speak and be heard? Is there echo?
+- Can you hear the organizer?
+- 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
+** DONE Move conf.org management to orga@res.emacsconf.org :sachac:
+CLOSED: [2022-11-06 Sun 15:27]
+:PROPERTIES:
+:CUSTOM_ID: conforg
+:END:
+so that more people can work with it during the conference
+See the publish role in the ansible playbook
+
+** DONE Ask speakers for bios or support nudges to include on their talk pages :wiki:
+CLOSED: [2022-11-19 Sat 11:09]
+:PROPERTIES:
+:CUSTOM_ID: speaker-bio
+:END:
+maybe after we get the prerecs
+ex: liberapay, patreon, anyone looking for a job, etc.
+** DONE Set up BBB rooms and update conf.org :sachac:
+CLOSED: [2022-11-19 Sat 11:12]
+:PROPERTIES:
+:CUSTOM_ID: create-bbb
+:END:
+
+1. Log on to bbb.emacsverse.org as an admin.
+2. Create a room. Enable *Mute users when they join*.
+
+ The code below doesn't quite work, but might be a good starting point for future automation.
+
+ #+begin_src emacs-lisp :eval no
+(setq list (seq-drop (emacsconf-bbb-room-title-list) 3)) ; skip some if needed
+(progn
+ (setq name (pop list))
+ (kill-new (format "name=\"%s\";$('#create-room-block').click();$('#create-room-name').val(name);$('#room_mute_on_join').click();$('.create-room-button').click();\n"
+ name))
+ (sleep-for 1)
+ (shell-command "xdotool key alt+Tab sleep 3 key ctrl+v sleep 1 key Return"))
+#+end_src
+
+console.log(JSON.stringify([...document.querySelectorAll('.delete-room')].map((o) => { return { name: o.getAttribute('data-name'), path: o.getAttribute('data-path') }}).filter((o) => o.name.match(/^ec22/))))
+
+see conf.org for the rest of the process
+*** DONE Add volunteers to the BBB rooms
+CLOSED: [2022-11-08 Tue 09:48] DEADLINE: <2022-11-18 Fri>
+
+- vetrivln: sat-am-dev, sun-am-dev
+- FlowyCoder: sat-pm-gen, sun-pm-gen
+- jman: sun-pm-gen
+
+*** DONE Doublecheck mute on join
+CLOSED: [2022-11-21 Mon 12:05]
+:PROPERTIES:
+:CREATED: [2022-11-21 Mon 11:31]
+:Effort: 0:15
+:QUANTIFIED: Emacs
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-21 Mon 11:49]--[2022-11-21 Mon 12:05] => 0:16
+:END:
+[[file:~/proj/emacsconf/wiki/2022/organizers-notebook/index.org::*Shifts][Shifts]]
+
+#+begin_src js2 :eval no
+list = [...document.querySelectorAll('.room-name-editable')].filter((o) => o.value.match(/^ec22-(sat|sun)/));
+list.reduce(async(prev, elem) => {
+ await prev;
+ if (!sessionStorage.getItem(elem.value)) {
+ return new Promise(async (resolve, reject) => {
+ card = elem.closest('.card-body');
+ card.querySelector('.item-action.dropdown a').click();
+ await new Promise(r => setTimeout(r, 1000));
+ card.querySelector('.update-room').click();
+ await new Promise(r => setTimeout(r, 1000));
+ if (!document.querySelector('#room_mute_on_join').checked) {
+ document.querySelector('#room_mute_on_join').click();
+ sessionStorage.setItem(elem.value, true);
+ await new Promise(r => setTimeout(r, 1000));
+ document.querySelector('.update-only.create-room-button').click();
+ } else {
+ sessionStorage.setItem(elem.value, true);
+ document.querySelector('#createRoomModal').click();
+ }
+ resolve(true);
+ });
+ }
+});
+
+#+end_src
+** DONE Coordinate and help volunteers :sachac:
+CLOSED: [2022-11-19 Sat 11:14]
+:PROPERTIES:
+:CUSTOM_ID: coordinate-volunteers
+:END:
+
+- [[../volunteer]]
+- Figure out what information volunteers need in order to feel
+ comfortable signing up for tasks. ex:
+ https://wiki.debian.org/DebConf/21/VideoVolunteering
+- Encourage people to sign up for [[#shifts]]
+
+*** DONE Plan training session(s), Q&A availability, recordings
+CLOSED: [2022-11-19 Sat 11:14]
+*** CANCELLED Hold Q&A session with volunteers
+CLOSED: [2022-11-19 Sat 11:14]
+:PROPERTIES:
+:CUSTOM_ID: schedule-volunteer-qna
+:END:
+*** TODO Respond to new volunteers
+SCHEDULED: <2022-12-05 Mon>
+*** SOMEDAY Subscribe volunteers to mailing list
+SCHEDULED: <2022-12-08 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-05 Mon 17:49]
+:END:
+
+** DONE Investigate streaming options, maybe OBS in the cloud :sachac:
+CLOSED: [2022-11-06 Sun 18:16] DEADLINE: <2022-11-20 Sun>
+:PROPERTIES:
+:CUSTOM_ID: streaming
+:END:
+
+Current status:
+
+- res.emacsconf.org seems to be able to handle 2x (OBS + TigerVNC + MPV, should test with Firefox as well)
+- corwin and jman will stream gen from OBS on res
+- bandali will stream dev from his laptop
+- let sachac know if you want manual control or more autopilot for the gen stream
+
+Goals:
+
+- [X] Be able to start a VNC server with OBS, MPV, and Firefox, connect to it, and stream
+- [X] Have another session with the sound isolated
+- [-] Split the audio so that we can join the Q&A room before the MPV ends - handled by automatic scene switcher detecting mpv, but we can't share just a window, so we might as well just wait
+- [X] Control MPV from the commandline: track-mpv appears in the correct display, and it can also be controlled via the socket like this: echo '{ "command": ["loadfile", "test2.webm"] }' | socat - ~/mpv-socket-emacsconf-dev
+- [ ] Share the window instead of the desktop?
+
+Prerequisites:
+
+- You need to be able to SSH out to res.emacsconf.org on port 46668
+ and forward ports, so one of the main organizers needs to add your
+ SSH public key to the authorized_keys file. Please e-mail your SSH
+ public key to sacha@sachachua.com and test that port 46668 is not
+ blocked.
+- For streaming from OBS in VNC, you will need a VNC viewer like
+ tigervnc-viewer.
+- For streaming from your local computer, you will need OBS and FFmpeg.
+
+During the conference, you will:
+
+- play the talk video (unless it's automatically managed by the agenda) and update the overlays
+- display intro/intermission information as needed
+- open the Q&A windows, like the pad and the BBB room/IRC (unless it's automatically managed by the agenda)
+- adjust the volume if needed
+- arrange windows and focus the BBB room on the speaker's webcam if needed
+- if you like, you can be responsible for managing the track from conf.org on orga@res.emacsconf.org
+
+Dry run checklist:
+
+- [ ] Connect to the server
+ ssh orga@res.emacsconf.org -p 46668
+ emacsconf # runs emacsclient -c -a emacs
+- [ ] Forward ports and connect via VNC
+- [ ] Find the OBS or start it if it is not running
+- [ ] Start recording
+- [ ] Play a video
+- [ ] Open two Firefox windows and arrange them
+- [ ] Manage windows on the workspace
+- [ ] Adjust the volume in OBS
+- [ ] SSH to the server and play a video off-screen
+- [ ] SSH to the server with X forwarding and adjust the volume off-screen
+
+*** Broadcasting from local OBS (option A)
+ - You can copy the profile from your track or look inside it for the icecast mount point details:
+
+ - Gen: rsync -avze 'ssh -p 46668' emacsconf-gen@res.emacsconf.org:~/.config/obs-studio/basic/profiles/ ~/.config/obs-studio/basic/profiles/
+ - Dev: rsync -avze 'ssh -p 46668' emacsconf-dev@res.emacsconf.org:~/.config/obs-studio/basic/profiles/ ~/.config/obs-studio/basic/profiles/
+
+ - Sacha will turn off the OBS recordings on res so that you can test streaming from your computer
+ - If you're doing this independently, you can jump ahead to "Connecting to VNC" in order to stop the recording yourself
+
+ - Verify with MPV:
+ #+begin_example
+ mpv https://live0.emacsconf.org/gen.webm
+ mpv https://live0.emacsconf.org/dev.webm
+ #+end_example
+
+ - With luck, the 480p streams will be up automatically as well
+ #+begin_example
+ mpv https://live0.emacsconf.org/gen-480p.webm
+ mpv https://live0.emacsconf.org/dev-480p.webm
+ #+end_example
+
+*** Connecting to VNC (option B)
+
+ 1. Stop broadcasting locally if you were testing local OBS.
+
+ 2. Install a VNC viewer on your system (ex: tigervnc-viewer).
+
+ 3. Set up your local environment:
+
+ - gen: export TRACK=gen; export TRACK_PORT=5905; export SSH_PORT=46668
+ - dev: export TRACK=dev; export TRACK_PORT=5906; export SSH_PORT=46668
+
+ 4. Copy the password:
+
+ scp emacsconf-$TRACK@res.emacsconf.org:~/.vnc/passwd vnc-passwd-$TRACK -p $SSH_PORT
+
+ 5. Forward your local ports and connect via VNC viewer to the
+ appropriate forwarded port from your laptop:
+
+ #+begin_example
+ ssh emacsconf-$TRACK@res.emacsconf.org -N -L $TRACK_PORT:127.0.0.1:$TRACK_PORT -p $SSH_PORT &
+ sleep 5 # Give it time to establish the tunnels
+ xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK &
+ #+end_example
+
+ (If this doesn't find a VNC server to connect to, you can start it with ~ssh emacsconf-$TRACK@res.emacsconf.org -p $SSH_PORT /home/emacsconf-$TRACK/bin/track-vnc~)
+
+ 6. Start *recording* (not streaming). If you don't see OBS when you connect, it's probably on workspace 2, so you can switch with Alt-2. If you still don't see it there, you can open a terminal with Alt-Enter and then run ~track-obs~. After you start recording, confirm that it is now broadcasting to the stream.
+
+ 7. Verify with MPV on your local system:
+ #+begin_example
+ mpv https://live0.emacsconf.org/$TRACK.webm &
+ #+end_example
+
+ 8. With luck, the 480p streams will be up automatically as well. On your local system:
+ #+begin_example
+ mpv https://live0.emacsconf.org/$TRACK-480p.webm &
+ #+end_example
+
+ 9. Play a video. It should display the video and update the overlays. If you need to update the overlays manually, you can copy files from ~/data/emacsconf/overlays~ onto ~$HOME/other.png~ and ~$HOME/video.png~.
+
+ You can play a video with ~play video-id~ (ex: ~play meetups~), or you can specify the filename (ex: ~play ~/stream/emacsconf-2022-meetups*.webm).
+
+ termit: Ctrl-Shift-t makes a new tab
+
+ i3 cheat sheet:
+ - Alt-Enter creates a terminal
+ - Alt-d runs a command
+ - Alt-e toggles horizontal/vertical split
+ - Alt-f toggles full-screen
+ - Alt-w switches to tabbed view
+ - Alt-1 switches to workspace 1, Alt-2 switches to workspace 2
+ - Alt-Shift-2 moves things to workspace 2
+ - Alt-Shift-Left moves the current window to the left
+ - Alt-Shift-Right moves the current window to the right
+
+ 10. Test Q&A. You can either wait for the video to finish or quit it with "q".
+ You can paste in the URLs or use
+ ~firefox /data/emacsconf/2022/index-$TRACK.html~
+
+ 11. Test adjusting the audio
+
+ - ~ssh emacsconf-$TRACK@res.emacsconf.org -p 46668~
+ - Then use ~qa-louder~, ~qa-quieter~, or ~qa-vol vol%~ (ex: ~qa-vol 90%~)
+
+ Other notes and tips:
+
+ - You can use Emacs for emergency or ad-hoc announcements.
+ - Use OBS or ~pavucontrol~ to adjust the volume of BBB as needed. You might be able to manage ~pavucontrol~ off-screen with ~ssh emacsconf-$TRACK@res.emacsconf.org -X -p $SSH_PORT pavucontrol~.
+ - You can also ~ssh emacsconf-$TRACK@res.emasconf.org -p 46668~ and start new processes from the command-line, such as using ~track-mpv~. If you specify commands when you call SSH instead of using an interactive shell, you may need to also specify DISPLAY=:5 (for the gen track) or DISPLAY=:6 (for the dev track), since ssh won't pick up the variables from ~.bashrc~.
+ - If you have a Wayland-only desktop without any X11 compatibility layer (example: [[https://swaywm.org][Sway]] with ~xwayland disable~) the suggested software (~tigervnc~) might no work. You can use instead for example ~gnome-remote-desktop~. The password for the VNC connection can be retrieved from the file ~vnc-passwd-$TRACK~ (3DES encrypted).
+
+*** Managing the stream from the agenda (option B2)
+
+ssh orga@res.emacsconf.org -p $SSH_PORT
+emacsconf # runs emacsclient -c -a emacs
+
+You can then use
+
+- emacsconf-stream-play-video
+- emacsconf-stream-open-qa-windows-on-change
+- emacsconf-agenda-by-track
+- emacsconf-agenda
+
+If things are going well, you can use C-c C-t on the agenda view to change a talk to PLAYING, CLOSED_Q, or OPEN_Q, and various things should happen in the background. If they don't happen in the background, use emacsconf-add-org-after-todo-state-change-hook to add the todo state change hook, then try again.
+
+Task state shortcuts for C-c C-t:
+
+- m (mpv) :: PLAYING - -stream-play-video, emacsconf-stream-set-talk-info, publish the files to the media directory
+- q (Q&A) :: CLOSED_Q
+- o (open) :: update the BBB redirect URLs to let people into the room
+- u (unstreamed)
+- r (to archive)
+
+You can leave the emacsclient with ~C-x 5 0~
+
+
+**** Do Q&A
+
+From the emacsclient on orga@res.emacsconf.org, you can open various talk-related things:
+- emacsconf-stream-open-pad
+- emacsconf-stream-join-qa
+- emacsconf-stream-join-chat
+
+Alternatively, you can switch to the VNC viewer and use the links in
+file:///data/emacsconf/2022/index-gen.html or
+file:///data/emacsconf/2022/index-dev.html .
+
+For Q&A, you may want to have the Etherpad on the left, the BBB Q&A or
+IRC chat on the right, and the terminal and OBS windows on
+workspace 2.
+
+*** Other tasks as needed
+
+**** Display emergency news / announcements
+
+M-x emacsconf-stream-broadcast to send a message to both streams
+or M-x emacsconf-stream-set-news to send a message to one stream.
+
+If that doesn't work, edit the news file directly with:
+~ssh emacsconf-$TRACK@res.emacsconf.org > ~/news.txt~
+
+If that doesn't work, use the VNC session to switch to an Emacs window
+and type your message in.
+
+**** Kill the VNC server:
+
+ssh emacsconf-$TRACK@res.emacsconf.org "vncserver -kill"
+
+| ~/bin/track-obs | start OBS with the track's profile and scene collection |
+| ~/bin/track-mpv file.webm | play the file using the track's sink |
+
+**** Making OBS scenes
+
+Making OBS scenes is pretty straightforward as you can move the
+different blocks on your scene in the preview window. However, it’s
+important to make sure that your video-captures and your overlays are
+snapping properly to the edges of the view-port. To do this, make sure
+to right-click on the block inside the preview window, and try the
+different fitting options (fit by width, height, etc.) until you find
+one that works best.
+
+We’ll probably be streaming at 720p, but since we’re also considering
+a 1080p update, try to create your overlays in a format or a resolution
+that would support resizing.
+
+*** Other notes
+There are sockets in the home directory for MPV control if you want to keep that process.
+echo '{ "command": ["loadfile", "test2.webm"] }' | socat - ~/mpv-socket-emacsconf-dev
+*** DONE Test and document command-line way of managing audio :sachac:
+CLOSED: [2022-11-19 Sat 11:14] DEADLINE: <2022-11-20 Sun>
+
+*** DONE Move my conf.org setup to res so that we can control everything from there
+CLOSED: [2022-11-03 Thu 14:10]
+*** DONE Set timers for changing todo state
+CLOSED: [2022-11-13 Sun 11:13]
+
+#+begin_src emacs-lisp :eval no
+ (defun emacsconf-schedule-test-buffer (info)
+ (mapcar (lambda (o) (plist-put o :buffer "1") o) info))
+ (let ((emacsconf-schedule-strategies '(emacsconf-schedule-test-buffer)))
+ (emacsconf-stream-schedule-timers (emacsconf-schedule-prepare
+ (emacsconf-schedule-inflate-sexp
+ `(("Test gen" :start ,(format-time-string "%Y-%m-%d %H:%M"
+ (time-add (current-time) (seconds-to-time 60))))
+ (journalism :time "1")
+ (school :time "2")
+ (handwritten :time "1")
+ ("Test dev" :start ,(format-time-string "%Y-%m-%d %H:%M"
+ (time-add (current-time) (seconds-to-time 60))))
+ (treesitter :time "2")
+ (lspbridge :time "1")
+ (asmblox :time "1"))))))
+ #+end_src
+
+the dev one worked, but the gen one gets
+Couldn’t find local shell prompt for /bin/sh
+Tramp: Opening connection *Async Shell Command* for emacsconf-gen@res.emacsconf.org using ssh...failed
+
+Maybe I need to stagger them, or maybe I need to use a shell command.
+Changed to call ssh directly instead of using tramp.
+
+*** DONE Figure out how to work with the layout
+CLOSED: [2022-11-08 Tue 12:32]
+https://i3wm.org/docs/layout-saving.html
+*** DONE Allow per-track configuration of todo hooks :sachac:
+CLOSED: [2022-11-08 Tue 12:49]
+emacsconf-todo-hooks
+*** CANCELLED [#C] Use xdotool to automate joining BBB in Firefox (signing in, clicking on listen only)
+CLOSED: [2022-11-08 Tue 12:32]
+**** DONE Xdotool over ssh so that I can click things?
+CLOSED: [2022-12-01 Thu 08:29]
+:PROPERTIES:
+:CREATED: [2022-11-28 Mon 23:08]
+:END:
+
+*** CANCELLED [#C] Experiment with sharing part of the screen so that there's space for us to work a little off-screen
+CLOSED: [2022-11-08 Tue 12:32]
+
+We might just have to rely on xdotool to move windows the way we want them
+Window fixes that didn't work
+- https://obsproject.com/forum/threads/solved-window-capture-black-screen.47082/
+- https://www.reddit.com/r/obs/comments/kas5ka/obs_window_capture_xcomposite_black_screen/
+
+*** DONE Set up scenes and try them
+CLOSED: [2022-10-30 Sun 21:54]
+*** DONE Set up text source for URL
+CLOSED: [2022-10-30 Sun 21:54]
+*** DONE Create Ansible tasks for setting up sinks for MPV and Firefox for the streams, and adding the scenes appropriately
+CLOSED: [2022-10-30 Sun 21:54]
+*** DONE See if I can even Ansible-up the rest of the tasks
+CLOSED: [2022-10-30 Sun 21:54]
+like starting up Firefox and mpv and everything
+*** CANCELLED obs-websocket control of OBS on the server
+CLOSED: [2022-11-19 Sat 11:14]
+so that the streamer can adjust volume offscreen?
+*** DONE document such that someone else could use/fix it
+CLOSED: [2022-11-19 Sat 11:15]
+*** DONE recruit at least one more person to help operate the "video bouncer"
+CLOSED: [2022-11-19 Sat 11:15]
+*** Other notes
+- bandali doesn't have much cognitive bandwidth at the moment, so we can keep things simple with OBS on laptops
+
+- Issue: zaeph was dropping frames and couldn’t pay attention to as many things as he wanted
+- Issue: corwin needs assistance to not be locked in his chair for the whole conf. Premptively, zaeph can do it by broadcasting OBS scenes via the rtmp (instead of just his webcam).
+- With a long day, we may want to be able to schedule hosts/streamers/publishers in shifts
+- Ideal: Easy reproducible setup to spin up an OBS VM with scenes set up, allowing multiple users to connect to it at the same time. Maybe x2go or vnc? VMs with 8 vCPUs and a vGPU cost more, so it would be good to figure out what's needed, spin it down, and then spin it up maybe the day before or something like that.
+- Plus points if we can control the OBS via password-protected websocket so we can tell it to switch scenes (and even more points if we do so from Emacs, maybe via that obs-websocket.el ;) ). MPV is also controllable via IPC, so we can use the same MPV player and then switch videos around. Maybe mpvc? https://unix.stackexchange.com/questions/664728/how-can-i-control-mpv-in-command-line
+- Probably Linode's Dedicated 32 GB + RTX6000 GPU x1 at $1.50 an hour for 2-3 days + dev time, since live.emacsconf.org is in Linode as well
+- We should also look into normalization across the board, especially if we have BBB participants. pipewire + easyeffects on the box might be the easiest way to do it.
+
+
+
+
+- https://docs.vdo.ninja/
+- Live Streaming using low configuration vps https://www.youtube.com/watch?v=3iBYYgkG1eM&t=953
+- https://snowmix.sourceforge.io/Examples/input.html
+- https://www.google.com/url?sa=t&source=web&rct=j&url=https://m.youtube.com/watch%3Fv%3D1y-DUYiECWQ&ved=2ahUKEwjPru_TqOv6AhVMkokEHXL9Dm4QtwJ6BAgqEAI&usg=AOvVaw17mbCEiFL6dGVY4YEBufcy
+- [[https://news.ycombinator.com/item?id=24633139][OBS Studio 26.0 | Hacker News]]
+- https://github.com/mviereck/x11docker#sound
+- https://vcs.fsf.org/?p=streamdesktop.git;a=tree
+- https://opensource.com/article/20/5/conference-free-software
+- https://github.com/soonum/hubangl
+- https://obsproject.com/forum/threads/run-obs-on-vm-in-the-cloud.122543/
+*** DONE Automate in-between display?
+CLOSED: [2022-11-25 Fri 12:50] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-20 Sun 08:33]
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-25 Fri 11:30]--[2022-11-25 Fri 12:50] => 1:20
+:END:
+[[file:~/proj/emacsconf/wiki/2022/organizers-notebook/index.org::*Think about what to do with schedule gaps due to cancelled talks][Think about what to do with schedule gaps due to cancelled talks]]
+
+emacsconf-stream-display-clock-and-countdown
+
+**** SOMEDAY [#C] Redo in-between slides
+:PROPERTIES:
+:CREATED: [2022-11-25 Fri 15:48]
+:END:
+
+**** DONE Automatically display in-between slide if there's no recorded intro
+CLOSED: [2022-11-29 Tue 07:12] SCHEDULED: <2022-11-28 Mon>
+ :PROPERTIES:
+ :CREATED: [2022-11-27 Sun 10:51]
+ :Effort: 0:30
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-28 Mon 20:00]--[2022-11-29 Tue 07:12] => 11:12
+ :END:
+
+ Okay, what's the tricky part here?
+
+todo status triggers playing, so things have to be non-interactive
+intro needs to be manual
+- if manual intro
+ - open the in-between page
+ - streamer types "play slug" manually
+- if recorded intro
+
+Gen:
+
+| | recorded intro | live intro |
+| recorded talk | [[elisp:(emacsconf-stream-play-intro "school")][school]]; play automatically | [[elisp:(emacsconf-stream-play-intro "workflows")][workflows]]; show in-between, host intros over mumble, streamer types "play slug" |
+| live talk | [[elisp:(emacsconf-stream-play-intro "journalism")][journalism]]; play intro automatically, join bbb | [[elisp:(emacsconf-stream-play-intro "survey")][survey]]; join bbb, no in-between slide |
+
+Dev:
+
+[[elisp:(emacsconf-stream-play-intro "async")][async]]
+
+**** DONE Make sure recorded intros play
+CLOSED: [2022-11-29 Tue 07:37] SCHEDULED: <2022-11-29 Tue>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-29 Tue 07:23]
+:END:
+
+[[elisp:(emacsconf-stream-play-talk-on-change "school")]] should play intro + video
+[[elisp:(emacsconf-stream-play-video "health")]] should play video (no recorded intro)
+
+dev:
+[[elisp:(emacsconf-stream-play-talk-on-change "treesitter")]] should play intro + video
+
+
+*** DONE [#A] Separate mumble audio so that panic button can still bring in our audio
+ CLOSED: [2022-11-22 Tue 11:00] SCHEDULED: <2022-11-21 Mon>
+ :PROPERTIES:
+ :CREATED: [2022-11-20 Sun 10:14]
+ :Effort: 30
+ :END:
+ :LOGBOOK:
+ CLOCK: [2022-11-22 Tue 10:19]--[2022-11-22 Tue 11:00] => 0:41
+ :END:
+
+*** DONE Prepare for rms talk and Q&A with bandali
+ CLOSED: [2022-12-01 Thu 12:38] SCHEDULED: <2022-12-01 Thu> DEADLINE: <2022-12-01 Thu>
+ :PROPERTIES:
+ :CREATED: [2022-11-18 Fri 12:27]
+ :END:
+
+Mumble?
+
+**** DONE [#B] Reflow and edit VTT for RMS TEDx talk so that things are on one line
+CLOSED: [2022-11-29 Tue 22:56] SCHEDULED: <2022-11-30 Wed>
+ :PROPERTIES:
+ :CREATED: [2022-11-19 Sat 19:02]
+ :Effort: 0:30
+ :END:
+ :LOGBOOK:
+ - Note taken on [2022-11-29 Tue 15:01] \\
+ want to have Whisper do it
+ CLOCK: [2022-11-29 Tue 14:59]--[2022-11-29 Tue 15:01] => 0:02
+ :END:
+
+[[file:~/proj/emacsconf/lisp/emacsconf-stream.el]]
+
+*** DONE Add panic button to OBS settings
+CLOSED: [2022-11-24 Thu 09:02] SCHEDULED: <2022-11-24 Thu>
+ :PROPERTIES:
+ :CREATED: [2022-11-20 Sun 10:13]
+ :END:
+
+ Ctrl-Shift-M?
+
+*** DONE Add background music to server :emacsconf:
+CLOSED: [2022-11-24 Thu 08:57] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-22 Tue 21:40]
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-24 Thu 08:06]--[2022-11-24 Thu 08:57] => 0:51
+:END:
+zaeph suggests using shoshin's music
+
+if ! screen -list | grep -q background; then
+ screen -S track-mpv ~/stream/background.wav &
+fi
+
+*** DONE [#A] Make it easy to rebroadcast other track (ex: rms) - might need mpv with minimal configuration, switchable profiles
+CLOSED: [2022-12-02 Fri 07:41] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-30 Wed 23:46]
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-01 Thu 18:46]--[2022-12-01 Thu 20:09] => 1:23
+CLOCK: [2022-12-01 Thu 08:29]--[2022-12-01 Thu 08:53] => 0:24
+:END:
+
+
+**** DONE make it easy to rebroadcast
+CLOSED: [2022-12-02 Fri 07:41] SCHEDULED: <2022-12-01 Thu>
+:PROPERTIES:
+:CREATED: [2022-12-01 Thu 13:39]
+:END:
+** DONE [#C] Smoothen captioning workflow :sachac:
+CLOSED: [2022-11-19 Sat 11:10]
+:PROPERTIES:
+:CUSTOM_ID: caption-workflow
+:END:
+It looks like OpenAPI needs a little less editing in terms of
+capitalization and punctuation, but it produces longer captions
+(likely a 30-second sliding window). I'll try to upload both YT and
+OpenAPI captions so that people can decide what they like.
+
+[[#mpv-captions][Set up MPV for captions]]
+*** DONE Make sure all the captioned files are marked so
+CLOSED: [2022-11-30 Wed 19:03]
+
+#+begin_src emacs-lisp :eval no
+(seq-keep (lambda (o)
+ (when (and (string= (plist-get o :status) "TO_STREAM")
+ (or (null (plist-get o :captions-edited))
+ (null (with-temp-buffer
+ (insert-file-contents
+ (expand-file-name (concat (plist-get o :video-slug) "--main.vtt")
+ emacsconf-cache-dir))
+ (goto-char (point-min))
+ (re-search-forward "captioned by" (line-end-position) t)))))
+ (plist-get o :slug)
+ ))
+ (emacsconf-get-talk-info))
+#+end_src
+*** DONE Edit survey captions
+CLOSED: [2022-11-29 Tue 22:20] SCHEDULED: <2022-11-30 Wed>
+:PROPERTIES:
+:CREATED: [022-11-29 Tue 15:2]
+:END:
+
+*** DONE Edit dbus captions
+CLOSED: [2022-11-29 Tue 15:22]
+:PROPERTIES:
+:Effort: 1:00
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-29 Tue 15:07]--[2022-11-29 Tue 15:22] => 0:15
+:END:
+*** DONE Figure out why it's choking on SRV2
+CLOSED: [2022-10-30 Sun 00:13]
+Can I use aeneas for alignment instead?
+
+Reflow the .txt file and reupload to res if needed
+call ../run-aeneas.sh from the directory with the opus or ogg and the txt file
+
+sachac@res-emacsconf:~/current/meetups$ python3 -m aeneas.tools.execute_task emacsconf-2022-meetups--attending-and-organizing-emacs-meetups--bhavin-gandhi--main.opus reflowed.srt "task_language=eng|os_task_file_format=json|is_text_type=subtitles" output.json
+
+I might try out lhotse and torchaudio someday, but it's low priority. aeneas seems to do a reasonable job of
+*** DONE [#C] Move publishing the backstage index to res so that we can trigger it after the files are uploaded
+CLOSED: [2022-11-19 Sat 11:09]
+:PROPERTIES:
+:CREATED: [2022-10-21 Fri 16:45]
+:END:
+
+*** DONE Compare large, medium, and small models
+CLOSED: [2022-10-23 Sun 08:32]
+12 threads
+
+Original file: 21:16 21 minutes
+| | Hours | Mult | Notes |
+| [[https://media.emacsconf.org/2022/backstage/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--large.vtt][Large]] | 2:49 | 8 | |
+| [[https://media.emacsconf.org/2022/backstage/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--medium.vtt][Medium]] | 2:03 | 5.9 | |
+| [[https://media.emacsconf.org/2022/backstage/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--small.vtt][Small]] | 0:40 | 2 | More run-on sentences |
+
+Large and medium might do better on a system with a GPU. I'll default to the small model for now.
+
+*** DONE Commit subed-tsv so that people can try a cleaner output
+CLOSED: [2022-10-23 Sun 09:59]
+:PROPERTIES:
+:Effort: 1:00
+:QUANTIFIED: Emacs
+:END:
+:LOGBOOK:
+CLOCK: [2022-10-23 Sun 08:32]--[2022-10-23 Sun 09:59] => 1:27
+:END:
+*** DONE Investigate more granular timestamps for the output from OpenAPI Whisper
+CLOSED: [2022-10-25 Tue 11:14]
+
+https://git.emacsconf.org/emacsconf-ansible/tree/roles/caption/templates
+
+*** DONE Upload srv2 from YouTube for word-level
+CLOSED: [2022-10-22 Sat 23:16]
+:PROPERTIES:
+:CREATED: [2022-10-22 Sat 14:38]
+:END:
+*** CANCELLED [#C] Compare with Google Cloud Speech API
+CLOSED: [2022-10-29 Sat 09:58]
+~/code/speech
+
+*** DONE E-mail for bringing new captioning volunteers onboard
+CLOSED: [2022-10-29 Sat 09:58]
+#+begin_src emacs-lisp
+(defun emacsconf-mail-backstage-intro (volunteer &optional template)
+ (interactive (list (emacsconf-complete-volunteer)))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "backstage-intro"))
+ (assoc-default "EMAIL" volunteer 'string=)
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :conf-name emacsconf-name
+ :year emacsconf-year
+ :name (assoc-default "NAME_SHORT" volunteer 'string=)
+ :email (assoc-default "EMAIL" volunteer 'string=))))
+#+end_src
+**** Template
+:PROPERTIES:
+:TO: ${email}
+:FUNCTION: emacsconf-mail-backstage-intro
+:EMAIL_ID: backstage-intro
+:SUBJECT: ${conf-name} ${year}: Thanks for volunteering!
+:END:
+
+Hi ${name}!
+
+Thank you for volunteering for ${conf-name} ${year}!
+
+We've set up ${backstage} as the backstage area where you can view the
+videos and resources uploaded so far. You can access it with the
+username "${backstage-user}" and the password "${backstage-password}".
+Please keep the backstage password and other speakers' talk resources
+secret.
+
+For some ideas on ways to help, you can check out
+https://emacsconf.org/2022/volunteer/ . You can also suggest other
+things you might be interested in.
+
+You can ask questions or chat with other volunteers by e-mailing the
+mailing list at emacsconf-org@gnu.org or dropping by #emacsconf on the
+libera.chat IRC network. You can also e-mail me or
+emacsconf-org-private@gnu.org if you have private questions.
+
+Thank you again for your help! =)
+
+Sacha Chua
+
+*** DONE E-mail for bringing new captioning volunteers onboard
+CLOSED: [2022-10-29 Sat 09:58]
+#+begin_src emacs-lisp
+(defun emacsconf-mail-captioning-intro (volunteer &optional template)
+ (interactive (list (emacsconf-complete-volunteer)
+ (emacsconf-mail-merge-get-template "captioning-intro")))
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "captioning-intro"))
+ (assoc-default "EMAIL" volunteer 'string=)
+ (list
+ :backstage "https://media.emacsconf.org/2022/backstage/"
+ :backstage-user "emacsconf"
+ :backstage-password emacsconf-backstage-password
+ :conf-name emacsconf-name
+ :year emacsconf-year
+ :name (assoc-default "NAME_SHORT" volunteer 'string=)
+ :email (assoc-default "EMAIL" volunteer 'string=))))
+#+end_src
+**** Template
+:PROPERTIES:
+:TO: ${email}
+:FUNCTION: emacsconf-mail-captioning-intro
+:EMAIL_ID: captioning-intro
+:SUBJECT: ${conf-name} ${year}: Thanks for volunteering to help with captions!
+:END:
+
+Hi ${name}!
+
+Thank you for volunteering to help with the captions for ${conf-name}
+${year}! Last year, we were able to get almost all the talks captioned
+in time for streaming. Participants found them very useful for
+understanding different technical terms, names, accents, and so on.
+We'd love to be able to pull that off again this year, and it would be
+great to have you on board.
+
+We've set up ${backstage} as the backstage area where you can view the
+videos and resources uploaded so far. You can access it with the
+username "${backstage-user}" and the password "${backstage-password}".
+Please keep the backstage password and resources secret. If you see a
+talk that you'd like to caption, you can e-mail me at
+sacha@sachachua.com and I can reserve it for you. Then you can correct
+any misrecognized words, fix capitalizations, remove filler words as
+needed, and so on.
+
+You'll probably want to work with either the VTT or the TXT versions
+(VTT is WebVTT format and has timestamps), but you can check the other
+talk resources in case the speaker has posted scripts or other useful
+things. Both VTT and TXT are plain text, so feel free to use your
+favourite text or subtitle editor. I've posted a brief demo of how I
+edit captions at
+https://media.emacsconf.org/2022/backstage/editing-captions.html , and
+you can find more captioning tips at https://emacsconf.org/captioning/
+. You can convert it to whatever format you like. If you prefer to
+work with plain text, we can figure out the timestamps afterwards.
+
+Let me know if you want to reserve a talk for captioning or if you have
+any questions or suggestions. We're also in the #emacsconf-org channel
+on the libera.chat IRC network, which you can connect to with your
+favourite IRC client or through the web-based interface at
+https://chat.emacsconf.org/ .
+
+Sacha Chua
+*** DONE [#C] Support cue IDs in subed-vtt.el
+CLOSED: [2022-11-11 Fri 08:58]
+*** CANCELLED [#C] jiwer · PyPI - measure error rate
+CLOSED: [2022-11-19 Sat 11:09]
+:PROPERTIES:
+:CREATED: [2022-10-22 Sat 20:59]
+:END:
+
+https://pypi.org/project/jiwer/
+
+*** SOMEDAY Think about flow for YouTube captions
+SCHEDULED: <2022-12-07 Wed>
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 16:21]
+:END:
+
+are they at the right length?
+*** DONE [#A] Check captions for rms talk
+CLOSED: [2022-11-26 Sat 22:35] SCHEDULED: <2022-11-27 Sun>
+:PROPERTIES:
+:CREATED: [2022-11-26 Sat 20:44]
+:END:
+
+*** TODO [#C] Try whisper.cpp
+commented out ~-mavx~ to get it to compile in Debian on res
+
+ffmpeg -y -i emacsconf-2022-rmsted--main.ogg -acodec pcm_s16le -ac 1 -ar 16000 emacsconf-2022-rmsted--main.wav
+/usr/src/whisper.cpp/main -f emacsconf-2022-rmsted--main.wav -m models/ggml-large.bin -ovtt -otxt
+
+*** DONE [#A] edit rms tedx captions, they're not actually edited!
+CLOSED: [2022-11-29 Tue 22:56]
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 08:00]
+:END:
+
+*** DONE [#A] realign subtitles if needed, looks like aeneas options need tweaking
+CLOSED: [2022-11-30 Wed 14:17] SCHEDULED: <2022-11-30 Wed>
+:PROPERTIES:
+:CREATED: [2022-11-29 Tue 21:46]
+:Effort: 1:00
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-30 Wed 14:05]--[2022-11-30 Wed 14:17] => 0:12
+:END:
+
+#+begin_src emacs-lisp :eval no
+(seq-keep
+ (lambda (file)
+ (let ((subtitles (subed-parse-file file))
+ gaps)
+ (while (cdr subtitles)
+ (setq gaps (cons (- (elt (cadr subtitles) 1) (elt (car subtitles) 2))
+ gaps))
+ (setq subtitles (cdr subtitles)))
+ ;; if there are gaps more than
+ (let ((big-gaps (seq-filter (lambda (gap) (> gap 100)) gaps)))
+ (when big-gaps
+ (list (file-name-base file)
+ (length big-gaps)
+ (apply #'max big-gaps)))))
+ )
+ (directory-files emacsconf-cache-dir t "--main.vtt$")
+ )
+#+end_src
+
+
+*** SOMEDAY ggerganov/whisper.cpp: Port of OpenAI's Whisper model in C/C++
+:PROPERTIES:
+:CREATED: [2022-11-28 Mon 11:37]
+:END:
+
+https://github.com/ggerganov/whisper.cpp
+
+*** TODO Move the captioning stuff to the public area
+:PROPERTIES:
+:CREATED: [2022-12-05 Mon 11:09]
+:END:
+
+*** TODO Look into getting the confidence intervals out of aeneas, maybe by getting it as an XML
+:PROPERTIES:
+:CREATED: [2022-12-10 Sat 08:58]
+:END:
+
+Also look into finetuneas
+
+*** SOMEDAY A Deep Dive Exploration Applying OpenAI’s Whisper ASR To A PBS NewsHour Broadcast – The GDELT Project
+:PROPERTIES:
+:CREATED: [2022-12-11 Sun 00:36]
+:END:
+
+https://blog.gdeltproject.org/a-deep-dive-exploration-applying-openais-whisper-asr-to-a-pbs-newshour-broadcast/
+
+*** SOMEDAY Confidence scores for each word? - Discussion #284 - openai/whisper
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 08:33]
+:END:
+
+https://github.com/openai/whisper/discussions/284
+
+*** SOMEDAY jianfch/stable-ts: Stabilizing timestamps of OpenAI's Whisper outputs down to word-level
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 08:35]
+:END:
+
+https://github.com/jianfch/stable-ts
+
+*** SOMEDAY See if we can get confidence data out of whisper
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 08:32]
+:END:
+
+*** SOMEDAY Use bbb events to identify speaker changes and overlapping spans that might need closer attention
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 08:32]
+:END:
+
+*** SOMEDAY Getting Started with Bacalhau | Bacalhau Docs
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 17:09]
+:END:
+
+https://docs.bacalhau.org/getting-started/installation
+
+*** SOMEDAY Use OpenAI Whisper and Bacalhau to transcribe audio and video files | Nerd For Tech
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 17:08]
+:END:
+
+https://medium.com/nerd-for-tech/how-to-use-bacalhau-and-openai-whisper-to-transcribe-a-youtube-video-7b6ee0135ce2
+
+*** SOMEDAY A Deep Dive Exploration Applying OpenAI’s Whisper ASR To A Russian Television News Broadcast – The GDELT Project
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 16:49]
+:END:
+
+https://blog.gdeltproject.org/a-deep-dive-exploration-applying-openais-whisper-asr-to-a-russian-television-news-broadcast/
+
+*** SOMEDAY Benchmarks for T4 & V100 GPUs, comparison with human captioning, and deep dive on non-deterministic output · Discussion #395 · openai/whisper
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 16:40]
+:END:
+
+https://github.com/openai/whisper/discussions/395
+
+*** SOMEDAY Pointers for running this on a GPU via a cloud service? · Discussion #398 · openai/whisper
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 21:44]
+:END:
+
+https://github.com/openai/whisper/discussions/398
+
+*** SOMEDAY How to chunk text into paragraphs using python | by N Polovinkin | Medium
+:PROPERTIES:
+:CREATED: [2022-12-12 Mon 21:35]
+:END:
+
+https://medium.com/@npolovinkin/how-to-chunk-text-into-paragraphs-using-python-8ae66be38ea6
+
+** DONE Find a way to accommodate a specific return-speaker
+CLOSED: [2022-11-19 Sat 11:17]
+We’re not sure if we’re going to get a presentation or a prerec for them
+this year, but we need to keep this at the back of our minds.
+
+Note on how DebConf handled incidents:
+https://www.mail-archive.com/search?l=debconf-team@lists.debian.org&q=subject:%22Re%5C%3A+DebConf+21+Incident+Response%22&o=newest&f=1
+
+** DONE [#A] Write check-in email :sachac:
+CLOSED: [2022-11-21 Mon 13:30] DEADLINE: <2022-11-20 Sun> SCHEDULED: <2022-11-19 Sat>
+:PROPERTIES:
+:CUSTOM_ID: check-in-email
+:END:
+*** DONE Switch all the rooms to allow anyone to start them - one less step for the check-in person
+CLOSED: [2022-11-20 Sun 09:33]
+:PROPERTIES:
+:Effort: 0:30
+:QUANTIFIED: Emacs
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-20 Sun 08:46]--[2022-11-20 Sun 09:33] => 0:47
+:END:
+
+#+begin_src js2 :eval no
+//list = [...document.querySelectorAll('.room-name-editable')].filter((o) => o.value.match(/^ec22-(sat|sun)/));
+card = document.querySelector('a[href=\"%s\"] .card-body');
+card.querySelector('.item-action.dropdown a').click()
+card.querySelector('.update-room').click()
+if (!document.querySelector('#room_anyone_can_start').checked) {
+ document.querySelector('#room_anyone_can_start').click();
+}
+document.querySelector('.update-only.create-room-button').click();
+#+end_src
+
+okay, next thing, it automatically refreshes. so I can't run the whole Javascript, I need to xdotool it.
+
+#+begin_src emacs-lisp :eval no
+(setq list (mapcar (lambda (o) (plist-get o :bbb-room)) (emacsconf-get-talk-info)))
+(setq list (seq-drop list (seq-position list "https://bbb.emacsverse.org/b/sac-rvc-kd2-pev")))
+(progn
+ (setq item (pop list))
+ (when (string-match "/b/\\(.*\\)" item)
+ (kill-new (format "card = document.querySelector('a[href=\"%s\"] .card-body');
+card.querySelector('.item-action.dropdown a').click()
+card.querySelector('.update-room').click()
+if (!document.querySelector('#room_anyone_can_start').checked) {
+ document.querySelector('#room_anyone_can_start').click();
+}
+document.querySelector('.update-only.create-room-button').click();
+"
+ (match-string 0 item)))
+ (sleep-for 2)
+ (shell-command "xdotool key alt+Tab")))
+#+end_src
+
+Relying on xdotool seems a little fragile. Let's just check the page
+itself for the next one that needs to be done.
+
+#+begin_src js2 :eval no
+list = [...document.querySelectorAll('.room-name-editable')].filter((o) => o.value.match(/^ec22-(sat|sun)/));
+list.reduce(async(prev, elem) => {
+ await prev;
+ if (!sessionStorage.getItem(elem.value)) {
+ return new Promise((resolve, reject) => {
+ card = elem.closest('.card-body');
+ card.querySelector('.item-action.dropdown a').click();
+ card.querySelector('.update-room').click();
+ sessionStorage.setItem(elem.value, true);
+ setTimeout(function() {
+ if (!document.querySelector('#room_anyone_can_start').checked) {
+ document.querySelector('#room_anyone_can_start').click();
+ document.querySelector('.update-only.create-room-button').click();
+ } else {
+ document.querySelector('#createRoomModal').click();
+ }
+ resolve(true);
+ }, 500);
+ });
+ }
+});
+#+end_src
+
+*** DONE Update checkin instructions
+CLOSED: [2022-11-20 Sun 10:58]
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-20 Sun 10:12]--[2022-11-20 Sun 10:58] => 0:46
+:END:
+*** Templates
+:PROPERTIES:
+:SUBJECT: Getting ready for EmacsConf ${year}
+:END:
+
+Goals:
+- Ask speaker verify their scheduled time
+ It has already been confirmed with them, but it might have changed slightly
+ - HOW: They should check the time at the top of their talk page on the day of the conference
+- Double-check Q&A preference, encourage tech checks for live talks/Q&A
+ - If they are available:
+ - Direct to tech-checks via https://emacsconf.org/${year}/prepare/
+ - Inform them of the check-in process
+ - They come say hi to us 30' before their session in #emacsconf-org or #emacsconf (they can use chat.emacsconf.org )
+ - We get them set up in a room where they can wait until the end of the broadcast of their pretention
+ - They’re joined by the streamer and host.
+- Warning about potential emergency changes
+
+Slightly more complex because of the conditionals
+
+#+begin_src emacs-lisp :lexical t
+(defun emacsconf-mail-checkin-instructions (group &optional template)
+ "Send checkin instructions.
+GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group
+ (seq-filter
+ (lambda (o)
+ (or
+ (string= (plist-get o :status) "CANCELLED")
+ (null (plist-get o :email))
+ (string-match "after" (or (plist-get o :q-and-a) ""))))
+ (emacsconf-get-talk-info)))))
+ (let* ((talks (seq-remove
+ (lambda (o)
+ (or
+ (string= (plist-get o :status) "CANCELLED")
+ (null (plist-get o :email))
+ (string-match "after" (or (plist-get o :q-and-a) ""))
+ (save-window-excursion
+ (emacsconf-with-talk-heading o
+ (re-search-forward "checkin instructions" (save-excursion (org-end-of-subtree)) t)))))
+ (cdr group)))
+ (waiting-talks (seq-find (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC")) talks)))
+ (when talks
+ (emacsconf-mail-prepare
+ (or template (emacsconf-mail-merge-get-template "checkin-at-conf"))
+ (car group)
+ (list
+ :year emacsconf-year
+ :base-url emacsconf-base-url
+ :conf-name emacsconf-name
+ :email (plist-get (car talks) :email)
+ :emergency emacsconf-emergency-contact
+ :plural (if (> (length (cdr group)) 1) "s" "")
+ :speakers-short (plist-get (car talks) :speakers-short)
+ :url (mapconcat (lambda (o) (concat emacsconf-base-url (plist-get o :url)))
+ talks" , ")
+ :waiting
+ (cond
+ ((> (length waiting-talks) 1)
+ " If you can upload your talk videos before the conference, I think that might be much less stressful for everyone than doing it live. =) Please note that we will turn off the web-based upload on Dec 1 to free up memory on the server, so please upload them as early as you can.${wrap}")
+ ((= (length waiting-talks) 1)
+ " If you can upload your talk video before the conference, I think that might be much less stressful for everyone than doing it live. =) Please note that we will turn off the web-based upload on Dec 1 to free up memory on the server, so please upload it as early as you can.${wrap}")
+ (t ""))
+ :checkin-info
+ (mapconcat
+ (lambda (o)
+ (let ((base-checkin (format-time-string "%b %-d %-l:%M %p" (plist-get o :checkin-time) emacsconf-timezone))
+ (speaker-checkin (format-time-string "%b %-d %-l:%M %p" (plist-get o :checkin-time) (plist-get o :timezone))))
+ (emacsconf-replace-plist-in-string
+ (append (list :base-url emacsconf-base-url
+ :check-in
+ (concat
+ "Before "
+ base-checkin " in " emacsconf-timezone
+ (if (string= base-checkin speaker-checkin)
+ ""
+ (concat
+ ", which is the same as " speaker-checkin " in " (plist-get o :timezone))) "\n"
+ " (this is " (plist-get o :checkin-label) ")")
+ :qa-info-speakers
+ (cond
+ ;; aaaaah, no prerec yet
+ ((string= (plist-get o :status) "WAITING_FOR_PREREC")
+ (concat "Talk and Q&A BigBlueButton room: " (plist-get o :bbb-room)))
+ ((null (plist-get o :q-and-a)) "")
+ ((string-match "live" (plist-get o :q-and-a)) (concat "Q&A BigBlueButton room: " (plist-get o :bbb-room)))
+ ((string-match "irc" (plist-get o :q-and-a)) (concat "Q&A: " (plist-get o :channel) " (" (plist-get o :webchat-url) ")"))
+ ((string-match "pad" (plist-get o :q-and-a)) "Q&A: On the pad")
+ (t "Q&A: After the event")))
+ o)
+ "- ${title}
+ Info and sched: ${base-url}${url}
+ Check-in: ${check-in}
+ Pad: ${pad-url}
+ ${qa-info-speakers}")))
+ talks "\n\n")))
+ (mapc (lambda (o)
+ (emacsconf-mail-log-message-when-sent o "Sent checkin instructions"))
+ talks))))
+#+end_src
+
+**** E-mail for speakers who are planning to be at the conference
+:PROPERTIES:
+:EMAIL_ID: checkin-instructions
+:SUBJECT: ${conf-name} ${year}: Check-in instructions
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:FUNCTION: emacsconf-mail-checkin-instructions
+:END:
+
+Hello, ${speakers-short}!
+
+We're looking forward to having you join us at EmacsConf!
+
+We've updated the schedule based on the submissions and cancellations,
+and we'll probably update the schedule even on the day of the
+conference. You can get a rough idea of your schedule on your talk
+page${plural}. You might want to check your talk page${plural} some time next
+week to get a rough sense of where it is, and then check it again on
+the day of your talk${plural}. Please let me know if the times don't
+work for you.
+
+We'll try our best to keep your talk in the same general timeslot (ex:
+Saturday morning, Saturday afternoon, Sunday morning, Sunday
+afternoon). We've done some dry-runs, but just in case it turns out
+that running two tracks at the same time leaves us too frazzled, we
+may drop back to one track with Q&A on an alternate stream, like last
+year. If there are big changes to your schedule on the day of your
+talk${plural}, you'll get an e-mail from us with a subject like
+"URGENT: EmacsConf 2022: ...".${wrap}
+
+Here's your talk page URL and checkin information:
+
+${checkin-info}
+
+Please check in early so that we can deal with scheduling changes or
+technical issues, and so that we don't worry too much about whether
+you'll be ready to go for Q&A. =) You can find the check-in process at
+${base-url}${year}/speakers/ .${waiting}
+
+If something comes up, please let us know as soon as you can. Here's
+my emergency contact information: ${emergency}
+
+Thank you for sharing your time and energy with the EmacsConf community!
+
+Sacha
+
+p.s. If you need to cancel, that's okay too, life happens. Let me know
+as soon as you can and I'll try to shuffle things around. Thank you!
+
+**** E-mail for speakers who are not planning to be around, but who have sent us their prerecs
+:PROPERTIES:
+:EMAIL_ID: checkin-after
+:SUBJECT: EmacsConf ${year}: Check-in instructions
+:END:
+
+Hello, ${name}!
+
+Thank you so much for contributing a talk for EmacsConf ${year}! 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/${year}/speakers/ .
+
+Thank you again for being part of EmacsConf ${year}!
+
+Sacha
+*** CANCELLED Draft e-mail to send speakers who may need to do it live
+CLOSED: [2022-11-21 Mon 13:30]
+:PROPERTIES:
+:CUSTOM_ID: live-speakers
+:END:
+*** DONE [#A] Make sure IRC talks get BBB checkin information if they need to do it live :mail:
+CLOSED: [2022-11-28 Mon 13:24] SCHEDULED: <2022-11-28 Mon>
+:PROPERTIES:
+:CREATED: [2022-11-23 Wed 11:24]
+:Effort: 0:15
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-28 Mon 13:23]--[2022-11-28 Mon 13:24] => 0:01
+:END:
+survey, orgyear, lspbridge, eev, python
+
+** [#B] Plan in-case-of-emergency schedule for dropping back to one track after Saturday morning :sachac:derisk:
+:PROPERTIES:
+:CUSTOM_ID: one-track
+:END:
+
+We might be able to do it on a modular basis (Saturday afternoon, Sunday morning, or Sunday afternoon).
+We need a quick way to notify the affected speakers, and we should give them a heads-up as well.
+We also need a quick way to update the schedule.
+*** DONE Update conf.org and the wiki based on the selected emergency schedule
+CLOSED: [2022-11-24 Thu 21:33] SCHEDULED: <2022-11-28 Mon>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-17 Thu 21:15]--[2022-11-17 Thu 21:15] => 0:00
+:END:
+
+*** DONE Give speakers a heads-up regarding schedule tweaks and the potential for bigger schedule changes
+CLOSED: [2022-11-21 Mon 13:55] SCHEDULED: <2022-11-18 Fri>
+*** DONE Draft the code for mailing all the affected speakers
+CLOSED: [2022-11-24 Thu 21:33] SCHEDULED: <2022-11-28 Mon>
+*** Saturday afternoon
+#+begin_src emacs-lisp :exports results :results replace :var filename="emergency-back-to-one-sat-pm.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints nil)
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Saturday, December 3" :start "2022-12-03 13:00")
+ meetups sqlite buttons mail realestate health eev python jupyter maint orgvm haskell sat-close)))
+ (emacsconf-schedule-start-time "13:00")
+ (emacsconf-schedule-svg-modify-functions '(;emacsconf-schedule-svg-color-by-status
+ ))
+ (emacsconf-schedule-default-buffer-minutes 0)
+ (emacsconf-schedule-expected-talks '(meetups sqlite mail buttons realestate maint health eev python jupyter haskell sat-close))
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 1)
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-video-time-round-up-to-five
+ emacsconf-schedule-allocate-buffer-time))
+ (emacsconf-schedule-apply nil) ;; change this in case of emergency
+)
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:emergency-back-to-one-sat-pm.svg]]
+:end:
+
+*** Sunday morning
+#+begin_src emacs-lisp :exports results :results replace :var filename="emergency-back-to-one-sun-am.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ (emacsconf-time-constraints '())
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Sunday, December 4" :start "2022-12-04 9:00")
+ sun-open survey orgyear lspbridge rolodex rde treesitter orgsuperlinks justl orgvm rms)))
+ (emacsconf-schedule-expected-talks '(sun-open survey orgyear rolodex lspbridge rde orgsuperlinks treesitter justl orgvm rms))
+ (emacsconf-schedule-end-time "12:30")
+ (emacsconf-schedule-svg-modify-functions '(;emacsconf-schedule-svg-color-by-status
+ ))
+ (emacsconf-schedule-default-buffer-minutes 0)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 0)
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-video-time-round-up-to-five
+ emacsconf-schedule-allocate-buffer-time))
+ (emacsconf-schedule-apply nil) ;; change this in case of emergency
+)
+#+end_src
+
+#+RESULTS:
+:results:
+- rms: Ends at 12:15 after 12:00
+- [[file:emergency-back-to-one-sun-am.svg]]
+:end:
+
+
+*** Sunday afternoon
+#+begin_src emacs-lisp :exports results :results replace :var filename="emergency-back-to-one-sun-pm.svg" :eval never-export
+(emacsconf-schedule-test
+ filename
+ emacsconf-time-constraints
+ (arranged
+ (emacsconf-schedule-inflate-sexp
+ '(("Sunday, December 4" :start "2022-12-04 13:00")
+ devel hyperorg detached workflows eshell grail async indieweb dbus localizing fanfare sun-close)))
+ (emacsconf-schedule-start-time "13:00")
+ (emacsconf-schedule-end-time "18:00")
+ (emacsconf-schedule-expected-talks '(hyperorg detached workflows eshell grail async indieweb dbus localizing devel fanfare sun-close))
+ (emacsconf-schedule-svg-modify-functions '(;emacsconf-schedule-svg-color-by-status
+ ))
+ (emacsconf-schedule-default-buffer-minutes 3)
+ (emacsconf-schedule-default-buffer-minutes-for-live-q-and-a 3)
+ (emacsconf-schedule-strategies '(emacsconf-schedule-override-breaks
+ emacsconf-schedule-allocate-video-time-round-up-to-five
+ emacsconf-schedule-allocate-buffer-time))
+ (emacsconf-schedule-apply nil) ;; change this in case of emergency
+)
+#+end_src
+
+#+RESULTS:
+:results:
+- [[file:emergency-back-to-one-sun-pm.svg]]
+:end:
+
+*** DONE Get the emergency schedule sorted out so that we can easily switch to it
+CLOSED: [2022-11-24 Thu 21:33] SCHEDULED: <2022-11-24 Thu>
+:PROPERTIES:
+:CREATED: [2022-11-19 Sat 08:01]
+:END:
+
+To change, set emacsconf-schedule-apply to t
+M-x emacsconf-update-schedule
+Commit the wiki and push it
+Draft the e-mail for emergency schedule
+
+*** DONE Draft e-mail for emergency schedule
+CLOSED: [2022-11-24 Thu 21:32]
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-11-24 Thu 21:13]--[2022-11-24 Thu 21:32] => 0:19
+:END:
+
+#+begin_src emacs-lisp
+(defun emacsconf-mail-emergency-update (group &optional template)
+ "Send emergency schedule update.
+GROUP is (email . (talk talk))"
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (setq template (or template (emacsconf-mail-merge-get-template "emergency")))
+ (emacsconf-mail-prepare
+ template
+ (car group)
+ (list
+ :urls (mapconcat (lambda (o) (plist-get o :absolute-url)) (cdr group) " , ")
+ :emergency emacsconf-emergency-contact
+ :conf-name emacsconf-name
+ :year emacsconf-year
+ :email (plist-get (cadr group) :email)
+ :plural (if (= (length (cdr group)) 1) "" "s")
+ :schedule
+ (mapconcat
+ (lambda (o)
+ (concat "Talk: " (plist-get o :title) "\n"
+ "URL: " (plist-get o :absolute-url) "\n"
+ "New start of talk: "
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ emacsconf-timezone)
+ "\n"
+ (if (string= emacsconf-timezone (plist-get o :timezone))
+ ""
+ (concat
+ "which is the same as "
+ (format-time-string
+ "%b %-e %-I:%M %#p %Z"
+ (plist-get o :start-time)
+ (plist-get o :timezone))))))
+ (cdr group)
+ "\n\n"))))
+#+end_src
+
+**** Template
+:PROPERTIES:
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:SUBJECT: URGENT: ${conf-name} ${year}: Schedule update
+:SLUGS: buddy devel
+:FUNCTION: emacsconf-mail-emergency-update
+:EMAIL_ID: emergency
+:END:
+
+Sorry about the last-minute change. We needed to update the schedule
+because two tracks turned out to be too much for us to handle at the
+moment. The new schedule will play all the talks on one stream, and
+the other stream will handle Q&A.
+
+Here's a copy of the updated schedule for your convenience:
+${schedule}
+
+Please check in at least 30 minutes before your talk (or 60 minutes if
+you're going to do it live). https://emacsconf.org/2022/speakers/ has
+more details.
+
+You can also find the new schedule at the page URL${plural} above.
+Please let me know if you can't make it. We can collect the questions
+and you can follow up afterwards. You can reach me by e-mail or in
+#emacsconf-org on IRC, or with this emergency contact info:
+${emergency}
+
+Thank you for your patience!
+
+Sacha
+
+** DONE [#A] Manage front0 and live0 size :bandali:
+CLOSED: [2022-12-06 Tue 10:01] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CUSTOM_ID: resize
+:END:
+
+*** DONE Resize front0 and live0 in the Linode administration console :bandali:
+CLOSED: [2022-12-06 Tue 10:00]
+[20:23:48] <bandali> aha okay thanks. yeah i think i'll do at least 8gb or 16gb for front0, maybe even one or two larger
+[20:24:19] <bandali> and for live0 probably the same as last year, maybe slightly larger
+*** CANCELLED Check fps after resize :sachac:
+CLOSED: [2022-12-02 Fri 09:06] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:CREATED: [2022-12-02 Fri 07:27]
+:END:
+*** DONE Back up dumps from live0
+CLOSED: [2022-12-02 Fri 11:05]
+media.emacsconf.org:~/emacsconf-2021-stream-dumps/
+res.emacsconf.org:/data/emacsconf/2021/dumps/
+
+Now there should be more space in case we want to enable dumping before the resize
+
+*** DONE [#A] Update ansible configuration :sachac:
+CLOSED: [2022-12-02 Fri 19:30] SCHEDULED: <2022-12-02 Fri>
+:PROPERTIES:
+:Effort: 0:30
+:END:
+:LOGBOOK:
+CLOCK: [2022-12-02 Fri 15:59]--[2022-12-02 Fri 18:58] => 2:59
+:END:
+Waiting for resize
+Clean up the media root
+
+in all.yml
+
+test_mode: false
+
+then
+
+ansible-playbook -i inventory.yml prod-playbook.yml --tags media
+ansible-playbook -i inventory.yml prod-playbook.yml --tags stream
+ansible-playbook -i inventory.yml prod-playbook.yml --tags publish
+
+Confirm that
+- icecast dumps recordings
+- https://media.emacsconf.org/2022 is unprotected
+- https://media.emacsconf.org/2022/backstage is protected
+
+* Communications
+:PROPERTIES:
+:CUSTOM_ID: comms
+:END:
+** DONE Ask emacsconf-org-private for feedback on early submissions
+
+The EmacsConf 2022 CFP was extended to Sept 30 with notifications to
+go out on Oct 15. We've got plenty of submissions and with any luck,
+you've been reviewing them as they come in (assuming you have access to
+emacsconf-submit@).
+
+As a courtesy to people who got their stuff together in a timely manner
+and to give them extra time to prepare a prerecorded talk (which might
+also translate into extra time for us to process and caption the talks),
+I'd like to send acceptances and tentative time allotments by Sept 30.
+I plan to offer a max of 20 minutes with a note that additional time may
+be available for Q&A depending on how many additional submissions we get.
+
+Could everyone who wants a say in the program please add comments to
+$url by **Sept 26** so that we can send out early acceptances? In
+general, we try to say yes to everything, so here's your chance to
+raise any red flags or suggest ways to make things even better.
+Thanks!
+
+Sacha
+
+** DONE Acceptance :sachac:
+CLOSED: [2022-09-30 Fri 18:13] DEADLINE: <2022-09-30 Fri>
+:PROPERTIES:
+:CUSTOM_ID: acceptance
+:END:
+
+We can accept early or send people a note saying notification of acceptance will be on Oct 15, because of the extended CFP.
+Right before this e-mail:
+
+- Publish the wiki pages
+
+Objectives for this e-mail:
+
+- Notify people of acceptance
+- Tell them the number of minutes to plan for* (might get more)
+- Tell them about the target date
+- Get them to reply
+- Ask for public contact information or any changes to the wiki page
+
+#+begin_src emacs-lisp
+
+(defun emacsconf-draft-acceptance-for-email-group (group &optional template)
+ "GROUP is (email . (talk talk))."
+ (interactive (list (emacsconf-mail-complete-email-group)))
+ (let* ((template (or template (emacsconf-mail-merge-get-template "acceptance")))
+ (talks (cdr group))
+ (first (car talks))
+ (reply-by-date (date-to-time "2022-10-08"))
+ (prerec-target (date-to-time "2022-11-04"))
+ (attrs `(:speakers-short
+ ,(plist-get first :speakers-short)
+ :plural
+ ,(if (= (length talks) 1) "" "s")
+ :email
+ ,(plist-get first :email)
+ :year
+ ,(or (plist-get first :year) emacsconf-year)
+ :reply-date
+ ,(format-time-string "%b %-e (%a)" reply-by-date)
+ :titles
+ ,(mapconcat (lambda (o) (format "\"%s\" (%s)"
+ (plist-get o :title)
+ (plist-get o :slug)))
+ talks " and ")
+ :prerec-target
+ ,(format-time-string "%b %-e (%a)" prerec-target)
+ :page-urls
+ ,(mapconcat (lambda (o) (concat "- " (plist-get o :url)))
+ talks "\n")
+ :irc
+ ,(if (plist-get first :irc) (concat (plist-get first :irc) "? ") "")
+ :acceptance-tasks
+ ,(concat
+ "* TODO Reply to acceptance e-mail in order to confirm e-mail communication :emacsconf:
+ DEADLINE: " (format-time-string "<%Y-%m-%d %a>" reply-by-date) "\n Please include any extra information you want (ex: public e-mail, IRC nick) on\n"
+(mapconcat (lambda (o) (concat " " (plist-get o :url)))
+ talks "\n") "\n"
+(mapconcat (lambda (o) (format "* TODO Record %s-minute talk for \"%s\" (%s) :emacsconf:
+ DEADLINE: %s\n https://emacsconf.org/%s/prepare/"
+ (plist-get o :time)
+ (plist-get o :title)
+ (plist-get o :slug)
+ (format-time-string "<%Y-%m-%d %a>" prerec-target)
+ (plist-get o :year)))
+ talks "\n"))
+ :talk-details-and-comments
+ ,(mapconcat
+ (lambda (o)
+ (format "%s minutes: %s\n%s\n\n%s"
+ (plist-get o :time)
+ (plist-get o :title)
+ (plist-get o :url)
+ (string-fill (emacsconf-replace-plist-in-string
+ (append o
+ (list
+ :prerec-target (format-time-string "%b %-e" prerec-target)))
+ (plist-get o :acceptance-comment)) 72)))
+ talks "\n---------------------------------------------------------------------\n"))))
+ (emacsconf-mail-prepare template (car group) attrs)))
+
+(defun emacsconf-draft-all-acceptances ()
+ (interactive)
+ (let* ((emacsconf-talk-info-functions (append emacsconf-talk-info-functions '(emacsconf-get-talk-comments-from-subtree)))
+ (info (seq-filter (lambda (o) (string= (plist-get o :status) "TO_ACCEPT"))
+ (emacsconf-filter-talks (emacsconf-get-talk-info))))
+ (grouped (seq-group-by (lambda (o) (plist-get o :email)) info))
+ (template (emacsconf-mail-merge-get-template "acceptance")))
+ (mapc (lambda (group)
+ (emacsconf-draft-acceptance-for-email-group group template))
+ grouped)))
+
+#+end_src
+*** Speaker acceptance
+:PROPERTIES:
+:SUBJECT: EmacsConf ${year} acceptance${plural}: ${titles}
+:EMAIL_ID: acceptance
+:MAIL_FOLLOWUP_TO: emacsconf-submit@gnu.org, ${email}
+:REPLY_TO: emacsconf-submit@gnu.org, ${email}
+:CC: emacsconf-submit@gnu.org
+:END:
+Hi, ${speakers-short}!
+
+Summary:
+,${acceptance-tasks}
+
+We've accepted your EmacsConf proposal${plural} for ${titles}! Thanks
+for volunteering to share what you're learning about. I know it takes
+a fair bit of work to prepare a presentation, so I appreciate that
+you're taking the time to show what's possible with Emacs and
+encourage people to learn more.
+
+---------------------------------------------------------------------
+${talk-details-and-comments}
+---------------------------------------------------------------------
+
+You'll have some time after your talk${plural} for Q&A, so the allocated time
+can be just for your pre-recorded talk${plural}. Of course, if you like, you
+can make it shorter.
+
+We've posted preparation tips at https://emacsconf.org/${year}/prepare/ .
+We'll send you instructions on how to upload files once we get that
+set up.
+
+Could you please plan to **put your pre-rec${plural} together by
+${prerec-target}** (or even earlier if you want)? We're going to try
+to caption as many talks as possible again this year, and extra time
+helps a lot. People found the captions really helpful while watching
+the stream, and sending your talk in early will make it more likely
+that we'll be able to get your captions edited and reviewed before the
+conference.
+
+**Please reply to this e-mail by ${reply-date}** (doublechecking that
+emacsconf-submit@gnu.org is in the To: or Cc:) so that we can confirm
+that we've got the right email address for you and that messages can
+get properly delivered. Also, would you like us to put ${email} as the
+public contact information for you, or would you like us to add
+something else to the talk page${plural}?
+
+${page-urls}
+
+If you have any questions, please e-mail us at
+emacsconf-submit@gnu.org or pass by the #emacsconf-org IRC channel on
+irc.libera.chat (Web-based: https://chat.emacsconf.org/#/connect).
+
+Thank you so much!
+
+Sacha Chua
+
+** Future
+*** Captions for approval
+
+**** Template
+:PROPERTIES:
+:SUBJECT: EmacsConf ${year}: Captions for ${title}
+:TO: ${email}
+:CC: ${captioner-email}, emacsconf-submit@gnu.org
+:REPLY_TO: ${email}, ${captioner-email}, emacsconf-submit@gnu.org
+:EMAIL_ID: captions
+:CUSTOM_ID: approve-captions
+:END:
+
+Hi ${speakers-short}!
+
+Because you sent in your video before the conference, we were able to
+caption it so that more people can find and enjoy your talk.
+${captioner-volunteered} 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. You can look at the attached file or watch
+your video with closed captions at ${url} . I've also included the
+captions at the end of this e-mail for your convenience.${wrap}
+
+${chapters-note}${intro-note}Do you have a bio or social/donation links you'd like us
+to add to the wiki page for your talk?
+
+Thanks again for your contribution!
+
+${captioner-thanks}Sacha
+
+${captions}
+
+*** Speakers we haven't confirmed e-mail communications with
+Hi, ${name}!
+
+I think we haven't heard from you since we accepted your EmacsConf
+${year} proposal for "${title}". EmacsConf coming up soon, 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? No worries if other priorities have come up
+and you don't have the time for a presentation.
+
+If you've been working on a presentation, fantastic! When you're
+ready, you can upload it following the instructions at
+https://emacsconf.org/${year}/prepare/ (ideally before ${prerec-date} so
+that we have time to download it, doublecheck, etc.).
+
+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 ${date}.* 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 ${time} 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 ${date}!
+
+Sacha Chua
+
+(Please use Reply to All to keep emacsconf-submit@gnu.org in the loop. Thanks!)
+
+*** Speakers who are missing prerecs
+#+begin_src emacs-lisp :eval no :tangle no
+(let ((template (conf-mail-merge-get-template "missing")))
+ (seq-map
+ (lambda (info)
+ (compose-mail (plist-get info :email)
+ (conf-replace-plist-in-string info (plist-get template :subject))
+ `(("Reply-To" . ,(plist-get template :reply-to))
+ ("Mail-Followup-To" . ,(plist-get template :mail-followup-to))
+ ("Cc" . ,(plist-get template :cc))))
+ (message-goto-body)
+ (insert (conf-replace-plist-in-string info (plist-get template :body)))
+ (plist-get info :email))
+ (mapcar 'cadr
+ (seq-group-by (lambda (o) (plist-get o :email))
+ (seq-filter (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC"))
+ (conf-get-talk-info))))))
+#+end_src
+
+**** Template
+:PROPERTIES:
+:SUBJECT: [need answer by Friday noon EST] EmacsConf ${year}: Don't have a prerec from you yet, aaah!
+:EMAIL_ID: missing
+:END:
+
+Hi ${speakers},
+
+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/${year}/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;
+ - 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/${year}/speakers .
+ We keep adapting the schedule as things come up, so please check
+ https://emacsconf.org/${year}/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 ${time} 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
+
+*** Last email before the conference
+#+begin_quote
+Friends, emacsians, hackers, lend me your ears!
+
+This is it, the final stretch until the next EmacsConf. A couple of weeks
+ago, we’ve shared our program with you; now, it is time for us to share our
+schedule, i.e. when the talks will happen!
+
+You can find it on our wiki:
+https://emacsconf.org/$year/schedule/
+
+All the times on the program are listed in EST (UTC-5). If a talk catches
+your eye, we invite you to click on its title to find out at what time it will
+be broadcast in your local time. Also, if the talk is pre-recorded, it will
+also be the time at which the talk will be made available on the same page.
+#+end_quote
+
+
+*** Thank you, next steps
+:PROPERTIES:
+:CUSTOM_ID: thanks
+:END:
+**** Code
+
+
+#+begin_src emacs-lisp
+(defun conf-mail-thanks-after-conference ()
+ (interactive)
+ (let* ((template (conf-mail-merge-get-template "speaker-thanks"))
+ (info (conf-get-talk-info-for-subtree)))
+ (compose-mail (plist-get info :email)
+ (conf-replace-plist-in-string
+ info (plist-get template :subject)))
+ (message-goto-body)
+ (save-excursion
+ (insert
+ (string-trim
+ (conf-replace-plist-in-string
+ (append
+ (list :subtitle-note
+ (if (file-exists-p (expand-file-name (format "%s/captions/%s--main.vtt"
+ (plist-get info :year)
+ (plist-get info :video-slug)) conf-directory))
+ "You can add the subtitles by downloading them from the talk page and uploading them to your video. "
+ "We didn't quite manage to squeeze in captions for your talk during the conference, but we'll work on those soon.")
+ :qa-note
+ (if (plist-get info :qa-public)
+ "The recording of your Q&A session is also on the talk page. "
+ "")
+ )
+ info)
+ (plist-get template :body)))))))
+#+end_src
+
+#+RESULTS:
+:results:
+conf-mail-thanks-after-conference
+:end:
+
+
+**** Text
+:PROPERTIES:
+:EMAIL_ID: speaker-thanks
+:SUBJECT: Thanks for speaking at EmacsConf ${year}! Prerec for ${title} up on page, YouTube, Toobnix
+:END:
+
+Hi ${speakers-short}!
+
+Thank you so much for being part of EmacsConf ${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. ${qa-note}
+
+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.
+${subtitle-note} 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 comments
+on videos.
+
+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!
+
+Sacha
+** Archive
+*** DONE Second announcement: CFP
+:PROPERTIES:
+:SUBJECT: [ANN] EmacsConf 2022 Second Call for Participation (extended until Sep 30)
+:END:
+:LOGBOOK:
+- Note taken on [2022-09-18 Sun 13:29] \\
+ Sent by bandali to emacsconf-discuss@gnu.org, emacs-devel@gnu.org, emacs-orgmode@gnu.org, emacs-tangents@gnu.org
+:END:
+
+Dear fellow Emacsians,
+
+This is the second and final Call for Participation for EmacsConf 2022
+now extended until September 30, and the conference itself planned for
+December 3 and 4 (Sat-Sun). Please see the CFP below for details on
+how to send in your proposal(s), or chat with us about them and about
+other ways of participating and volunteering around EmacsConf via our
+main IRC channel #emacsconf on the Libera.Chat network.
+
+If you're considering submitting a proposal but think the remaining
+time may not be enough, please reach out to me off-list as soon as
+possible so we could work something out.
+
+I'll close this portion of the email with a thank you to all of the
+folks who have submitted session proposals or expressed interest in
+volunteering with EmacsConf. We look forward to reading and reviewing
+all of your messages and proposals, and getting back to you about them
+and about the next steps soon. :-)
+
+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 on this message. Thank you.
+*** DONE First announcement: CFP
+:PROPERTIES:
+:SUBJECT: [ANN] EmacsConf 2022 Second Call for Participation (extended until Sep 30)
+:END:
+:LOGBOOK:
+- Note taken on [2022-07-17 Sun 22:00] \\
+ Sent by bandali to emacsconf-discuss@gnu.org, emacs-devel@gnu.org, emacs-orgmode@gnu.org, emacs-tangents@gnu.org
+:END:
+
+Dear fellow Emacsians,
+
+We are excitedly calling for your participation for EmacsConf 2022,
+planned for December 3 and 4, 2022 (Sat-Sun)! The CFP will be open
+until September 18. Please see below for details on how to send in
+your proposal(s), or chat with us about them and about other ways of
+participating and volunteering around EmacsConf via our main IRC
+channel #emacsconf on the Libera.Chat network.
+
+As an entirely volunteer-run conference we are always looking for more
+volunteers and organizers to help with various aspects of organizing
+and running the conference, including reviewing session proposals and
+streaming parallel tracks. To get involved, please come by our IRC
+channel or one of our public mailing lists (see below) and introduce
+yourself and tell us about your interests, or contact myself or one of
+the other organizers directly if you're feeling a bit shy; we hope to
+hear from you! :)
+
+Best,
+amin
+
+P.S. please direct any replies for this message either to me or to the
+emacsconf-discuss list, so as to help avoid generating extra off-topic
+chatter in the other lists Cc'd on this message. Thank you.
+
+* Supporting code
+:PROPERTIES:
+:CUSTOM_ID: code
+:END:
+** General
+#+name: general-setup
+#+begin_src emacs-lisp
+(defvar emacsconf-danger-allow-dangerous-stuff nil
+ "When non-nil, trade safety for convenience.")
+
+(defvar emacsconf-danger-asked nil
+ "When non-nil, user has already been asked for security trade-off.")
+
+(defun emacsconf-danger--ask (forms)
+ "Ask to run dangerous FORMS.
+Return t if the answer is “yes”."
+ (when (y-or-n-p (format "FORMS:\n%s\n\nThis is dangerous. Run anyway? "
+ (prin1-to-string forms)))
+ (unless emacsconf-danger-asked
+ (if (y-or-n-p "Would you like to trade security for convenience for the rest of the session? ")
+ (setq-local emacsconf-danger-allow-dangerous-stuff t)
+ (setq-local emacsconf-danger-asked t)))
+ t))
+
+(defmacro emacsconf-danger--shield (error &rest forms)
+ "Protect user from dangerous FORMS.
+Throw an error if ERROR is non-nil, skip otherwise."
+ `(let ((shield (not (or emacsconf-danger-allow-dangerous-stuff
+ (emacsconf-danger--ask ',@forms)))))
+ (if shield
+ ,(when error
+ '(user-error "Dangerous action cancelled by user"))
+ ,@forms)))
+
+(defmacro emacsconf-danger-shield (&rest forms)
+ "Protect user from dangerous FORMS by throwing an ERROR."
+ `(emacsconf-danger--shield t ,@forms))
+
+(defmacro emacsconf-danger-skip (&rest forms)
+ "Protect user from dangerous FORMS by skipping them."
+ `(emacsconf-danger--shield nil ,@forms))
+
+;; Make it easy to jump and refile
+(setq-local org-refile-targets '((nil . (:maxlevel . 5))))
+
+(message "General setup has been loaded")
+#+end_src
+
+#+name: elisp-no-confirmation
+#+begin_src emacs-lisp
+(emacsconf-danger-shield
+ (setq-local org-confirm-babel-evaluate nil
+ org-confirm-elisp-link-function nil))
+(message "No longer asking for confirmation in this buffer")
+#+end_src
+
+#+name: i-like-danger
+#+begin_src emacs-lisp
+(setq-local emacsconf-danger-allow-dangerous-stuff t)
+(org-babel-ref-resolve "elisp-no-confirmation()")
+
+(message "Now allowing dangerous stuff. Buckle up, buckaroo!")
+#+end_src
+
+#+name: back-to-safety
+#+begin_src emacs-lisp
+(kill-local-variable 'emacsconf-danger-allow-dangerous-stuff)
+(kill-local-variable 'emacsconf-danger-asked)
+(kill-local-variable 'org-confirm-babel-evaluate)
+(kill-local-variable 'org-confirm-elisp-link-function)
+(kill-local-variable 'org-refile-targets)
+
+(message "Back to safety. Phew!")
+#+end_src
+** Prerecs
+*** Receive notification when new prerecs are available
+#+begin_src sh :eval no :tangle prerecs-check-new.sh
+#!/usr/bin/env sh
+
+set -eu
+
+sleep_duration=600
+
+data="$(basename "$0" ".sh").data"
+
+plural () {
+ if [ "$2" = 1 ] || [ "$2" = -1 ]; then
+ echo "${1}"
+ else
+ case $1 in
+ "is" )
+ echo "are"
+ ;;
+ * )
+ echo "${1}s"
+ esac
+ fi
+}
+
+current_time() {
+ date +"[%T]"
+}
+
+log() {
+ printf "%s $1\n" "$(current_time)"
+}
+
+color_green="\e[32m"
+color_white="\e[0m"
+
+log2() {
+ log "${color_green}$1${color_white}"
+}
+
+notify() {
+ log2 "$1"
+ notify-send -t 0 "EmacsConf" "$(log "$1")"
+}
+
+_sleep() {
+ log "Checking again in ${sleep_duration}s"
+ sleep "$sleep_duration"
+}
+
+fetch() {
+ TERM=xterm ssh orga@media.emacsconf.org -- ls -1 /srv/upload | wc -l
+}
+
+clean() {
+ rm -f "$data"
+ log "Data file has been cleaned"
+}
+
+if [ "$#" -gt 0 ]; then
+ command="$1"
+ if [ "$command" = "clean" ]; then
+ clean
+ exit 0
+ fi
+
+ if [ "$command" = "clean-start" ]; then
+ clean
+ fi
+fi
+
+touch "$data"
+
+log2 "Currently waiting for prerec"
+
+while true; do
+ prerecs_number_past=$(cat "$data")
+ diff=0
+
+ while true; do
+ log "Checking..."
+ prerecs_number_current="$(fetch)"
+ diff=$((prerecs_number_current - prerecs_number_past))
+ if [ $diff -gt 0 ]; then
+ break
+ fi
+ log "No new prerec"
+ _sleep
+ done
+
+ notify "$diff new $(plural "prerec" $diff) $(plural "is" $diff) available!"
+
+ echo "$prerecs_number_current" > "$data"
+
+ _sleep
+done
+#+end_src
+*** Fetch upload data
+#+begin_src sh :eval no :tangle prerecs-fetch-upload-data.sh
+#!/usr/bin/env sh
+
+set -eu
+
+current_time() {
+ date +"[%T]"
+}
+
+log() {
+ printf "%s $1\n" "$(current_time)"
+}
+
+if [ -t 0 ]; then
+ log "Fetching data..."
+fi
+
+TERM=xterm ssh orga@media.emacsconf.org -- cat /srv/upload/*/*json
+#+end_src
+*** Fetch new talk data formatted
+#+begin_src sh :eval no :tangle prerecs-fetch-new.sh
+#!/usr/bin/env sh
+
+set -eu
+
+echo "Fetching data..."
+data_raw="$(./fetch-upload-data.sh)"
+
+echo
+
+echo "$data_raw" | awk "$(cat << EOF
+func dewrap(a) {gsub(/^ *".*": "|",$/, "", a); return a};
+BEGIN {i=0};
+/^ "sid"/ { a[0] = dewrap(\$0); };
+/^ "name"/ { a[2] = sprintf("%s\t", dewrap(\$0)) };
+/^ "comment"/ { a[3] = sprintf("%s\t", dewrap(\$0)); if (a[3] == "\t"){a[3] = "No comment"} };
+/^ "key"/ { a[1] = dewrap(\$0); };
+/^\}/ { printf "[%d]\t%s\t%s\t%s\n\t%s\n\n", i, a[0], a[1], a[2], a[3]; i=i+1};
+EOF
+ )"
+#+end_src
+** Publish this page
+#+begin_src emacs-lisp
+(defun emacsconf-org-publish-this-page ()
+ (interactive)
+ (org-md-export-to-markdown)
+ (org-babel-tangle)
+ (magit-stage-modified)
+ (magit-commit-create (list "-m" (read-string "Commit message: ")))
+ (call-interactively #'magit-push-current-to-pushremote))
+#+end_src
+
+*** Export to markdown
+
+#+name: md-export-on-save-setup
+#+begin_src emacs-lisp
+(defun emacsconf-export-md-on-save ()
+ "Export markdown on save.
+Meant to be used with `after-save-hook'."
+ (org-md-export-to-markdown)
+ (org-babel-tangle))
+
+(defvar emacsconf-export-md-on-save-configured t
+ "Non-nil when the setup code-block has been executed.")
+#+end_src
+
+#+name: md-export-on-save-toggle-on
+#+begin_src emacs-lisp
+(unless (bound-and-true-p emacsconf-export-md-on-save-configured)
+ (org-babel-ref-resolve "md-export-on-save-setup()"))
+
+(add-hook 'after-save-hook #'emacsconf-export-md-on-save nil t)
+
+(when (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is active"))
+#+end_src
+
+#+name: md-export-on-save-toggle-off
+#+begin_src emacs-lisp
+(remove-hook 'after-save-hook #'emacsconf-export-md-on-save t)
+
+(unless (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is no longer active"))
+#+end_src
+
+** Tangle and publish on save
+#+name: md-export-on-save-setup
+#+begin_src emacs-lisp :eval query
+(defun emacsconf-export-md-on-save ()
+ "Export markdown on save.
+Meant to be used with `after-save-hook'."
+ (org-md-export-to-markdown)
+ (org-babel-tangle))
+
+(defvar emacsconf-export-md-on-save-configured t
+ "Non-nil when the setup code-block has been executed.")
+#+end_src
+
+#+name: md-export-on-save-toggle-on
+#+BEGIN_SRC emacs-lisp :eval query
+(unless (bound-and-true-p emacsconf-export-md-on-save-configured)
+ (org-babel-ref-resolve "md-export-on-save-setup()"))
+
+(add-hook 'after-save-hook #'emacsconf-export-md-on-save nil t)
+
+(when (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is active"))
+#+END_SRC
+
+#+name: md-export-on-save-toggle-off
+#+begin_src emacs-lisp :eval query :outputs none
+(remove-hook 'after-save-hook #'emacsconf-export-md-on-save t)
+
+(unless (memq #'emacsconf-export-md-on-save after-save-hook)
+ (message "Hook is no longer active"))
+#+end_src
+** Review agenda
+#+begin_src emacs-lisp :results silent
+(defcustom emacsconf-org-tag nil "Tag for your nick, for easier agenda filtering"
+ :group 'emacsconf
+ :type 'string)
+#+end_src
+#+begin_src emacs-lisp :results silent
+(defun emacsconf-show-my-agenda ()
+ (interactive)
+ (let* ((org-agenda-files (list (buffer-file-name)))
+ (tag-filter (if emacsconf-org-tag (concat "+" emacsconf-org-tag) ""))
+ (org-agenda-tag-filter-preset (list (when emacsconf-org-tag (concat "+" emacsconf-org-tag))))
+ (org-agenda-custom-commands `(("a" "Agenda"
+ ((agenda ,tag-filter)
+ (tags-todo ,(concat tag-filter "-SCHEDULED={.+}-DEADLINE={.+}")))
+ ((org-agenda-span 14))))))
+ (org-agenda nil "a")))
+ #+end_src
+
+** Process review comments from pad
+see emacsconf-import-comments-from-etherpad-text
+
+* Lessons learned
+:PROPERTIES:
+:CUSTOM_ID: lessons
+:END:
+** From previous years
+- [X] Shorter CFP, longer recording time
+- [X] Ask for talk title to be subject in submission
+- [X] Fresh eyes can doublecheck that all the talks are included and that availability properties have been set/followed
+- [X] Putting ‘availability’ towards the top of the submission template would make it harder for us to miss it during reviews, and it shouldn’t change anything for speakers.
+- [X] All the personalised messages we’ve sent during the scheduling campaign should probably be kept in a repo so that it’s less work for those who will be in charge of it next.
+- [X] Since people kept running into ftp problems, we might want to set up a web-frontend next year to minimise problems.
+- [X] Might be a good idea to avoid Thanksgiving weekend, as lots of people travel then
+- [X] Tech-checks haven’t been really popular this year, but there are so many ways we could make them more useful. On the [2021-11-16 Tue], 10 days prior the conf, we thought that it could be nice to use them as recording sessions for late-prerecs, and that’s only one example.
+- [X] Having the NO_NEWS / WAITING_FOR_PREREC contrast from the start of ~conf.org~ might have made it easier for us to ping speakers who were late to the party this year. Rather than sending the personalised 10 days prior to the conference, we might have sent it a week after the submission of the anticipated scheduled (where we ask speakers if their allocated time is okay, based on their availability).
+- [X] Move first dry run earlier (maybe one month before?) to give us more time for process tweaks
+- [ ] Dropping talks one week before the conf might allow us to have a near-fixed schedule to announce early.
+ - or we can plan for live or gaps, that's cool too
+- [ ] CRM
+ - [ ] zaeph: Implementing a variable for ~automatic-emails~ would make it easier to suppress user-hooks for message-mode
+ - [ ]zaeph: Even though we’re sending emails automatically, we might want to keep trace of them in our ~Sent~ IMAP folder. notmuch does it with ~Fcc:~ in the header, so we might need a user-customisable var here as well.
+- [ ] less tiring lighting
+- [ ] split host and streamer?
+- [ ] Cram less with different tracks
+- [ ] Review pre-recs, even late submissions in their entirety to ensure no syncing issue
+- [ ] Tight opening-remarks, possible pre-rec.
+- [X] Asking pronunciation of name as soon as application with SA-cha CHEW-ah pattern would be good. Not a lot of diligence with it this year.
+- [ ] People need to specify their IRC handle on application (potentially forcing nick and/or first-name/last-name.
+ - suggested, but not everyone has IRC, so that's okay. We'll manage. Walk new speakers through it?
+- [ ] We might want to figure out an ffmpeg workflow for noise-suppressing on top of normalisation. Take inspiration from Audacity macros.
+- [ ] Having a more relaxed Saturday might give us time to adjust to tech-stack.
+- [X] Creating BBB rooms in anticipation and/or automatically, before or during, might make for smoother check-in; right now, people keep wanting to check in via email even though we told them to use chat
+ - One BBB room per talk
+- [ ] Pre-recs were a little blocky wrt encoding; we might want to bump the bitrate next year
+- [ ] we can see if bot + pads + merging will help next year, and we can also experiment with multiple streams if there are enough people to pull it off so that speakers don't feel like they've just been dropped in a room and left to their own devices :)
+
+** Lessons learned for next year
+
+*** CFP & Review period
+
+- Ask for public e-mail or contact information, IRC handle in CFP
+- Be even more stringent about the 10/20/40-min splits. A lot of
+ speakers still default to the 20- or 40-min formats without
+ providing us shorter formats, and that puts strain on our schedule
+ and requires us to use a different template for the notification
+ (which can be confusing). We need to stress that not respecting the
+ format makes it harder not only for the organizers, but also for the
+ speakers themselves (since they will have to rethink their
+ presentation). Maybe we can have an e-mail template for a quick
+ reply that says something like "Just in case we need to squeeze
+ talks into shorter times, could you please also propose an outline
+ for a possible 10-minute talk that could get people interested in
+ your topic and point them to where they can find out more?"
+- Two people is the sweet number of reviewers to have for the
+ proposals before sending the notifications, and there’d be
+ diminishing returns with more. Two is enough to release the pressure
+ on SCHED, verify the metadata (esp. speaker availability), and
+ suggest a different ordering where appropriate. It can take a long
+ time to comb through the proposals (roughly 10 proposals per hour),
+ and whilst it’d be difficult to justify more in-depth reviewers,
+ other orgas can do a shallow-pass to catch red-flags or discuss the
+ submissions as they come in. Other organizers can always chime in on
+ topics they particularly care about so that their encouraging
+ comments or suggestions can be included in the acceptance e-mail.
+- We extended CFP-end by two weeks this year, but that made it coincide
+ with speaker-notifs, and that’s awkward. Next time, we should only
+ extend the CFP by one week to avoid having to scramble with the
+ schedule until the very last day.
+- Some people assume that they have to suggest longer formats even if
+ they intend their talks to be 10′ or 20′. We should change the
+ wording on the CFP to ask them to only provide alternatives for
+ shorter formats, not longer.
+- It was hard to squeeze all the org/hyperbole talk on day-1.
+ Generally, the people who submit these kinds of talk come from all
+ over the world, and US mornings are more accommodating than US
+ evenings when it comes to timezones. We might consider having two org
+ *mornings* rather than an org *day*; it would give us more flexibility
+ with those talks.
+- We’re starting to reach critical mass on the org-talks. We might want
+ to consider splitting the org-talks and the dev-talks into two
+ distinct events to allow them to grow independently.
+- We should associate time-of-day with CFP-deadline; otherwise, the
+ scheduler has to be on edge until the very end of the day. It’s worse
+ this year because we made CFP-end coincide with speaker-notif, so this
+ might not be as much of a problem next year.
+- It’s easier for us to extend beyond 5pm than to go before 9am
+ (especially for the West coast). Extending beyond 5pm puts strain on
+ European organizers and volunteers, though.
+- Sometimes, ikiwiki on front0 took a lot of time to process the new
+ commits. sachac assumed this is due to a faulty regex parsing. We
+ should be able to find out more by looking at the logs from ikiwiki
+ after a slow commit.
+- Ask for preferred timezone in CFP
+- Check with John Wiegley re: schedule - we always happen to coincide with his work trips
+
+*** When processing prerecs
+- We should flesh out the prepare.md section on audio-recording because
+ some speakers have annoying coil-whines when recording from their
+ laptop’s microphone which are particularly hard to remove. We should
+ ask speaker to record some silence, listen to it in isolation, and
+ gauge how silent it actually is. It’s not a biggie though, since we
+ can usually degrade the audio quality for the sake of removing the
+ noise.
+- We can ask for silence in a separate recording so that we don't have to worry about cutting it out.
+
+** Possible big projects for next year
+
+*** Prolog’ing the schedule
+
+*** Designing the EmacsConf suite (to make it easier for people other us to run their own versions)
+
+* COMMENT Copyright & License
+
+ Copyright (C) 2020-2022 Sacha Chua, Amin Bandali, Leo Vivier
+
+ The EmacsConf 2022 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.
+
+* COMMENT Local variables
+
diff --git a/2022/organizers-notebook/schedule.svg b/2022/organizers-notebook/schedule.svg
new file mode 100644
index 00000000..496bce92
--- /dev/null
+++ b/2022/organizers-notebook/schedule.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(36,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(83,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(114,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(193,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(240,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(405,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.8" width="23" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(460,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(531,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(601,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(664,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(742,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="50" opacity="0.8" width="23" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(115,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(162,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(209,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="50" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(240,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="50" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(413,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="50" opacity="0.8" width="62" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(514,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(578,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(624,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="50" opacity="0.8" width="47" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(711,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,100)"> <title> Schedule for Sunday</title> <rect width="800" height="100" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(5,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(38,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(67,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(126,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(169,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(216,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.8" width="47" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(421,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(491,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(554,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(632,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(679,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(711,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(750,48)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:02-10:27 rde Emacs introduction</title> <rect x="97" y="50" opacity="0.8" width="39" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(134,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="50" opacity="0.8" width="23" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(193,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(240,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="50" opacity="0.8" width="23" height="34" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(399,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="50" opacity="0.8" width="23" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(460,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(530,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="50" opacity="0.8" width="31" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(617,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="50" opacity="0.8" width="15" height="34" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(671,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="50" opacity="0.8" width="7" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(710,83)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="70"></line> <text fill="black" x="0" y="83" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg> \ No newline at end of file
diff --git a/2022/planning.md b/2022/planning.md
new file mode 100644
index 00000000..20560520
--- /dev/null
+++ b/2022/planning.md
@@ -0,0 +1,25 @@
+[[!meta title="Planning"]]
+[[!meta copyright="Copyright &copy; 2020, 2021, 2022 Amin Bandali"]]
+
+Most of the EmacsConf organizers and other volunteers hang out in the
+`#emacsconf` IRC channel on `irc.libera.chat`. If you would like to
+get involved, come by our `#emacsconf` channel and say hi!
+
+Besides IRC, the [emacsconf-org][emacsconf-org] public mailing list is
+the main medium of communication for the EmacsConf organizers.
+
+You can find most of the backstage notes in the
+[[organizers' notebook|organizers-notebook]].
+
+You might find it useful to also look at the plans and notes from
+previous years:
+
+- 2021: [[planning|2021/planning]],
+ [[organizers' notebook|2021/organizers-notebook]]
+- 2020: [[planning|2020/planning]],
+ [[organizers' notebook|2020/organizers-notebook]]
+- 2019: [[planning|2019/planning]],
+ [[organizers' notebook|2019/organizers-notebook]]
+
+
+[emacsconf-org]: https://lists.gnu.org/mailman/listinfo/emacsconf-org
diff --git a/2022/prepare.md b/2022/prepare.md
new file mode 100644
index 00000000..3ec8d713
--- /dev/null
+++ b/2022/prepare.md
@@ -0,0 +1,301 @@
+[[!meta title="Notes and tips on preparing your talk"]]
+[[!meta copyright="Copyright &copy; 2019, 2020 Amin Bandali<br />Copyright &copy; 2021, 2022 Amin Bandali, Sacha Chua, Leo Vivier"]]
+
+This page contains notes and tips for our speakers on preparing their
+talks and presentations. Please read through the list and consider it
+while preparing your talk. If you have any questions, concerns, or
+suggestions please feel free to write to one our organizational mailing
+lists: the public <emacsconf-org@gnu.org> list, or the private
+<emacsconf-org-private@gnu.org> list, depending on the nature of the
+matter you would like to discuss.
+
+Note: being part of a wiki, this page is subject to change (including
+by you!); so please check back every now and again for any changes and
+updates.
+
+[[Already done? Upload your video and other files|upload]]
+
+### Guidelines for conduct
+
+Please review our [[guidelines for conduct|conduct]] when preparing your
+talk to make sure we’re all on the same page and strive to make the
+event a great experience for all. If you’re not sure whether your talk
+or presentation style meets the guidelines laid out in the guidelines
+for conduct, we’d be happy to help. You can email Sacha Chua at
+<sacha@sachachua.com> to chat more about this.
+
+### Recording your talk
+
+To help EmacsConf 2022 run smoothly, please prerecord your talk, and
+plan to upload your video(s) by **November 4** to allow us enough time
+to do any needed processing (e.g. format or codec conversion) in
+preparation for the event. Please consider submitting a prerecording as
+early as possible so that we can see if volunteers can caption your
+video to make it more accessible and searchable.
+
+To make it easier for organizers and attendees to correctly pronounce
+your name, please start your video with something along the lines of:
+
+"Hi! I’m ${NAME} and I’ll be talking about ${TOPIC}."
+
+The talks will be broadcast with a resolution of **1280x720px**
+(720p). Please make sure your text will be easy to read at that size.
+[You can change the font-size in your Emacs](https://www.emacswiki.org/emacs/SetFonts#h5o-6).
+If you are capturing a single window, you can also resize it before
+you record.
+
+We recommend using **dark text on a light background** for your
+recording, as this can be easier to see especially for people who are
+visually impaired. Themes with more contrast are easier to read than
+low-contrast ones. If you use a dark theme with your Emacs, you can
+change to a lighter one with `M-x customize-theme` (look for those
+with a `-light` suffix). The `modus-themes-load-operandi` command from
+the `modus-themes` package can be a good option.
+
+Audio quality can go a long way in making your talk enjoyable to
+watch. Consider the background noise in the room that you are using to
+record, and see if you can temporarily turn off things for your
+recording. If you have a **headset or external microphone**, try recording
+the audio through that so that you can reduce the sound of the
+computer itself. If you have a smartphone, that might also be a good
+way to record audio that you can then combine with your video
+afterwards. Some people find that draping a blanket over their head
+(including the microphone under the blanket) can help reduce echo,
+which can be a good excuse to make a blanket fort. (It's for
+EmacsConf!)
+
+Please leave at least **5 seconds of quiet** at the end of your video.
+We can use it to try to process your video in order to reduce noise.
+
+Many speakers prefer to record and edit the audio until they're happy
+with how it fits in the time, and then add the slides or videos
+afterwards. It might be easier than trying to do both the audio and
+the video in one go.
+
+To record your video, you could use any of the following pieces of
+free software, depending on your needs:
+
+- [OBS](//obsproject.com)
+- [SimpleScreenRecorder](//www.maartenbaert.be/simplescreenrecorder/)
+- [vokoscreenNG](//linuxecke.volkoh.de/vokoscreen/vokoscreen.html)
+- [peek](//github.com/phw/peek)
+- [ffmpeg](//trac.ffmpeg.org/wiki/Capture/Desktop)
+
+If you decide to use OBS, please make sure to verify the window-capture
+options. Most notably, there is a “Swap red and blue” option that is
+necessary for some setup, and it's easy to miss it.
+
+You might find the following free software programs useful for editing
+your video recordings:
+
+- [Kdenlive](//kdenlive.org/en/)
+- [Blender](//www.blender.org)
+- [Pitivi](http://www.pitivi.org)
+
+Per GNU Project’s [Guide to
+Formats](//audio-video.gnu.org/docs/formatguide.html), we prefer to
+receive prerecorded videos in formats unencumbered by software patents,
+such as `video/webm` ([WebM](https://www.webmproject.org/)-encoded video
+files, with `.webm` file extension) and `video/ogg` (video files encoded
+with the Theora video codec, encapsulated in an Ogg transport layer,
+with `.ogg` or `.ogv` file extension). However, if for one reason or
+another you are unable to send us your prerecorded video in one of the
+above formats, you may submit them in other common formats, like MPEG-4
+(`.mp4`), and we will convert them to our preferred formats on your
+behalf.
+
+*Prepare recorded video in 720p (1280px by 720px) or higher, in the
+WebM format if possible.*
+
+# Compression
+
+If you would like to compress your video before uploading, the following shell script may be useful:
+
+ Q=32
+ CPU=8
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -an -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $CPU -g 240 -pass 1 -f webm -threads $CPU /dev/null &&
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a libopus -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $CPU -pass 2 -g 240 -threads $CPU "$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 these
+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>Sacha Chua</td>
+<td>&lt;<a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>&gt;</td>
+<td>sachac</td>
+<td>America/Toronto - usually Sat/Sun 8-10AM EDT</td>
+</tr>
+<tr>
+<td><strong>Want to 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> -->
+</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 2022!
+
+# Frequently-asked questions
+
+## Can I present live?
+
+Tech issues kept happening during EmacsConf 2020, so we’d really
+prefer that all talks have prerecorded videos. There will be time for
+live questions and answers, though, so if you can record a short video
+covering your main points, you might be able to go into more detail in
+live Q&A.
+
+## I have so much I want to share. Can I record a longer video?
+
+The conference program has so many interesting talks. We wish we
+could fit everything in at full length! (Maybe EmacsConf month?)
+Please think of your video as a short teaser that can get people
+interested and point them to where they can find out more. You can
+email <emacsconf-submit@gnu.org> links and other notes to add to the
+wiki page for your talk. If you’d like to record a longer video *in
+addition* to the short one for the main conference, please feel free
+to send us that too.
+
+Additionally, even though it is tempting, please refrain from
+fast-forwarding your recording to make it fit within the format; on top
+of being obvious, it hurts your intelligibility. Trimming out the
+silences and the filler words can help sometimes, but a better solution
+for you might be to write, record, and edit your voice-over; then, you
+can record your video to go along with it.
+
+As a last option, you may send some questions for the host to ask you
+during the Q&A so that you can address extra points that couldn’t make
+the cut.
+
+## I can’t figure out how to record the video. Can I just present the talk?
+
+We might be able to help you record your talk using the BigBlueButton
+web conferencing system before November 4. Please email
+<emacsconf-submit@gnu.org> with some times that might work for you and
+we’ll see if a volunteer can meet up with you to record it.
+
+## Do I need to follow some visual guidelines for the presentation?
+
+- Dark text on a light background is more legible than the opposite
+ (especially for people who are visually impaired), and more contrast
+ is better than a low-contrast theme. This stands for both your
+ slides and your Emacs theme.
+- If you think your fonts might be too small in your slides or in Emacs,
+ they might very well be. [You can change the font-size in your
+ Emacs](https://www.emacswiki.org/emacs/SetFonts#h5o-6), but you can
+ also play with the size of the captured window during your recording.
+- Try to minimize the screen-flashes that occur when you switch between
+ windows, especially if their themes do not cohere (light-to-dark and
+ the reverse). If you can edit your recording, fades and other
+ transitions are a neat solution to this problem.
+
+## How do I show my keystrokes on screen?
+
+In Emacs, you can use
+[interaction-log.el](https://github.com/michael-heerdegen/interaction-log.el)
+(in MELPA) to display the keystrokes and the commands they run in a separate
+buffer. For a system-wide solution, you can look into
+[screenkey](https://gitlab.com/screenkey/screenkey).
+
+## I’m not used to talking to myself. Can I present the talk to someone?
+
+We might be able to help you record your talk using the BigBlueButton
+web conferencing system before November 4. Please email
+<emacsconf-submit@gnu.org> with some times that might work for you and
+we’ll see if a volunteer can meet up with you to record it.
+
+## Can I see the other proposed talks?
+
+Once we’ve emailed all the speakers about their acceptance, we’ll put
+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.
+
+## What if there are lots of great questions during Q&A and we run out of time?
+
+You can continue answering questions on the collaborative pad or IRC,
+and we’ll copy questions and answers onto the wiki page afterwards so
+that you can answer them in your own time after the event.
+
+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?
+
+Please email <emacsconf-submit@gnu.org>. We’d love to hear from you.
+
+Thanks for contributing to EmacsConf 2022!
+
+<!-- <a name="tech-checklist"></a> -->
+<!-- #### Tech checklist -->
+
+<!-- - Can you speak and be heard? Is there echo? -->
+<!-- - Can you hear the organizer? -->
+<!-- - 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? -->
diff --git a/2022/qa.md b/2022/qa.md
new file mode 100644
index 00000000..559045a1
--- /dev/null
+++ b/2022/qa.md
@@ -0,0 +1,43 @@
+[[!meta title="Q&A participation"]]
+[[!meta copyright="Copyright &copy; 2022 Sacha Chua"]]
+
+# BigBlueButton
+
+## Notes for participants
+
+- You can ask questions via the text chat or by voice. Voice and webcam are totally optional.
+- Please stay muted until it's your turn.
+- To raise your hand:
+ 1. Open the participant list. If it's hidden, use the person icon in the top left.
+ 2. Click on your name.
+ 3. Click on **Set Status** - **Raise**.
+ You can lower your hand by clicking on your name and choosing **Clear Status**.
+- Headphone or earphones can help avoid audio feedback.
+- If performance is slow, please keep your webcam off.
+- The recording of this session will be posted on the talk page. We'll
+ also copy questions, answers, and notes from the text chat.
+ Everything will be shared under the Creative Commons
+ Attribution-ShareAlike 4.0 License.
+- If you can, please add questions, answers, and notes to the
+ Etherpad. The URL for the Etherpad is on the talk page.
+- Please follow <https://emacsconf.org/conduct> guidelines.
+- If something should be omitted from the recording, put a NOTE in the
+ chat and explain what the organizers should do.
+
+## Notes for the speaker
+
+- You can answer questions in whatever order you want.
+- You can skip questions or take your time to think about them.
+- Please read the questions out loud before answering. This makes it
+ easier to save the questions and answers afterwards.
+- We'll let you know when the stream is going to move on to the next
+ talk. Even after the streamer switches over to the next talk, you
+ can still stay and chat here for as long as you like. When you're
+ done, you can wrap up and leave.
+- If something should be omitted from the recording, put a NOTE in the
+ chat and explain what the organizers should do.
+
+# IRC
+
+- If you add "Q: " as a prefix when asking a question (ex: "Q: Could you please give more details on ..."), it will be easier for us to notice your question.
+- If you are discussing a previous talk after the next talk starts, you may want to add the talk ID to your message to make it clearer. (ex: "re:devel I think ...")
diff --git a/2022/schedule-2022-12-03.md b/2022/schedule-2022-12-03.md
new file mode 100644
index 00000000..7be2c17f
--- /dev/null
+++ b/2022/schedule-2022-12-03.md
@@ -0,0 +1 @@
+<div class="schedule-svg-container"><svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg></div> \ No newline at end of file
diff --git a/2022/schedule-2022-12-04.md b/2022/schedule-2022-12-04.md
new file mode 100644
index 00000000..201fad8b
--- /dev/null
+++ b/2022/schedule-2022-12-04.md
@@ -0,0 +1 @@
+<div class="schedule-svg-container"><svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg></div> \ No newline at end of file
diff --git a/2022/schedule-details.md b/2022/schedule-details.md
new file mode 100644
index 00000000..bec9803d
--- /dev/null
+++ b/2022/schedule-details.md
@@ -0,0 +1,54 @@
+Jump to: <a href="#date-2022-12-03">Sat Dec 3</a> - <a href="#date-2022-12-04">Sun Dec 4</a><a name="date-2022-12-03"></a>
+# Saturday Dec 3, 2022
+[[!inline pages="internal(2022/schedule-2022-12-03)" raw="yes"]]
+
+<div class="schedule" data-start="2022-12-03T14:00:00+0000" data-end="2022-12-03T22:30:00+0000" data-tracks="General,Development">
+[[!template id=sched q-and-a="""none""" pad="""https://pad.emacsconf.org/2022-sat-open""" startutc="""2022-12-03T14:00:00+0000""" endutc="""2022-12-03T14:05:00+0000""" start="""9:00""" end="""9:05""" title="""Saturday opening remarks""" url="""/2022/talks/sat-open""" speakers="""Sacha Chua""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""sat-open""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/journalism/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-journalism""" startutc="""2022-12-03T14:05:00+0000""" endutc="""2022-12-03T14:25:00+0000""" start="""9:05""" end="""9:25""" title="""Emacs journalism (or everything's a nail if you hit it with Emacs)""" url="""/2022/talks/journalism""" speakers="""Alfred Zanini""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""journalism""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: velocitatem</a>""" pad="""https://pad.emacsconf.org/2022-school""" startutc="""2022-12-03T14:45:00+0000""" endutc="""2022-12-03T14:55:00+0000""" start="""9:45""" end="""9:55""" title="""Back to school with Emacs""" url="""/2022/talks/school""" speakers="""Daniel Rösel""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""school""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: meain</a>""" pad="""https://pad.emacsconf.org/2022-treesitter""" startutc="""2022-12-03T15:00:00+0000""" endutc="""2022-12-03T15:15:00+0000""" start="""10:00""" end="""10:15""" title="""Tree-sitter beyond syntax highlighting""" url="""/2022/talks/treesitter""" speakers="""Abin Simon""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""treesitter""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/handwritten/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-handwritten""" startutc="""2022-12-03T15:05:00+0000""" endutc="""2022-12-03T15:15:00+0000""" start="""10:05""" end="""10:15""" title="""How to incorporate handwritten notes into Emacs Orgmode""" url="""/2022/talks/handwritten""" speakers="""Bala Ramadurai""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""handwritten""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: manateelazycat, matthewzmd</a>""" pad="""https://pad.emacsconf.org/2022-lspbridge""" startutc="""2022-12-03T15:25:00+0000""" endutc="""2022-12-03T15:45:00+0000""" start="""10:25""" end="""10:45""" title="""lsp-bridge: a smooth-as-butter asynchronous LSP client""" url="""/2022/talks/lspbridge""" speakers="""Andy Stewart, Matthew Zeng""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""lspbridge""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/science/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-science""" startutc="""2022-12-03T15:45:00+0000""" endutc="""2022-12-03T16:05:00+0000""" start="""10:45""" end="""11:05""" title="""Writing and organizing literature notes for scientific writing""" url="""/2022/talks/science""" speakers="""Vidianos Giannitsis""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""science""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/asmblox/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-asmblox""" startutc="""2022-12-03T15:55:00+0000""" endutc="""2022-12-03T16:15:00+0000""" start="""10:55""" end="""11:15""" title="""asm-blox: a game based on WebAssembly that no one asked for""" url="""/2022/talks/asmblox""" speakers="""Zachary Romero""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""asmblox""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen</a>""" pad="""https://pad.emacsconf.org/2022-buddy""" startutc="""2022-12-03T16:25:00+0000""" endutc="""2022-12-03T16:35:00+0000""" start="""11:25""" end="""11:35""" title="""The Emacs Buddy initiative""" url="""/2022/talks/buddy""" speakers="""Andrea""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""buddy""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/wayland/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-wayland""" startutc="""2022-12-03T16:25:00+0000""" endutc="""2022-12-03T16:35:00+0000""" start="""11:25""" end="""11:35""" title="""Emacs should become a Wayland compositor""" url="""/2022/talks/wayland""" speakers="""Michael Bauer""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""wayland""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/meetups/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-meetups""" startutc="""2022-12-03T18:00:00+0000""" endutc="""2022-12-03T18:20:00+0000""" start="""1:00""" end="""1:20""" title="""Attending and organizing Emacs meetups""" url="""/2022/talks/meetups""" speakers="""Bhavin Gandhi""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""meetups""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/sqlite/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-sqlite""" startutc="""2022-12-03T18:00:00+0000""" endutc="""2022-12-03T18:25:00+0000""" start="""1:00""" end="""1:25""" title="""Using SQLite as a data source: a framework and an example""" url="""/2022/talks/sqlite""" speakers="""Andrew Hyatt""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""sqlite""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/buttons/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-buttons""" startutc="""2022-12-03T18:40:00+0000""" endutc="""2022-12-03T18:55:00+0000""" start="""1:40""" end="""1:55""" title="""Linking personal info with Hyperbole implicit buttons""" url="""/2022/talks/buttons""" speakers="""Mats Lidell""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""buttons""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/mail/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-mail""" startutc="""2022-12-03T18:50:00+0000""" endutc="""2022-12-03T19:30:00+0000""" start="""1:50""" end="""2:30""" title="""Revisiting the anatomy of Emacs mail user agents""" url="""/2022/talks/mail""" speakers="""Mohsen BANAN""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""mail""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="nil">Etherpad</a>""" pad="""https://pad.emacsconf.org/2022-realestate""" startutc="""2022-12-03T19:15:00+0000""" endutc="""2022-12-03T19:40:00+0000""" start="""2:15""" end="""2:40""" title="""Real estate and Org table formulas""" url="""/2022/talks/realestate""" speakers="""Daniel Gopar""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""realestate""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/maint/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-maint""" startutc="""2022-12-03T19:50:00+0000""" endutc="""2022-12-03T20:10:00+0000""" start="""2:50""" end="""3:10""" title="""Maintaining the Maintainers: Attribution as an Economic Model for Open Source""" url="""/2022/talks/maint""" speakers="""Sid Kasivajhula""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""maint""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/health/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-health""" startutc="""2022-12-03T20:00:00+0000""" endutc="""2022-12-03T20:25:00+0000""" start="""3:00""" end="""3:25""" title="""Health data journaling and visualization with Org Mode and gnuplot""" url="""/2022/talks/health""" speakers="""David O'Toole""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""health""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a>""" pad="""https://pad.emacsconf.org/2022-eev""" startutc="""2022-12-03T20:35:00+0000""" endutc="""2022-12-03T20:40:00+0000""" start="""3:35""" end="""3:40""" title="""Bidirectional links with eev""" url="""/2022/talks/eev""" speakers="""Eduardo Ochs""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""eev""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/jupyter/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-jupyter""" startutc="""2022-12-03T20:45:00+0000""" endutc="""2022-12-03T21:05:00+0000""" start="""3:45""" end="""4:05""" title="""Edit live Jupyter notebook cells with Emacs""" url="""/2022/talks/jupyter""" speakers="""Blaine Mooers""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""jupyter""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/haskell/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-haskell""" startutc="""2022-12-03T21:05:00+0000""" endutc="""2022-12-03T21:35:00+0000""" start="""4:05""" end="""4:35""" title="""Haskell code exploration with Emacs""" url="""/2022/talks/haskell""" speakers="""Yuchen Pei""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""haskell""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""none""" pad="""https://pad.emacsconf.org/2022-sat-close""" startutc="""2022-12-03T21:50:00+0000""" endutc="""2022-12-03T21:55:00+0000""" start="""4:50""" end="""4:55""" title="""Saturday closing remarks""" url="""/2022/talks/sat-close""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""sat-close""" note=""""""]]</div>
+
+Jump to: <a href="#date-2022-12-03">Sat Dec 3</a> - <a href="#date-2022-12-04">Sun Dec 4</a><a name="date-2022-12-04"></a>
+# Sunday Dec 4, 2022
+[[!inline pages="internal(2022/schedule-2022-12-04)" raw="yes"]]
+
+<div class="schedule" data-start="2022-12-04T14:00:00+0000" data-end="2022-12-04T22:30:00+0000" data-tracks="General,Development">
+[[!template id=sched q-and-a="""none""" pad="""https://pad.emacsconf.org/2022-sun-open""" startutc="""2022-12-04T14:00:00+0000""" endutc="""2022-12-04T14:05:00+0000""" start="""9:00""" end="""9:05""" title="""Sunday opening remarks""" url="""/2022/talks/sun-open""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""sun-open""" note=""""""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: tecosaur</a>""" pad="""https://pad.emacsconf.org/2022-survey""" startutc="""2022-12-04T14:06:00+0000""" endutc="""2022-12-04T14:26:00+0000""" start="""9:06""" end="""9:26""" title="""Results of the 2022 Emacs Survey""" url="""/2022/talks/survey""" speakers="""Timothy""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""survey""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: tecosaur</a>""" pad="""https://pad.emacsconf.org/2022-orgyear""" startutc="""2022-12-04T14:35:00+0000""" endutc="""2022-12-04T14:45:00+0000""" start="""9:35""" end="""9:45""" title="""This Year in Org""" url="""/2022/talks/orgyear""" speakers="""Timothy""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""orgyear""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen</a>""" pad="""https://pad.emacsconf.org/2022-rolodex""" startutc="""2022-12-04T14:57:00+0000""" endutc="""2022-12-04T15:22:00+0000""" start="""9:57""" end="""10:22""" title="""Build a Zettelkasten with the Hyperbole Rolodex""" url="""/2022/talks/rolodex""" speakers="""Ramin Honary""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""rolodex""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/rde/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-rde""" startutc="""2022-12-04T15:00:00+0000""" endutc="""2022-12-04T15:25:00+0000""" start="""10:00""" end="""10:25""" title="""rde Emacs introduction""" url="""/2022/talks/rde""" speakers="""Andrew Tropin""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""rde""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/orgsuperlinks/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-orgsuperlinks""" startutc="""2022-12-04T15:40:00+0000""" endutc="""2022-12-04T15:50:00+0000""" start="""10:40""" end="""10:50""" title="""Linking headings with org-super-links (poor-man's Zettelkasten)""" url="""/2022/talks/orgsuperlinks""" speakers="""Karl Voit""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""orgsuperlinks""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a>""" pad="""https://pad.emacsconf.org/2022-justl""" startutc="""2022-12-04T15:50:00+0000""" endutc="""2022-12-04T16:05:00+0000""" start="""10:50""" end="""11:05""" title="""justl: Driving recipes within Emacs""" url="""/2022/talks/justl""" speakers="""Sibi Prabakaran""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""justl""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""none""" pad="""https://pad.emacsconf.org/2022-orgvm""" startutc="""2022-12-04T16:10:00+0000""" endutc="""2022-12-04T16:20:00+0000""" start="""11:10""" end="""11:20""" title="""orgvm: a simple HTTP server for org""" url="""/2022/talks/orgvm""" speakers="""Corwin Brust""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""orgvm""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">Moderated via Mumble, ask questions via pad or IRC</a>""" pad="""https://pad.emacsconf.org/2022-rms""" startutc="""2022-12-04T16:15:00+0000""" endutc="""2022-12-04T16:35:00+0000""" start="""11:15""" end="""11:35""" title="""What I'd like to see in Emacs""" url="""/2022/talks/rms""" speakers="""Richard M. Stallman""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""rms""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/hyperorg/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-hyperorg""" startutc="""2022-12-04T18:00:00+0000""" endutc="""2022-12-04T18:30:00+0000""" start="""1:00""" end="""1:30""" title="""Powerful productivity with Hyperbole and Org Mode""" url="""/2022/talks/hyperorg""" speakers="""Robert Weiner""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""hyperorg""" note="""video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/detached/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-detached""" startutc="""2022-12-04T18:01:00+0000""" endutc="""2022-12-04T18:16:00+0000""" start="""1:01""" end="""1:16""" title="""Getting detached from Emacs""" url="""/2022/talks/detached""" speakers="""Niklas Eklund""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""detached""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/eshell/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-eshell""" startutc="""2022-12-04T18:40:00+0000""" endutc="""2022-12-04T18:55:00+0000""" start="""1:40""" end="""1:55""" title="""Top 10 reasons why you should be using Eshell""" url="""/2022/talks/eshell""" speakers="""Howard Abrams""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""eshell""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/workflows/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-workflows""" startutc="""2022-12-04T18:50:00+0000""" endutc="""2022-12-04T19:15:00+0000""" start="""1:50""" end="""2:15""" title="""Org workflows for developers""" url="""/2022/talks/workflows""" speakers="""George Mauer""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""workflows""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/async/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-async""" startutc="""2022-12-04T19:20:00+0000""" endutc="""2022-12-04T19:40:00+0000""" start="""2:20""" end="""2:40""" title="""Emacs was async before async was cool""" url="""/2022/talks/async""" speakers="""Michael Herstine""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""async""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/grail/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-grail""" startutc="""2022-12-04T19:35:00+0000""" endutc="""2022-12-04T19:55:00+0000""" start="""2:35""" end="""2:55""" title="""GRAIL---A Generalized Representation and Aggregation of Information Layers""" url="""/2022/talks/grail""" speakers="""Sameer Pradhan""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""grail""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/dbus/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-dbus""" startutc="""2022-12-04T20:15:00+0000""" endutc="""2022-12-04T20:35:00+0000""" start="""3:15""" end="""3:35""" title="""The Wheels on D-Bus""" url="""/2022/talks/dbus""" speakers="""Ian Eure""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""dbus""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/indieweb/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-indieweb""" startutc="""2022-12-04T20:25:00+0000""" endutc="""2022-12-04T20:45:00+0000""" start="""3:25""" end="""3:45""" title="""Putting Org Mode on the Indieweb""" url="""/2022/talks/indieweb""" speakers="""Michael Herstine""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""indieweb""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/localizing/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-localizing""" startutc="""2022-12-04T21:00:00+0000""" endutc="""2022-12-04T21:10:00+0000""" start="""4:00""" end="""4:10""" title="""Pre-localizing Emacs""" url="""/2022/talks/localizing""" speakers="""Jean-Christophe Helary""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""localizing""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""none""" pad="""https://pad.emacsconf.org/2022-devel""" startutc="""2022-12-04T21:05:00+0000""" endutc="""2022-12-04T21:15:00+0000""" start="""4:05""" end="""4:15""" title="""Emacs development updates""" url="""/2022/talks/devel""" speakers="""John Wiegley""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""devel""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://emacsconf.org/current/fanfare/room/">BBB</a>""" pad="""https://pad.emacsconf.org/2022-fanfare""" startutc="""2022-12-04T21:25:00+0000""" endutc="""2022-12-04T21:35:00+0000""" start="""4:25""" end="""4:35""" title="""Fanfare for the Common Emacs User""" url="""/2022/talks/fanfare""" speakers="""John Cummings""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""fanfare""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a>""" pad="""https://pad.emacsconf.org/2022-python""" startutc="""2022-12-04T21:30:00+0000""" endutc="""2022-12-04T21:35:00+0000""" start="""4:30""" end="""4:35""" title="""Short hyperlinks to Python docs""" url="""/2022/talks/python""" speakers="""Eduardo Ochs""" track="""Development""" watch="""https://emacsconf.org/2022/watch/dev""" slug="""python""" note="""captioned, video posted"""]]
+[[!template id=sched q-and-a="""none""" pad="""https://pad.emacsconf.org/2022-sun-close""" startutc="""2022-12-04T21:50:00+0000""" endutc="""2022-12-04T22:00:00+0000""" start="""4:50""" end="""5:00""" title="""Sunday closing remarks""" url="""/2022/talks/sun-close""" track="""General""" watch="""https://emacsconf.org/2022/watch/gen""" slug="""sun-close""" note=""""""]]</div> \ No newline at end of file
diff --git a/2022/schedule-image.md b/2022/schedule-image.md
new file mode 100644
index 00000000..81ce8057
--- /dev/null
+++ b/2022/schedule-image.md
@@ -0,0 +1 @@
+<div class="schedule-svg-container"><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div> \ No newline at end of file
diff --git a/2022/schedule.svg b/2022/schedule.svg
new file mode 100644
index 00000000..9ec8717e
--- /dev/null
+++ b/2022/schedule.svg
@@ -0,0 +1 @@
+<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <title> Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs"> <title> Back to school with Emacs</title> <rect x="75" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(106,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <title> How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="125" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(139,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <title> Writing and organizing literature notes for scientific writing</title> <rect x="191" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(222,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <title> Attending and organizing Emacs meetups</title> <rect x="400" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(414,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative"> <title> The Emacs Buddy initiative</title> <rect x="450" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(464,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <title> The ship that builds itself: How we used Emacs to develop a workshop for communities</title> <rect x="483" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas"> <title> Real estate and Org table formulas</title> <rect x="583" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(614,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <title> Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <title> Edit live Jupyter notebook cells with Emacs</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <title> orgvm: a simple HTTP server for org</title> <rect x="750" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(764,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <title> Tree-sitter beyond syntax highlighting</title> <rect x="100" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(114,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <title> lsp-bridge: complete asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(164,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <title> asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="183" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(197,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <title> Emacs should become a Wayland compositor</title> <rect x="241" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(255,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <title> Using SQLite as a data source: a framework and an example</title> <rect x="400" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(431,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <title> Revisiting the anatomy of Emacs mail user agents</title> <rect x="475" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(523,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <title> Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="583" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(614,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev"> <title> Bidirectional links with eev</title> <rect x="658" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(664,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs"> <title> Short hyperlinks to Python docs</title> <rect x="683" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(689,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs"> <title> Haskell code exploration with Emacs</title> <rect x="708" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(756,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g> <g transform="translate(0,150)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <title> Results of the 2022 Emacs Survey</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org"> <title> This Year in Org</title> <rect x="58" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(72,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <title> Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="100" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(131,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <title> Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="166" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(180,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <title> Linking personal info with Hyperbole implicit buttons</title> <rect x="216" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(230,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <title> Powerful productivity with Hyperbole and Org Mode</title> <rect x="400" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(448,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers"> <title> Org workflows for developers</title> <rect x="483" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(514,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers"> <title> GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="550" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(581,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <title> Putting Org Mode on the Indieweb</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <title> Fanfare for the Common Emacs User</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction"> <title> rde Emacs introduction</title> <rect x="100" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs"> <title> justl: Driving recipes within Emacs</title> <rect x="175" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(189,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <title> Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="208" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(256,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs"> <title> Getting detached from Emacs</title> <rect x="400" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(414,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <title> Top 10 reasons why you should be using Eshell</title> <rect x="458" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(472,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool"> <title> Emacs was async before async was cool</title> <rect x="516" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(547,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus"> <title> The Wheels on D-Bus</title> <rect x="608" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(639,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs"> <title> Pre-localizing Emacs</title> <rect x="700" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(731,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g></svg> \ No newline at end of file
diff --git a/2022/sidebar.md b/2022/sidebar.md
new file mode 100644
index 00000000..8982f07b
--- /dev/null
+++ b/2022/sidebar.md
@@ -0,0 +1,11 @@
+<p>Welcome to...</p>
+<p class="center">[[!img /i/emacsconf-logo1-256.png alt="EmacsConf logo" size="72x" link=2022]]</p>
+<p class="center"><strong>[[EmacsConf 2022|2022]]</strong></p>
+
+---
+
+* [[Program|talks]]
+* [[Volunteer]]
+* [[Planning]]
+* [[Guidelines for Conduct|conduct]]
+* [[Contact information|contact]]
diff --git a/2022/speakers.md b/2022/speakers.md
new file mode 100644
index 00000000..9f8ffae7
--- /dev/null
+++ b/2022/speakers.md
@@ -0,0 +1,98 @@
+[[!meta title="Conference-day instructions for speakers"]]
+[[!meta copyright="Copyright &copy; 2021 Sacha Chua"]]
+
+# Before your talk
+
+Please check in at least 30 minutes before the start of your Q&A
+session if you have a prerecorded talk, or at least 60 minutes before
+the start of your talk if you are going to do it live. You can check
+in on IRC by joining the #emacsconf-org channel on libera.chat using
+your favorite IRC client or using
+[https://chat.emacsconf.org](https://chat.emacsconf.org/?join=emacsconf-org).
+If you want, you can also join the channel for your track as well
+(either #emacsconf-gen or #emacsconf-dev). 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.
+
+- If you want to do Q&A over IRC or Etherpad:
+ - You can hang out in the IRC channel for your track and/or on the
+ pad for your talk.
+- If you want to do Q&A over Mumble:
+ - You can connect to mumble.emacsconf.org.
+- If you want to do Q&A in a BigBlueButton room (ex: quick demoes):
+ - We'll set you up in a BigBlueButton room (check your e-mail for
+ the URL, or ask in #emacsconf-org). You can keep watching the
+ conference or doing other things while waiting there. We'll let
+ you know shortly before your prerec ends. If you want, you can get
+ things ready for whatever you might want to demonstrate.
+ - Please use headphones or earphones to minimize the risk of audio
+ feedback. Webcams are optional.
+
+The schedule on your talk page is still tentative. Please check your
+talk page for updates, especially on the day of the talk. We've done
+some dry-runs, but just in case it turns out that running two tracks
+at the same time leaves us too frazzled, we may drop back to one track
+with Q&A on an alternate stream. We'll try our best to keep your talk
+in the same general timeslot (ex: Saturday morning, Saturday
+afternoon, Sunday morning, Sunday afternoon). If we need to do that,
+or if there are other big changes to your schedule on the day of your
+talk, you'll get an e-mail from us with a subject like "URGENT:
+EmacsConf 2022: ...".
+
+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. If we start worrying, we'll
+reach out to you via your emergency contact information.
+
+# While your talk plays
+
+People will add notes and questions on the
+pad, or they'll ask them on IRC. Volunteers will try to copy all the
+questions to the pad. If you're on Etherpad or IRC, you
+can start answering whenever you like.
+
+# Answering questions
+
+- General notes about answering questions:
+ - You can answer questions in any order, and you can skip any questions you like.
+ - You don't have to answer questions right away. If you want to take
+ some time to think about things, that's okay.
+ - If you're answering questions by voice and the host is not reading
+ the questions out for you, please read the question out before you
+ answer it. This makes it easier to follow the conversation and to
+ copy the answers to the talk page afterwards.
+- 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 on Mumble: we'll pull you into the channel room and the
+ streamer will connect to it. When we confirm that you can be
+ heard, you and the host can go ahead with the Q&A.
+ - If you're doing Q&A in a BBB room:
+ - We'll switch the stream to broadcast from the BBB room you're
+ in, and we'll start recording the session so that Q&A can be
+ available after the conference. We'll give you a signal when the
+ Q&A is ready to start.
+ - Depending on your preferences, the host can read questions to
+ you, or you can read questions off the pad/IRC yourself.
+ - We'll open up the Q&A for other people to join if there's time
+ for a longer discussion. If so, this conversation can continue
+ for as long as you like. If it's time for the next talk to
+ start, we'll give you a heads-up and your Q&A can continue off
+ the stream in the same BBB room. When you are ready to stop
+ answering questions, you can wrap up however you'd like and
+ leave the meeting.
+
+# 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. We'll also work on
+extracting the videos from the Q&A sessions and we'll post them on the
+talk page.
+
+Thank you so much for putting so much time and energy into sharing
+what you know at EmacsConf!
diff --git a/2022/submit.md b/2022/submit.md
new file mode 100644
index 00000000..81b31abd
--- /dev/null
+++ b/2022/submit.md
@@ -0,0 +1,107 @@
+[[!meta title="Submit"]]
+[[!meta copyright="Copyright &copy; 2019, 2020 Amin Bandali<br />
+Copyright 2021 Amin Bandali, Sacha Chua, Leo Vivier<br />
+Copyright 2022 Amin Bandali"]]
+
+When you're ready to submit your proposal, send your submission via
+email to <emacsconf-submit@gnu.org> by **September 30**, including at
+minimum these essential information:
+
+- Your [preferred] name and its pronunciation, and optionally your
+ preferred pronouns;
+
+- your availability during the conference days (December 3 and 4) and
+ how you'd like to handle questions (live web conference, IRC, pad,
+ wiki, questions after the event);
+
+- emergency contact information (such as phone number) in case the
+ organizers need to contact you at the last minute before your talk,
+ or reach you during your talk (for example due to technical
+ difficulties);
+
+- the title of your talk/session;
+
+- an abstract of your talk/session (500 words or less);
+
+- brief descriptions/outlines for [[all talk formats|cfp#formats]] up
+ to your maximum planned length:
+ - 5-10 minutes:
+ - 20 minutes:
+ - 40 minutes:
+
+- your agreement with the speaker release for EmacsConf (see below).
+
+
+Please use the following template for your submission email,
+filling it out with information about you and your proposal:
+
+```
+Speaker name (and optional pronunciation) and preferred pronouns:
+
+
+Speaker availability and preferred Q&A approach:
+
+
+Speaker emergency contact information:
+
+
+Talk title:
+
+
+Talk abstract:
+
+
+
+
+
+
+
+
+- 5-10 minutes: (brief description/outline)
+- 20 minutes: (brief description/outline)
+- 40 minutes: (brief description/outline)
+
+Speaker release:
+
+ By submitting this proposal, I agree that my presentation at
+ EmacsConf 2022 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.
+```
+
+
+All kinds of people use Emacs for all kinds of things. We would love
+it if EmacsConf 2022 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.
+
+The submissions will be reviewed by a selection committee. If you
+would like to help review submissions as part of this committee,
+please [[let us know|contact]]. We look forward to hearing from you
+(and the people you want to nudge to speak)!
diff --git a/2022/talks.md b/2022/talks.md
new file mode 100644
index 00000000..e7813e3e
--- /dev/null
+++ b/2022/talks.md
@@ -0,0 +1,26 @@
+[[!meta title="Talks"]]
+[[!meta copyright="Copyright &copy; 2022 Sacha Chua"]]
+[[!sidebar content=""]]
+
+EmacsConf 2022 was on Dec 3 (Sat) and Dec 4 (Sun), 2022 from 9am-5pm
+Toronto/EST time. There were two tracks. The General track included
+talks about Emacs workflows and community resources, while the
+Development track focused on technical topics. Even if you're new to
+Emacs and Emacs Lisp, you'll probably find lots of talks that can
+inspire you and help you learn.
+
+<!-- You can also view all the videos and download resources from the index of [[all EmacsConf 2022 resources|all]]. -->
+
+<!-- There was also an alternate stream for APAC hours, see <https://libreau.org/past.html#emacsconf21>. -->
+
+[[!inline pages="internal(2022/schedule-details)" raw="yes"]]
+
+# Other stuff
+
+You can subscribe to the
+[emacsconf-discuss mailing list](https://lists.gnu.org/mailman/listinfo/emacsconf-discuss)
+to be sure to get updates.
+
+Want to help make EmacsConf even awesomer? [[Volunteer!|/2022/volunteer]]
+
+
diff --git a/2022/talks/asmblox.md b/2022/talks/asmblox.md
new file mode 100644
index 00000000..b97f7169
--- /dev/null
+++ b/2022/talks/asmblox.md
@@ -0,0 +1,94 @@
+[[!sidebar content=""]]
+[[!meta title="asm-blox: a game based on WebAssembly that no one asked for"]]
+[[!meta copyright="Copyright &copy; 2022 Zachary Romero"]]
+[[!inline pages="internal(2022/info/asmblox-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# asm-blox: a game based on WebAssembly that no one asked for
+Zachary Romero (<mailto:zacromero@posteo.net>)
+
+[[!inline pages="internal(2022/info/asmblox-before)" raw="yes"]]
+
+Over the past decade, programming games have risen in popularity and
+become a genre unto themselves. They are loved for their open-endedness
+and have helped people get into programming as well as help programmers
+hone their problem-solving skills. As a fan of the genre, I decided I
+wanted to recreate such an experience in Emacs. Looking at the already
+existing collection of games, TIS-100 by Zachtronics stood out as an
+especially good candidate for the base of a game, where the user is
+entering assembly code into a terminal to solve puzzles. The game
+asm-blox switches things around and instead of programming register
+machines, you program mini stack machines in a language similar to the
+WebAssembly text format.
+
+I'm still wondering if the game is actually any fun or not but either
+way it was an interesting project to make. In this talk, I'll demo the
+game as well as go over some of the Emacs Lisp tricks I used to make it
+work.
+
+The source code can be found at <https://github.com/zkry/asm-blox>
+
+
+# Discussion
+
+## Questions and answers
+
+- Q: Why did you choose an internal state versus many`state
+ buffers`? (ie. actual windows)  Thanks!
+ - A: A single internal state is easier to deal with in the context
+ of the game. Windows would obviously be better for other normal
+ applications to allow users to customize how they should behave.
+- Q:Do you have plans to port shenzhen io to emacs?
+ - A:That would be cool, was also thinking about exopunks.
+- Q:Did this use wasm ? We call some wasm code from Emacs?
+ - A:No, more similar to TIS-100, just a game.
+- Q: Why wasm rather than a more traditional Assembly dialect? It
+ wouldn't be harder to implement, right?
+ - A: It would have been easier, but less of a challenge and
+ resemble TIS-100 too much.
+- Q:Any next projects on your mind?
+ - A: Yes, a couple, hopefully more useful. I think tree-sitter is
+ cool. There's a neovim plugin called neogen that generates
+ documentation. Hopefully next year I'll be presenting something
+ more useful.
+- Q: Does this work with any other paren-based editing packages?
+ - A: Not at all (etc. tbd)
+- Q: What kind of tool could use this idea? 
+ - A: So I think some sort of graph drawing tool in Emacs might
+ have a similar idea. Like artist-mode but with graph drawing
+ constructs.
+- Q:  How did you go about designing the puzzles?
+ - A: With open-ended puzzles like this, coming up with random
+ ideas that seem like they should be implementable usually works.
+ If  you've seen some of Zachtronics games, the bar is extremely
+ high for what is capable.
+- Q: What' are your favorite changes  in the upcoming emacs 29?
+ - A: Definitely tree sitter. I've played around with it and it
+ provides a nice interface for extracting syntax information.
+ Like I can probably rewrite this plugin without any crazy
+ regexs: <https://github.com/zkry/go-ttest.el>
+- Q: Are there tools to add more puzzles?
+ - A: So the game code itself has a asm-blox-puzzles.el file which
+ defines each puzzle. It's pretty easy to add new puzzles but it
+ involves digging into the code.
+- QLike a binding to graphviz? (assume this is a continuation of the
+ "what kind of tool" question)
+ - A: I was thinking more ASCII, like a tool I saw called diagon.
+ Like artist mode but for graphs. But graphviz is amazing and a
+ lot could be done with that.
+
+           the diagon tool: <https://arthursonzogni.com/Diagon/#Math>
+
+Other feedback from IRC:
+
+- Great presentation. Game actually looks quite fun
+- Thanks again for your answers. Du bist das Beste
+
+[[!inline pages="internal(2022/info/asmblox-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/asmblox-nav)" raw="yes"]]
+
+[[!taglink CategoryFun]]
diff --git a/2022/talks/async.md b/2022/talks/async.md
new file mode 100644
index 00000000..5b7fbbc8
--- /dev/null
+++ b/2022/talks/async.md
@@ -0,0 +1,103 @@
+[[!sidebar content=""]]
+[[!meta title="Emacs was async before async was cool"]]
+[[!meta copyright="Copyright &copy; 2022 Michael Herstine"]]
+[[!inline pages="internal(2022/info/async-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Emacs was async before async was cool
+Michael Herstine (IRC: sp1ff)
+
+[[!inline pages="internal(2022/info/async-before)" raw="yes"]]
+
+While async is all the rage in the JavaScript, Go and Rust
+communities, Emacs has had the ability to (certain) asynchronous
+processing all along. I learned this while writing an Emacs package to
+program to my music server's API.
+
+Music Player Daemon is a project that does what it says: hangs out in
+the background & plays your music. It has an API that I wanted to call
+from Emacs. I had just learned async Rust, so I decided to see if I
+could do something similar here. It turns out I could: I wound-up
+writing a little async runtime that allows callers to "send" commands
+to the daemon by queueing them up and returning immediately. In the
+background, as output from previous commands comes in, new commands
+are dequeued and sent.
+
+This required callers to provide callbacks in order to receive the
+results of their commands, which led to a situation all too familiar
+to Javascript programmers: callback hell. The coda to my story was
+(finally) coming to understand Lisp macros in order to extend Emacs
+Lisp with a more convenient construct for sending multiple commands.
+
+This talk will dive into the details of the Emacs Lisp process API,
+specifically the Low-Level Network Access API, with illustrations as
+to how it can be used to build an asynchronous queue. It will also
+introduce Lisp macros and how powerful they can be.
+
+Michael is a developer and long-time Emacs user from the San Francisco
+Bay area. He hacks in C++, Lisp & Rust and thinks a lot about writing
+provably correct code. You can find him at:
+
+ - his [home page](https://www.unwoundstack.com)
+ - on IRC: sp1ff on Libera.Chat
+ - through [e-mail](mailto:sp1ff@pobox.com)
+ - or on [Github](https://github.com/sp1ff)
+
+# Discussion
+
+- Q: (Referencing the first half of your talk): How does this approach
+ compare to using tq.el, Emacs' built-in library for transaction
+ queues?
+ - A: Great question; should have mentioned that... I took a look,
+ but chose to just do it "by hand"; I wouldn't have used many
+ of the features offerred by tq.
+- Q: Have you considered using the aio.el library (written by Chris
+ Wellons) that implements async/await for Emacs lisp using promises?
+ It's implemented using Elisp's record data structure, and turns
+ the nested callback structure into regular-looking Elisp code
+ (without extra keywords etc). +1
+ - A: I wasn't aware, but thanks for the pointer-- will
+ definitely take a look
+- Q: not to take away from your excellent work, but are you aware that
+ EMMS has an MPD client? There's also mpc.el built into Emacs.
+ - A: Another great point; I am, along with mpdel (another MPD
+ client for Emacs). They are all full-fledge applications-- I
+ just wanted a small, tight toolkit
+- Q:Have you seen the Lonesome Pine Specials? I saw your music library
+ and figured you would be interested. My favorite is the one with
+ Edgar Meyer, Sam Bush, Jerry Douglas, and I think Bela Fleck and
+ Mark O'Connor?
+ - A: LOL I haven't, but I I think I will be!
+- Q: can you share the code to the macro that creates the callback
+ tree?
+ - A: <https://github.com/sp1ff/elmpd/blob/master/elmpd.el#L898>
+ - thanks!
+- Q: would using dynamic/special vars add anything interesting /
+ easier to async elisp in your opinion? i noticed you using `let` a
+ lot, but if you defined a variable hmm... not sure if i can :)  i
+ was just wondering if having dynamic binding in Elisp opposed to
+ something like JS adds some power to async programming
+ - A: lexical binding is easier to reason about :)
+- Q: There's another package (chuntaro?) in addition to wellon's aio
+ that also implements a coroutine trampoline on the emacs event loop.
+ any thoughts on the async/await paradigm generally red/blue
+ functions, etc?
+ - A: Longer discussion in the chat room, but I think it's a
+ promising if over-used approach to concurrency.
+- Q: How does your project compare to some of the other MPD clients?
+- Q: Any thoughts on the async await paradigm generally, red-blue functions, etc.?
+- Q: Do you think it's a viable future for Emacs to get out of callback hell?
+
+Comments from YouTube:
+
+- Thank you for the informative video Michael! Now I know a way to avoid callback hell in Emacs lisp!
+- Nice talk, thank you Michael!
+
+[[!inline pages="internal(2022/info/async-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/async-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/buddy.md b/2022/talks/buddy.md
new file mode 100644
index 00000000..30a9e0ce
--- /dev/null
+++ b/2022/talks/buddy.md
@@ -0,0 +1,100 @@
+[[!sidebar content=""]]
+[[!meta title="The Emacs Buddy initiative"]]
+[[!meta copyright="Copyright &copy; 2022 Andrea"]]
+[[!inline pages="internal(2022/info/buddy-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# The Emacs Buddy initiative
+Andrea (<mailto:andrea-dev@hotmail.com>)
+
+[[!inline pages="internal(2022/info/buddy-before)" raw="yes"]]
+
+Emacs is a cryptic marvel of usefulness: who else can help you solve
+its riddles if not a buddy?
+
+The Emacs Buddy initiative [0] aims to help you find somebody that can
+support you in your Emacs exploration.
+
+No matter if this is the first (or second?) time you start Emacs or if
+it is decades you use it: everyone hits a wall behind which there is
+progress. More often than not somebody else (sometimes a younger
+sometimes an older one but always with a different context) can help
+us move past those walls towards new discovery.
+
+So come and listen about how to stand on the shoulders of your Emacs
+ buddies!
+
+In this short talk I will give an idea of how to request a buddy, how
+to become a buddy yourself and how the initiative worked out so far!
+
+[0] <https://github.com/ag91/emacs-buddy>
+
+# Discussion
+
+## Notes and feedback
+
+- I am totally into emacs buddy!!
+- noticed the program name in Andrea's Emacs window title? ;-)
+ - "This Text Editor is just Too Cool :)" in the fram title
+- The "Buddy System" has already helped me with Emacs and Gnus. Thank you Andrea!
+ - oh, you are welcome danisanti :D Hope you keep sending encrypted mails: thanks for the GPG exercise :)
+- This buddy system is a great idea, by the way. I could see how this might really benefit people trying to learn more or spread their skills
+- I think the usergroups page on the EmacsWiki is fairly well maintained.. https://www.emacswiki.org/emacs/Usergroups
+
+
+
+## Questions
+
+- Q: OFF TOPIC and not a question but a remark: hotmail.com is
+ constantly blocking more and more smaller email servers (for valid
+ but also dubious reasons) and many administrators are frustrated
+ enough not to try to get off Microsoft's blocklist any more. So
+ your email address might not be reachable by a substantial set of
+ people especially people who do not use the big email players such
+ as Google.
+ - A: oh what do you suggest? I can use/make a different one
+ - Karl: I'd recommend not to use Microsoft email servers in
+ general as I've realized in too many situations that admins
+ gave up fighting Microsoft. For example, my Mastodon
+ instance can not be used any more by people using hotmail
+ for that reason. Sometimes, admins do have to pay real money
+ in order to get unblocked by Microsoft. This is a pattern
+ I'd not support myself. YMMV.
+ - The worst part: users of Hotmail do not realize this
+ until they really need to contact a company or a person
+ who got blocked.
+ - Ah didn't know that, I will look into it then. Thanks!
+ - Have a look at e.g. mailbox.org (using renewables),
+ migadu.com (partly), posteo.de (if you don't require an own
+ domain...)
+ - For people who focus on mobile apps and webmailers,
+ protonmail might be a good idea. They are Swiss-based
+ and focus on a very high level of privacy and security.
+ AFAIR IMAP is only for payed plans and for for the free
+ plan.
+ - interesting, thanks!
+- Hi Andrea-- great talk. I hope your idea can scale. Are you looking at other models such as mentorship networks etc. What are your thoughts on real-time collaboration? Also, should this buddy network be a slack or discord channel? Would that help?
+ - I will just scale it up if necessary pulling more people as facilitators in case
+- Hi, just missed the talk, but as a beginner who just enjoys tinkering with emacs, I herewith warn you that I might reach out to you :-)
+- Q: would you consider creating a IRC channel for your buddy initiative?
+ - A: I didn't think about it: how would that be? I was thinking email/calls was more personal ;)
+ - a permanent IRC is great for me
+ - email and calls are good too
+ - for IRC there already is #emacs
+ - #emacs is a pretty big channel. I can see where having a dedicated channel would make sense.
+ - something like jitsi might be good if you want that. I think you can protect them w/ code to keep weirdos out?
+ - email is more personal and it doesn't need to be connected all the time to get an answer
+ - yeah, async vs. sync communication styles.
+ - FWIW, to create a channel simply /join #the-channel
+- quiliro: I want to be a mentor and also would like to be mentored
+ - A: just drop me an email and we can get on from there
+ - dto: hey `none can you pm me your email? i could do some mentoring sessions this year for sure
+
+[[!inline pages="internal(2022/info/buddy-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/buddy-nav)" raw="yes"]]
+
+[[!taglink CategoryCommunity]]
diff --git a/2022/talks/buttons.md b/2022/talks/buttons.md
new file mode 100644
index 00000000..dc4e9a39
--- /dev/null
+++ b/2022/talks/buttons.md
@@ -0,0 +1,108 @@
+[[!sidebar content=""]]
+[[!meta title="Linking personal info with Hyperbole implicit buttons"]]
+[[!meta copyright="Copyright &copy; 2022 Mats Lidell"]]
+[[!inline pages="internal(2022/info/buttons-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Linking personal info with Hyperbole implicit buttons
+Mats Lidell (he/him/his, <mailto:matsl@gnu.org>)
+
+[[!inline pages="internal(2022/info/buttons-before)" raw="yes"]]
+
+GNU Hyperbole, The Everyday Hypertextual Information Manager, supports
+hypertext links. Linking is done though buttons that can be either of
+two types, implicit buttons and explicit buttons.
+
+In this talk I will show how the Hyperbole support of implicit buttons
+can be used to create links to personal data.
+
+Outline:
+
+1. Short introduction to Hyperbole
+2. Description of what an implicit button is
+3. Description of how Hyperbole supports creating new implicit buttons using the Hyperbole defil macro
+4. Examples of applying the defil macro together with different personal data structures
+
+# Discussion
+
+- Hyperbole - <https://www.gnu.org/software/hyperbole/>
+- <https://savannah.gnu.org/projects/hyperbole/>
+- Get a lot of power and put buttons everywhere without having to
+ learn a lot of syntax. This is what is cool about hyperbole. 
+- You can expand and collapse trees if you export hyperbole kotl-files
+ (unlike exporting from org-mode)
+- These hyperbole buttons looks quite cool!
+- the mapping is agnostic if you are looking at the code or any other document, that is quite powerful, thanks for the presentation!
+- I was in the other room and just came in at the last moment to hear about hyperbole for the first time!
+
+## Questions
+
+- Q: So with one line of code you can create custom hyperbutton types
+ that are live in any Emacs buffer.  Is that right?
+ - A: Yes.
+- Q:Is there a good way to share common patterns for links other than
+ the ones that you shared? shall those be PRs to your repository?
+ - A: 
+ - No, I view these buttons first as specific for your
+ application or supporting your way of working so would have
+ less value in sharing. On sharing is that they could be used
+ for collabration between different users where each user
+ would define their own mapping to work in their environment.
+ In the file example in the presentation each users could
+ have has stored the data in different local folders but use
+ the same pattern to link to the data.
+ - Thinking about it again now I realize that you mean sharing
+ as examples or for inspiration. That is a good idea. We
+ don't have any example section but we could add that. You
+ can also post ideas and examples to the Hyperbole user
+ mailing list.
+- Q: I liked the link to evaluate Calc expressions. Any way to get the
+ outcome into the buffer and not just in the message window? It could replace embedded calc mode with more control... I guess any elisp code can be used for the target evaluation.
+ -ericsfraga
+ - A: You can mix Hyperbole buttons with Org source blocks too, so
+ you could get things in a buffer that way too.
+ - The example uses a lambda expression to get the result
+ displayed. To get the result inserted in the buffer would just
+ require a function to do that instead of displaying it in the
+ message window.
+ - This would be a simple example of this (It will insert the
+ result after the button, removing rest of the line but keep the
+ point in the button allowing you to change it to calculate a new
+ result.)
+ ````
+ (defil demo-do-math "<<" ">>" ".*"
+ '(lambda (x) (save-excursion (search-forward ">>")
+ (kill-line) (insert " " (calc-eval x) " "))))
+ ````
+- Q: How did you present the right buffer with shortcuts at the right
+ of your buffer? -- a lot of people are wondering.
+ - A:  interaction-log mode -
+ <https://github.com/michael-heerdegen/interaction-log.el>
+ - In combination with displaying it in a separate frame.
+- Q:What kind of cool actions do you use in Hyperbole?
+ - A: Among other things... 
+ - You can expand and collapse trees if you export hyperbole
+ kotl-files (unlike exporting from org-mode) kotl-files are
+ Hyperbole outliner files.
+ - I use implicit button defined with the defib macro that
+ allows me to match to text with no start and stop 
+ delimiters. That way I can match on identifiers used in
+ other systems verbatim, such as identifiers in ticketing
+ systems. Much like the in Hyperbole built in debbugs for the
+ pattern "bug#id-number"
+- Q: Does the links/buttons created in hyperbole (like that one with
+ the url) get exported on org-mode files too? (like when exported to
+ html).
+ - A: There is currently no support for turning the implicit
+ buttons into html-links on export. In practice I would think
+ that to be hard and would only support parts of the
+ functionality but is an interesting idea.
+
+[[!inline pages="internal(2022/info/buttons-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/buttons-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/community.md b/2022/talks/community.md
new file mode 100644
index 00000000..4ec396cb
--- /dev/null
+++ b/2022/talks/community.md
@@ -0,0 +1,57 @@
+[[!sidebar content=""]]
+[[!meta title="The ship that builds itself: How we used Emacs to develop a workshop for communities"]]
+[[!meta copyright="Copyright &copy; 2022 Noorah Alhasan, Joseph Corneli, Leo Vivier"]]
+[[!inline pages="internal(2022/info/community-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+# CANCELLED: The ship that builds itself: How we used Emacs to develop a workshop for communities
+Noorah Alhasan, Joseph Corneli, Leo Vivier (Noorah: she/her, Joseph: he/him, Leo: he/him)
+
+[[!inline pages="internal(2022/info/community-before)" raw="yes"]]
+
+After meeting at EmacsConf 2020, and since then, convening weekly as
+the Emacs Research Group, we gained a lot of experience working across
+disciplines. Building on our long-running small-group experience, we
+developed a strategy for engaging others in the kind of light creative
+work that we value because we want to share our patterns for building
+effective joyful action.
+
+Our new day-long workshop brings people together around a topic of
+shared interest. We use a scenario-development and exploration
+process to help participants understand their common ground and
+discover new ways to work together. In this talk, we will give an
+overview of recent workshops we’ve run on themes linked to public
+space and future studies and how we utilize Emacs for our research.
+
+Looking back at our recent pilots as a source of evidence, we’ll look
+at whether and how the methods we used helped people quickly identify
+core themes that they want to keep working on together. While we
+don’t expect everyone to meet weekly as we did, we do expect that
+some participants will leave energised. Underlying the workshop is
+the claim that the right combination of methods should help people
+find topics of priority that they want to get traction on, for
+example, breaking down a topic like "public space" into doable actions
+like cleaning up an abandoned lot. Does the evidence so far support
+this claim?
+
+We also reflect on how technology — including the further evolution of
+Emacs — could help people be even more effective at identifying and
+addressing challenging problems. As a small example, note-taking in
+real-time with CRDT helps us practice ‘active listening’ in our
+meetings and gives us a detailed record of what happened so that we can
+return to for further reflection and analysis. As we think about the
+other affordances of Emacs, we get excited about how more advanced
+data analysis and more structured interaction patterns could aid in
+going back over our old thoughts and getting more out of the time we
+spend together. One potential application would be forming bridges
+between the different community groups, we work with.
+
+
+
+[[!inline pages="internal(2022/info/community-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/community-nav)" raw="yes"]]
+
+[[!taglink CategoryCommunity]]
diff --git a/2022/talks/dbus.md b/2022/talks/dbus.md
new file mode 100644
index 00000000..23ee2eac
--- /dev/null
+++ b/2022/talks/dbus.md
@@ -0,0 +1,173 @@
+[[!sidebar content=""]]
+[[!meta title="The Wheels on D-Bus"]]
+[[!meta copyright="Copyright &copy; 2022 Ian Eure"]]
+[[!inline pages="internal(2022/info/dbus-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# The Wheels on D-Bus
+Ian Eure (ee-uhn you-er, he/him/his, IRC: ieure)
+
+[[!inline pages="internal(2022/info/dbus-before)" raw="yes"]]
+
+In this talk, I’ll explore uses of D-Bus that supercharge your
+Emacs Operating System.
+
+# Discussion
+
+## Notes
+
+- - <https://codeberg.org/emacs-weirdware/debase>
+
+- <https://codeberg.org/emacs-weirdware/discomfort>
+
+- re: "pushing mindshare"..  Yes, you were very successful on that!
+
+## Questions and answers
+
+- Q: This is such a great overview of dbus.  I hadn't been paying
+ attention to this space because it seemed to be in flux (10-15 years
+ age).  How long has dbus been around and what was in place before
+ that?
+ - A: D-Bus dates to 2002, but really saw stabilization and
+ adoption in the 2010s.  There wasn't really anything prior to
+ D-Bus, you'd do some of the things it does by shelling out and
+ driving command-line programs --- not a great approach.
+- Q: Forgive me if this question is silly: Why is everything dBus
+ prefixed with "org."?
+ - A: D-Bus services generally use reverse-FQDN notation, similar
+ to Java packages, and most stuff using it is not-for-profit
+ software, so `org.` is a very common prefix for those.
+- Q: In your investigations, do most OS/DE/WM interop well over d-bus?
+ Which one(s) have proven more challenging, if any?
+ - A: Since D-Bus is pretty uniform, DE/WM considerations aren't a
+ large concern.  D-Bus isn't widely used on non-Linux systems,
+ so OS differences have little to no impact.
+- Q: Re: using EXWM as a Desktop Environment -- Does EXWM provide a
+ session manager (daemon)?
+ - A: No, but it looks like it can work with external X11 session
+ managers.
+- Q:There is a lot of critisism against d-bus out there, why do you
+ think that might be?
+ - A: Because it's not very good.  It uses XML, which isn't hip,
+ and I think a lot of people have a knee-jerk negative reaction
+ to.
+- Q: Which system services come to mind when thinking about
+ applications, be it at the OS/DE/WM level?
+ - A: Stuff that interacts with hardware: turning WiFi on and off,
+ connecting to networks, pairing Bluetooth devices.  The kind of
+ stuff you find in the upper-right of the dock/menubar in a
+ traditional DE.
+- Q: "If you want to do the kinds of things that dBus does, you're
+ limited": What is something dBus does that you couldn't do before?
+ What is a really cool use of dBus in a modern DE (KDE/Gnome etc)?
+ - A: D-Bus is fundamentally about making it *easier* to do things,
+ and using that increased ease of use to broaden the number of
+ places that kind of thing gets done.  So there's some prior art
+ for doing some of these things, but none of them is as easy as
+ doing it via D-Bus.  As far as specific features: I've been
+ using computers a very long time, and it's still magic to me
+ that you can just plug hardware in and immediately use it
+ without having to do anything --- D-Bus is foundational to that
+ kind of interactivity when it comes to things like storage,
+ network, and Bluetooth-connected devices.
+- Q:  When it comes to managing devices, how are dBus and UDev
+ related?
+ - A: They're orthogonal.  I believe UDisks2 (which is the D-Bus
+ service for managing disks) talks to UDev2, but this is abstract
+ & not a detail you have to care about as a client of UDisks2.
+- Q: As an average GNU/Linux user, I've used signals and methods
+ before but not properties. You gave an example involving properties,
+ but it kind of flew by. Can you explain briefly what clients and
+ services can do with properties?
+ - A: Properties are metadata associated with an object
+ interface[.   They can expose r/o information about the object
+ (the name of the host; the UUID of a disk device; the hardware
+ address of a network device), and you can modify certain
+ properties about the object or service by writing to them.  For
+ example, `org.freedesktop.NetworkManager.Device` has an
+ `AutoConnect` property, which you can use to enable/disable
+ automatic connection.
+- Q: what is the name of the dbus GUI you showed?  defeat? dfeet?
+ - A: "d-feet" 
+- Q:  Naive Q (me not knowing much about dBus): Is there such a thing
+ as a dBus reflection browser (maybe Emacs based) that lets you
+ discover all the behavior different dBus app participants provide?
+ Thinking something like what macOS Automator does? (actually, wait,
+ think you're showing it)
+ - A: d-feet is the one I showed:
+ <https://wiki.gnome.org/Apps/DFeet>
+ - I'd very much like something similar, but built into Emacs.
+- Q:dbus seems great for extensibility. But then Emacs has no such
+ mechanism. And is fantastically more extensibile. Why do you think
+ this is so?         
+ - A: I think these are different kinds of extensibility.  Emacs is
+ much more malleable than anything D-Bus offers.  You can't
+ change how existing D-Bus services work in the same way as you
+ can with Emacs customizations, variables, advice, or just going
+ and hacking on the code live; you can only add new features by
+ creating new services.
+- Q:  Do you have other cool dbus ideas?
+ - A: I greatly want to see:
+ - A D-Bus browser.
+ - discomfort expanded and made better looking, so there isn't
+ a single storage-related task I can't do with it and dired.
+ - A NetworkManager interface, so I don't have to use
+ nmtui/nmcli.
+ - A Bluez (bluetooth) interface, so I never have to see
+ bluetoothctl again.
+- Q: Are there Busses besides System and Session? Is there anything
+ more to a Bus besides a way to group ~~services~~ objects?
+ - A: There's always at least a System bus; theres one Session bus
+ per logged-in session (so potentially zero).  You can create and
+ connect to as many busses as you want, and they get identified
+ by the socket they listen on, which can be a local UNIX socket
+ or a TCP socket.  This isn't a common usecase, most things use
+ system and session.
+- Q: It looks like dBus is mostly useful for Emacs to do IPC -- IIUC,
+ this is how synctex works when working with LaTeX docs. How does it
+ compare with other ways of doing IPC, for example, communicating
+ over a socket with MPD?
+ - A: D-Bus provides a uniform framework for building these
+ services.  MPD's socket interface only works with MPD, and if
+ you want to connect to one, you have to write code that speaks
+ the protocol before you can do high-level things like "play"
+ or "pause."  D-Bus provides the underlying communication layer
+ as well as the model for the API, so you get all that stuff for
+ free.  If a music player has a D-Bus interface, and you're
+ using a language with D-Bus bindings, you can go from zero to
+ "support playing and pausing" in one line of code.
+- Q: ~~What mainstream/popular d-bus alternatives have you seen out
+ there, if any, maybe beyond pipes, udev, and such? -> somewhat
+ redundant with the above~~
+ - A: There aren't any alternatives on Linux that I'm aware of. 
+ Other operating systems have different ways of doing things
+ similar to what D-Bus does (such as OSA/AppleScript on macOS).
+- Q: I see a python dbus tutorial, does it make sense to have an emacs
+ version?
+ <https://dbus.freedesktop.org/doc/dbus-python/tutorial.html> 
+ - A: That's a really good idea!
+- Q: How if at all do the various web browsers interop (well) via
+ d-bus?
+ - A: It could be better.  Firefox (and forks) have a simple
+ interface that lets you open a URL, but nothing else.  I'm not
+ sure about other browsers, since LibreWolf is what I use.  If
+ you use d-feet to examine the session bus, you can see!
+- Q: Nice, thanks! I had been looking for a udisks tool. Is it available?
+ - A: Yes, https://codeberg.org/emacs-weirdware/discomfort It's alpha, but way nicer than using udisksctl.
+
+Other discussions from IRC:
+
+- Very interesting talk Ian!
+- Pretty interesting... I am already scratching my head thinking on applications!
+- Thanks, fascinating ieure, now onto refactoring everything not yet into Emacs to be managed in Emacs via d-bus...
+- One usage example I've recently stumbled over is the scad-dbus package which can control the openscad gui from Emacs, move around the camera etc.
+- @ieure : Thanks for the great talk, love these expositions of yours, especially of things that have gone under-appreciated - and the packaging into timeless tunes obviously!
+
+[[!inline pages="internal(2022/info/dbus-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/dbus-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/detached.md b/2022/talks/detached.md
new file mode 100644
index 00000000..f4b17e92
--- /dev/null
+++ b/2022/talks/detached.md
@@ -0,0 +1,89 @@
+[[!sidebar content=""]]
+[[!meta title="Getting detached from Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Niklas Eklund"]]
+[[!inline pages="internal(2022/info/detached-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Getting detached from Emacs
+Niklas Eklund (he/him, <mailto:niklas.eklund@posteo.net>)
+
+[[!inline pages="internal(2022/info/detached-before)" raw="yes"]]
+
+
+As an enthusiastic Emacs user I would find myself replacing the usage
+of an external terminal emulator with the Emacs alternative
+interfaces. This included using packages such as dired for file
+management, magit for git and proced for processes. However I always
+kept a terminal around for running shell commands. These were
+commands that I knew would either, take a long time to run, produce a
+lot of rapid text output or that I would run on a remote machine. In
+the remote case I would rely on tmux to be able to detach and let the
+command run even when I wasn't connected.
+
+To rid me of the need for the terminal emulator in these situations I
+developed the detached.el package. It is a package that builds on top
+of the dtach program, which provides the ability to detach and
+re-attach to processes, to offload Emacs from these processes. The
+package seamlessly integrates the ability to detach and attach into
+Emacs, and offers integration with many built in features such as
+shell, eshell, compile, org and dired.
+
+In this talk I will demonstrate the features of this alternative way
+to run detached processes and how the package can leverage built in
+Emacs functionality to provide a great experience. The user interface
+will be showcased and how the processes essentially becomes text,
+which fits very well into Emacs.
+
+# Bio
+
+- Blog: <https://niklaseklund.srht.site/>
+- Source code: <https://sr.ht/~niklaseklund/>
+
+My name is Niklas Eklund. I am 35 years young and I live in Gothenburg
+(Sweden) with my wife and our dog. In my daily work, I write code in
+C++ and Python. My free time I dedicate to music, board-games, improvement,
+and of course, Emacs.
+
+More than 4 years has passed since I first started using Emacs and
+there is so much to like about it: its community, the ethics and how
+it encourage me to experiment and explore. Whether it is about writing
+a small function, or a package, the ability to mold Emacs to what
+makes sense to us as individuals is something to cherish.
+
+# Discussion
+
+## Questions and answers
+
+- Q: Can it replace ssh+tmux for persistent sessions on remote hosts?
+ - A: Not yet; being considered for future work.
+- Q: I see integration with projectile in the readme, does it also
+ integrate with project.el?
+ - A: Not yet but should be easy to add.
+- Q:  Can you detach a session from shell-mode and reattach from
+ eshell/vterm/term-mode?  Or start a compile in shell-mode and attach
+ it from compilation-mode?
+ - A: 
+- Q: How do you talk to detached? Could it be feasible to run a child
+ emacs instead of detached? Would it make sense? Better communication
+ maybe?
+ - A:
+- Q: How does it handle processes that require user input? (Usually to
+ type y/n, etc). M-x compile is great but can't handle user input.
+ - A:
+- Q: Can you rerun a command (session?) but in another directory?
+ - A:
+- Q: What are some other places where this might be useful?  mu4e
+ fetching mail?  Git processes started by Magit?  What things would
+ you like to see working in a 1-2 year timeframe?
+ - A: 
+- Q: What are you currently excited about in emacs? 
+
+
+[[!inline pages="internal(2022/info/detached-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/detached-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/devel.md b/2022/talks/devel.md
new file mode 100644
index 00000000..6ee016c9
--- /dev/null
+++ b/2022/talks/devel.md
@@ -0,0 +1,73 @@
+[[!meta title="Emacs development updates"]]
+[[!meta copyright="Copyright &copy; 2022 John Wiegley"]]
+[[!inline pages="internal(2022/info/devel-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Emacs development updates
+John Wiegley
+
+[[!inline pages="internal(2022/info/devel-before)" raw="yes"]]
+
+What has been happening and what is soon to come in Emacs development
+
+Bio: John Wiegley is a past maintainer of Emacs and frequent contributor of Emacs Lisp.
+
+# Discussion
+
+## Questions and answers
+
+- Q: Any word on bringing someone like John W. back in in a maintainer
+ role? I think someone like him is good in that role and miss seeing
+ his messages as frequently!
+ - A: I very much appreciate the support! but now is not a good time. I have other
+ distractions that would detract from my ability to support the community
+ properly.
+- Q: Does the user need to do anything to turn on support for long
+ lines?
+ - A: No! Just editing files with long lines should become much faster.
+ - Side note intersting vidoes about long lines
+ - <https://www.youtube.com/watch?v=5C3wB3xiMmU>  Emacs Long
+ Lines Fix
+ - <https://www.youtube.com/watch?v=kflDJ9L4siw>  Emacs Long
+ Lines, This Time With Feeling
+- Q: Having emace init comand line option is nice" no more chemacs
+ for multiple emacs configs" and would make starter packs eaiser to
+ test, or makeing applications or scripts based off of emacs easier
+ to do. Is there anything else following this decection?
+ - A: I don't really follow this question well enough to have an answer!
+- Q: The discussion during Howard's Eshell talk indicated demand for
+ enhancing Eshell and its documentation. For those of us interested
+ in pursuing that, where should we start? Should we explore moving it
+ from core into an independent package?
+ - A: Certainly new development could happen in an independent repository, with
+ releases delivered back to the Emacs repository. There are other packages that
+ also do this.
+- Q: has any date been set for 29 release?
+ - someone else: I haven't seen dates on devel. The branch was just cut so I would expect it will be at least a few months. Could be longer as there are so many new features in 29 (tree-sitter, sql-lite, use-package to name a few I'm hyped for)
+ - someone else: Seems like a good release for dropping legacy and using all the new stuff everybody else is using. wayland, lsp, tree-sitter, better performance on long lines.
+ - A: I'm not aware of a specific date, but if you follow the emacs-devel list, updates are sometimes posted.
+- Is tree-sitter useful if you want to parse all the code in an application or is it more narrow, i.e. just for interactive parsing of changing code?
+ - A: I imagine it's generally useful for parsing any sort of text that you want to
+ perform structural analysis on, whether in whole, in part or incrementally. I
+ recommend checking out the web documentation on the tree-sitter libraries.
+Notes and other feedback:
+
+- XInput 2 support author here.  X has historically seen three
+ input APIs: Core Input, legacy XInput, and XInput 2.  Emacs only
+ ever used the first until Emacs 29, where it jumped straight to
+ using the last.  So it's not quite an ``update'', but rather an
+ entirely new feature.  Thanks for the great talk!
+ - A: Good to know, thank you for that clarification!
+
+- Thanks John! Thanks Eli!
+
+## Notes
+
+[[!inline pages="internal(2022/info/devel-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/devel-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/eev.md b/2022/talks/eev.md
new file mode 100644
index 00000000..c8d40a9b
--- /dev/null
+++ b/2022/talks/eev.md
@@ -0,0 +1,71 @@
+[[!sidebar content=""]]
+[[!meta title="Bidirectional links with eev"]]
+[[!meta copyright="Copyright &copy; 2022 Eduardo Ochs"]]
+[[!inline pages="internal(2022/info/eev-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Bidirectional links with eev
+Eduardo Ochs
+
+[[!inline pages="internal(2022/info/eev-before)" raw="yes"]]
+
+Consider the two sexps below:
+
+ (code-c-d "foobar" "/tmp/foo/bar/" :anchor)
+ (code-c-d "fb" "/tmp/foo/bar/" :anchor)
+
+Each one of them defines several "short hyperlink" functions. After
+running them the three sexps below are roughly equivalent:
+
+ (find-file "/tmp/foo/bar/plic.txt")
+ (find-foobarfile "plic.txt")
+ (find-fbfile "plic.txt")
+
+The "`code-c-d`"s above also define functions with even shorter names
+&#x2013; `find-foobar` and `find-fb` - that point to "anchors" in files in
+the directory `/tmp/foo/bar/`. The three sexps below are roughly
+equivalent -
+
+ (find-fline "/tmp/foo/bar/plic.txt" "«bletch»")
+ (find-foobar "plic.txt" "bletch")
+ (find-fb "plic.txt" "bletch")
+
+Until feb/2022 the only way that I had to produce these hyperlinks to
+anchors quickly required a LOT of muscle memory&#x2026; I had to type this,
+
+ M-1 M-h M-w M-h M-h 9*<down> M-h M-2 M-h M-y M-h M-- M-h M-w M-k
+
+where the number of "`<down>`"s depended on whether I preferred
+`find-foobar` of `find-fb` - i.e., of on what is my preferred "code"
+for the "directory" `/tmp/foo/bar/`; either "`foobar`" or "`fb`".
+
+In this presentation I will show a much better way to generate short
+hyperlinks to anchors and push these short hyperlinks to the kill
+ring, and how I use that to create bidirectional hyperlinks between my
+notes on a language $LANGUAGE and programs written in that language.
+
+For more info see [this page](http://angg.twu.net/emacsconf2022-kla.html).
+
+# Discussion
+
+- Q: Can you say why you like all your links to be elisp expressions rather than something more textual? Is it just so you can always evaluate the expressions?
+ - A: rswgnu5: it is quicker to create hyperlinks that don't have titles, and many years ago I had some problems when I gave titles that were not very good, and I ended up with links that didn't do what I expected, so I sort of stopped trusting links whose actions are hidden and only their titles are shown. also, I am trying to write code in which all parts are easy to understand.
+- Q: I am fond of and inspired by your idea of Lisp Markup & Interfaces. Have you thought of other Lisp Markup uses than Links? How do you think of incorporating tree-sitter? If that makes sense to you or at all.
+ - A: can you explain your idea? I haven't had time to play with tree-sitter yet, but my holidays will start in a few weeks... I sometimes get stuck trying to understand the inner details of things whose inner details shouldn't be relevant... I had this problem with both Org and Hyperbole several times, and I guess that I will have it with tree-sitter too...
+ - edrx: I don't have a concrete idea. I just have been thinking of the intersection of Markup, minimalist Textinterfaces and little Languages | language oriented programming for a while. Eg Lisp is a nice List/ tree data syntax. You use it for links. Do you have other markup like uses for? And speaking of tree data, tree-sitter is a tool to incrementally & robust build a tree from a flat text buffer.
+ - do you know this? https://github.com/mmontone/emacs-inspector
+- Bi-directional links is a good idea.
+- I look forward to trying it out and seeing how it feels. It certainly looked cool!
+- awesome! btw edrx i'd really enjoyed the last eev workshop, would be totally down to attend another one later too
+- An interesting link type to add would be org id for org roam or denote id link types.
+- I've been trying to use eev to explore parts of Emacs that I don't understand... a basic example is M-x list-packages
+- Something to love about org mode, hyperbole, and eev is how they push the idea of links further
+
+[[!inline pages="internal(2022/info/eev-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/eev-nav)" raw="yes"]]
+
+[[!taglink CategoryEEV]]
diff --git a/2022/talks/eshell.md b/2022/talks/eshell.md
new file mode 100644
index 00000000..def188e8
--- /dev/null
+++ b/2022/talks/eshell.md
@@ -0,0 +1,156 @@
+[[!sidebar content=""]]
+[[!meta title="Top 10 reasons why you should be using Eshell"]]
+[[!meta copyright="Copyright &copy; 2022 Howard Abrams"]]
+[[!inline pages="internal(2022/info/eshell-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Top 10 reasons why you should be using Eshell
+Howard Abrams (he/him)
+
+[[!inline pages="internal(2022/info/eshell-before)" raw="yes"]]
+
+While Eshell is this quick and dirty way to run external commands, its
+*dirtiness* plays into the Lisp’s *malleable* big ball of mud metaphor,
+and I have a number of quick hacks that will make you want to play in
+this puddle.
+
+This will be a lightning talk that I will pre-record to show off some
+features in eshell I found while diving into the source code &#x2026; stuff
+you can’t do in another terminals. Did you know that `$$` is a special
+variable that contains the output from the last command?
+
+Update from Howard: I wrote an _expanded transcript_ with more code and functional links. See <http://howardism.org/Technical/Emacs/eshell-why.html>
+Want _all_ the code? See my literate dotfiles for #emacs at <https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org>
+# Discussion
+
+## Notes
+
+- Full code:
+ <https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org>
+- Longer transcript:
+ <http://howardism.org/Technical/Emacs/eshell-why.html>
+- Yes eshell is usefull!  Please help polishing and showing this stuff
+ you found out.
+- Alvaro Ramirez has been doing the DWIM stuff
+- Regarding the not so well oiled parts of eshell. There are many
+ efforts doing a better shell. I have the feeling we already have
+ that in emacs already and it is just unfinished. But maybe that is
+ just a statment about emacs in general.
+- Reach out to me if anyone wants to pair up and make a eshell-ext
+ with many of the feature improvements I mentioned in my talk, that
+ probably shouldn't clutter up the default eshell implementation.
+- eshell is great for running top and htop (except I can't figure out how to input the function keys)
+ - haha yeah i don't either
+- vterm isn't distracting - it has no new features to speak of
+
+## Questions and answers
+
+- Q: Do you fallback to vterm only when needing terminal emulation
+ (ncurses/etc)? Or are there use cases or contexts where you use
+ vterm over eshell beyond just terminal emulation needs?
+ - A: I do vterm mostly for SSH, but Docker builds and Ansible
+ commands can cause a real mess of the screen, so I often run
+ those commands in vterm ... but I'm not really working with
+ that output.
+- Q: One issue I've had with eshell's TRAMP integration is that cd
+ is host agnostic (as you point out). This means typing `cd` on a
+ remote machine will cd back to $HOME on your local machine. Is
+ there a way to cd to $HOME on the remote machine?
+ - A: It just isn't the way it behaves. While Eshell, with a
+ Tramp-based cd command, will ssh "under the hood", it is
+ temporary, as all the buffer work is local. I usually don't
+ know what will happen, so I often need to switch to vterm for
+ all ssh work. Which gets me upset when I encounter something
+ that I would then like to use Eshell for (like piping the output
+ back to my local Emacs buffer).
+- Q: Thank you for the missing Why eshell. Have you thought about
+ adding it to the eshell manual?
+ - A: maybe I should team up with someone and improve on it
+- Q:Do you know if the eshell {} can be used from elisp? It could make
+ for a nice elisp shell interface.
+ - A: Yes. Start with `eshell-command' and some variations on
+ that.
+- Q: How does that interplay with your "literate-devops" approach,
+ where things are done in an org buffer/document first instead of
+ directly in the shell/terminal?
+ - A: the 2 are different. I use as REPL to test stuff
+- Q: Do you have a strategy for getting around eshell's lack of
+ support for input redirection? (I also miss process substitution.)
+ - A: I have started sending output to Emacs buffers, where I can
+ have more fun editing them than trying to get a pipe command
+ sequence working. I wrote a function to pull a buffer back into
+ Eshell to pipe back to something else. Pipes are problematic in
+ Eshell.
+- Q: Can you call elisp functions as well (ie, not just commands)?
+ - A: Yes. Functions that start with eshell/ are called as if they
+ were commands. However, all functions are available in eshell
+ ... that is what makes it more interesting than the other
+ comint-based term shells.
+- ~~Q: Aren't buffers the superior pipes? --> that was meant as a
+ comment when he was asked about pipes, not a question per se -->
+ alright~~
+ - A:Howard: yes
+- Q:Do you have a preferred method for getting argument completion for
+ shell commands in Eshell?
+ - A: Check out
+ <https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org#getopts>
+- Q: Similarly, is it possible to get Eldoc-based completion for Elisp
+ calls in Eshell?
+ - A: dont know. would be great, though
+- Q:Do you have thoughts about
+ <https://www.masteringemacs.org/article/complete-guide-mastering-eshell#plan-9-smart-shell>
+ ?  Summary: it effecitly adds a "| less" to every command so you
+ get to see paged output if needed, except it is built into eshell.
+ - A: It is a cool idea, but while I tried it when Mickey first
+ published that idea, it didn't stay in my workflow.
+- Q: Is $$ a built-in feature of eshell or did you add it?
+ - A: The Eshell built-in version of $$ doesn't always work, so
+ I wrote an updated version that seems to work better (see
+ <https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org#last-results>)
+ ... I'm pretty sure that if you do a command with a lot of
+ output, it may not work at all, not just get the last of that
+ output. Mine is just a better hack. :-D
+- Q: Do you ever fallback to terminals/shells outside Emacs, and if so
+ in what circumstances?
+ - A: I boot up with a Terminal to mount remote file systems, as my
+ Emacs configuration isn't always stored locally on my machine.
+ I'll admit that I sometimes leave the Emacs Garden, but doing
+ anything interesting become frustrating when you have to leave
+ the keyboard for the mouse.
+- Q: What are the less well-oiled parts of Eshell or edge case issues
+ that you encounter if any?
+ - A: We should make a list and start working on them.
+- Q:Do you have ways to improve eshell vterm interop like sharing
+ command history and directory tracking?
+ - A: I don't. If I am going to SSH somewhere, I just start vterm,
+ and haven't thought about any interop.
+- Q: Where can I find your eshell/do command? Probably you also have another bunch of interesting Eshell helpers.
+ - https://gitlab.com/howardabrams/hamacs/-/blob/main/ha-eshell.org?plain=1#L741-761
+
+Other comments from IRC:
+
+- Impressive. eshell is an emacs REPL! I knew I could issue some emacs commands but not this level of interactivity. Thanks!
+- The real elisp REPL is ielm, but eshell is more generally useful.
+- eshell is a REPL focused on the specific niche of shell. ielm's the pure elisp repl, and it rocks.
+- yes. i know ielm. just hadn't realised how powerful eshell is.
+- howard-abrams : every time I've watched a talk of yours over the years, Emacs/Org-mode has absorbed one more use cases of mine, and made them be in literate form. I'm down to Emacs and a web browser, so I'm looking ahead to your talk about the Web in Emacs :)
+- You can also leverage org-mode source blocks tu turn outputs into inputs to other blocks so, plenty of alternatives to pipes
+- Wow! Eshell is awesome! I have just learnt more tips! Thanks howard-abrams!
+- I think of Eshell as my *universal* machine REPL, i.e. not just ielm for emacs/elisp nor a shell for the machine, but *both* emacs/elisp and the OS/env.. In that way it's quite neat.
+- howard-abrams: thank you, very inspiring! I've always found 'normal' command line usage somewhat cumbersome and am certanly going to look at the code
+- I really like eshell but I sometimes find the aliases a bit hard to write. alias f if $* {find-file $1; for i in {cdr {flatten-tree $*}} {find-file-other-window $i}} {echo "No files"} - Should probably use Elisp instead
+ - I think the aliases are almost completely broken, and only seem to work in the barest of cases.
+ - Yes, in particular the Lisp part is broken. In combination with $*
+ - I agree that you should write a function for that. Because as I mentioned in my talk, aliases don't accept $* at all.
+ - Oh, they do. This alias works. I don't recall the reason why I wrote this as an alias. I probably just wanted to use an alias where possible.
+ - Huh ... that works? I need to try it out. I couldn't get that working, so that is why I wrote the function that I did.
+- watching your talk now; TIL /dev/kill and /devl/clip
+
+[[!inline pages="internal(2022/info/eshell-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/eshell-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/fanfare.md b/2022/talks/fanfare.md
new file mode 100644
index 00000000..24e2ed4b
--- /dev/null
+++ b/2022/talks/fanfare.md
@@ -0,0 +1,179 @@
+[[!sidebar content=""]]
+[[!meta title="Fanfare for the Common Emacs User"]]
+[[!meta copyright="Copyright &copy; 2022 John Cummings"]]
+[[!inline pages="internal(2022/info/fanfare-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Fanfare for the Common Emacs User
+John Cummings (IRC: jrootabega, <mailto:john@rootabega.net>)
+
+[[!inline pages="internal(2022/info/fanfare-before)" raw="yes"]]
+
+
+# Table of Contents
+
+
+
+Emacs enables Emacs developers to produce some very impressive and
+useful things. It can also inspire examination and discussion of
+profound ideals. But what about the everyday user who may not always
+feel that they live up to these examples? What about the "dark matter"
+of the Emacs universe? There's a lot of us out there, and we have an
+important effect, but it may be hard to see it. What about life after
+the EmacsConf inspiration has started to fade, and we find ourselves
+working much the same way as we always have? In this
+not-very-technical short reflection (perhaps just a personal
+projection pep talk), I want to recognize and celebrate the experience
+of these users.
+
+Colored by my personal unremarkable usage of Emacs, I'll describe some
+of the practices and "imperfections" that everyday Emacs users might
+experience &#x2013; trying to create and remember keybindings, writing many
+quick hacky functions to solve miscellaneous problems, trying to learn
+more than we forget, half-implemented ideas, messy organic .emacs,
+etc. I'll frame these positively, as a great way to use Emacs for our
+own personal mundane needs, and a sign of our own dedication and
+pragmatism. I'll opine on how Emacs is, conversely, a perfect platform
+for this kind of usage in addition to highly-organized packages and
+modes.
+
+
+# Discussion
+
+## Notes
+
+- What a wonderful talk.  You knocked it out of the park.  Thank you
+ so much.
+- "Psychic baggage" with emacs-- awareness of possibilities left
+ behind and opportunity costs.
+- Possibly related:
+ - <https://www.youtube.com/watch?v=yJDv-zdhzMY> Mother of all demos
+ - <https://www.youtube.com/watch?v=oMpf0ilQ9Lk&list=PLomc4HLgvuCWuJVVwsT8pbLWYR-n3G8bH&index=17> EmacsConf 2019 - 18 - Object oriented spreadsheets with example applications - David O'Toole (dto)
+ - <https://agregore.mauve.moe/> peer to peer browser
+ - <https://emacspeak.sourceforge.net/>
+ - The Common Lisp Omnificent GUI Builder - Online Lisp Meeting #13, 11.01.2022 <https://www.youtube.com/watch?v=pkQ-WlzQudw>
+ - <https://gtoolkit.com/>
+ - <https://janet-lang.org/>
+
+## Questions and answers
+
+- Q: I have not only One config, but multiple configs in different
+ locations... .emacs/init.el and .emacs.d/init.el and different
+ Python installs in different places. Is this something that I should
+ take care of earlier rather than later? I need to pay someone to
+ "consult" on my config. Is this an existing business? Is there a
+ place to barter a screen share for something else of value in
+ exchange? In any case, thank you for giving permission to have fun
+ without the need for too much structure. 
+ - A: Good quetion... I'm humbled and will give it some thought.
+ The Buddy emacs system would be a good place to start. 
+ - Now after having thought some more, I think it depends on your
+ comfort level when the best time to reorganize your various
+ environments and configs is. Separate configs and installs might
+ be better separate if they are just doing different things or
+ represent different mental contexts. If the separation starts
+ causing stress or extra effort, at least you then know you have
+ a good reason for merging them
+ - and won't be doing it just for its own sake. I still think the
+ Emacs Buddy Initiative sounds like a great way for people to
+ trade eyeballs on stuff like this. And there's always the
+ famous rule: just post it somewhere and say it's the best
+ approach, and you'll get dozens of people giving you free
+ advice on how to improve it!
+- Q:How would you suggest Emacs developers (including package
+ developers) interface with non-developer users and get their
+ insights to help in shaping future Emacs functionality?  What sorts
+ of things make new functionality more welcoming to non-technical
+ users?
+ - A: From what I can tell on the Emacs mailing lists, reaching out
+ to all types of users is already seen as important and results
+ in collaborations like the recent Emacs Survey. As far as going
+ further than that, maybe a space for users of the package where
+ all skill/comfort levels are welcomed and comfortable
+ volunteering feedback? I wonder how many users might not even be
+ interested in ever giving feedback just because they prefer to
+ keep to themselves.
+ - Side note.: sourchut allows multiple repos one one mailing list
+ for smaller packages
+- Q: It's my impression that many "common" Emacs users are
+ migrating to other editors in past years. The reasons cited include
+ configurations growing out of control, and the general
+ rough-around-the-edges feel of Emacs that they've been putting up
+ with for a while. (Maybe this isn't a new phenomenon) As a result,
+ Emacs is becoming home to a *smaller* set of people who are ever
+ *more* invested in it. Do you share this observation? If you do,
+ what do you think of this trend?
+ - A: My impression has been that there has been a large net
+ increase in Emacs users in the last, let's say, 5-10 years,
+ probably due to the popularity of tools including, but not
+ limited to, org, starter kits, magit, others I can't remember
+ due to a tired brain. One of the hypotheses that I couldn't fit
+ in my talk was that I doubted that anyone ever really left
+ Emacs.  Maybe they do some other tasks with other tools (I
+ myself already don't use it for all my programming), but they
+ always have some use for it. That could be wrong, of course. I
+ agreee that there may be subpopulations of Emacs users whose
+ proportions and philosophies change over time. I think the
+ coming years will be about those groups finding common ground,
+ but I think the overall population is doing OK at the moment. I
+ could just be too committed to Emacs' utility to notice other
+ things too much.
+- Q:Do you consider that using one of the starter packages (doom
+ emacs, spacemacs, etc.) affect that learning process that you
+ mentioned? or is it a good thing from your perspective?
+ - A: I don't have personal experience with a starter package, but
+ I'm somewhat familiar with how those two at least work. I think
+ any way is fine for getting started, and would just make your
+ experience different when and if you started to outgrow it or
+ get curious. Again, I'm technically ignorant about this, but my
+ gut tells me that you could also learn and build a very advanced
+ experience completely inside those kits, and that would still be
+ a great thing, and comparing it to "standard" Emacs might be
+ more of an academic distinction for those people. If they picked
+ those up with the INTENTION of one day outgrowing them, that's
+ also interesting. I think it would be a personal matter whether
+ that was the right choice. I think at least SOME people would
+ feel that they should have just went straight to standard Emacs,
+ but I don't know/feel strongly enough to have a strong belief.
+- Q: Would a "Tip of the Day" package or some elaboration on that
+ idea in Emacs help discovery for lay users? Does that already exist?
+ - A: I'm sure something like that exists, but at the time of the
+ question I could not think of one. I think something like that
+ could help if you got the tips that were appropriate for your
+ situation at the time. I know in other applications, I often end
+ up seeing "Tip of the Day" as something that gets in my way,
+ even if I enabled it myself. Maybe a tip-on-demand? It might be
+ hard to provide a stream of tips that can stay interesting and
+ appropriate for a person's skill level for a long time, and be
+ available when they were receptive to them. Now I'm having
+ ideas about how to show context-sensitive animated tips. Perhaps
+ one day I will have a better answer!
+ - There is <https://nitter.net/emacstips>
+ - <https://github.com/emacs-dashboard/emacs-dashboard> was also
+ suggested by a listener  
+- Q: what is a fanfare
+ - A: it's based on an American piece of music "Fanfare for the Common Man" by Aaron Copland
+
+## Other discussions from IRC
+- this is a GREAT talk!
+- yes, really nice!
+- Every single point I'm like "yes! THIS"
+- This is as true of life as it is of emacs. Life imitates art imitates emacs...
+- Resonates with me from having used emacs for a 5+ years
+- Great talk!!
+- Can't argue with this great reminder that a messy perennially-evolving Emacs setup/config is the norm rather than the exception!
+- understanding source control is such a high bar for lay folk though, makes me think emacs by default setup version control for config files
+- Hmmm, *someone* could experiment with detecting what version control is available locally then using vc to automatically source control changes to our conf..
+- Also, over the last few years, some credit should go to Doom/Spacemacs for bringing new people into the fold that may otherwise not have given Emacs a second look with more the vanilla experience
+ - The more I think about it, the more having use-case packages with virtual machines makes a lot of sense. A sort of all in one package that can be used "out of the box" with an included guide.
+ - I like using starter packs with scratch init. It's a great way to know how far you can push emacs:)
+ - agree, I started with Spacemacs, then moved to Doom Emacs, and I just love it, I agree that starting from scratch was too much challange to start, but now I am not sure if I should try that path or is not actually worth it (considering that I understand much more about the editor and the programming language)
+
+[[!inline pages="internal(2022/info/fanfare-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/fanfare-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/grail.md b/2022/talks/grail.md
new file mode 100644
index 00000000..20e7f6d5
--- /dev/null
+++ b/2022/talks/grail.md
@@ -0,0 +1,322 @@
+[[!sidebar content=""]]
+[[!meta title="GRAIL---A Generalized Representation and Aggregation of Information Layers"]]
+[[!meta copyright="Copyright &copy; 2022 Sameer Pradhan"]]
+[[!inline pages="internal(2022/info/grail-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# GRAIL---A Generalized Representation and Aggregation of Information Layers
+Sameer Pradhan (he/him)
+
+[[!inline pages="internal(2022/info/grail-before)" raw="yes"]]
+[[!template id="help"
+volunteer=""
+summary="Q&A could be indexed with chapter markers"
+tags="help_with_chapter_markers"
+message="""The Q&A session for this talk does not have chapter markers yet.
+Would you like to help? See [[help_with_chapter_markers]] for more details. You can use the vidid="grail-qanda" if adding the markers to this wiki page, or e-mail your chapter notes to <emacsconf-submit@gnu.org>."""]]
+
+
+The human brain receives various signals that it assimilates (filters,
+splices, corrects, etc.) to build a syntactic structure and its semantic
+interpretation. This is a complex process that enables human communication.
+The field of artificial intelligence (AI) is devoted to studying how we
+generate symbols and derive meaning from such signals and to building
+predictive models that allow effective human-computer interaction.
+
+For the purpose of this talk we will limit the scope of signals to the
+domain to language&#x2014;text and speech. Computational Linguistics (CL),
+a.k.a. Natural Language Processing (NLP), is a sub-area of AI that tries to
+interpret them. It involves modeling and predicting complex linguistic
+structures from these signals. These models tend to rely heavily on a large
+amount of ``raw'' (naturally occurring) data and a varying amount of
+(manually) enriched data, commonly known as ``annotations''. The models are
+only as good as the quality of the annotations. Owing to the complex and
+numerous nature of linguistic phenomena, a divide and conquer approach is
+common. The upside is that it allows one to focus on one, or few, related
+linguistic phenomena. The downside is that the universe of these phenomena
+keeps expanding as language is context sensitive and evolves over time. For
+example, depending on the context, the word ``bank'' can refer to a financial
+institution, or the rising ground surrounding a lake, or something else. The
+verb ``google'' did not exist before the company came into being.
+
+Manually annotating data can be a very task specific, labor intensive,
+endeavor. Owing to this, advances in multiple modalities have happened in
+silos until recently. Recent advances in computer hardware and machine
+learning algorithms have opened doors to interpretation of multimodal data.
+However, the need to piece together such related but disjoint predictions
+poses a huge challenge.
+
+This brings us to the two questions that we will try to address in this
+talk:
+
+1. How can we come up with a unified representation of data and annotations that encompasses arbitrary levels of linguistic information? and,
+
+2. What role might Emacs play in this process?
+
+Emacs provides a rich environment for editing and manipulating recursive
+embedded structures found in programming languages. Its view of text,
+however, is more or less linear&#x2013;strings broken into words, strings ended by
+periods, strings identified using delimiters, etc. It does not assume
+embedded or recursive structure in text. However, the process of interpreting
+natural language involves operating on such structures. What if we could
+adapt Emacs to manipulate rich structures derived from text? Unlike
+programming languages, which are designed to be parsed and interpreted
+deterministically, interpretation of statements in natural languages has to
+frequently deal with phenomena such as ambiguity, inconsistency,
+incompleteness, etc. and can get quite complex.
+
+We present an architecture (GRAIL) which utilizes the capabilities of Emacs
+to allow the representation and aggregation of such rich structures in
+a systematic fashion. Our approach is not tied to Emacs, but uses its many
+built-in capabilities for creating and evaluating solution prototypes.
+
+
+# Discussion
+
+## Notes
+
+- I will plan to fix the issues with the subtitles in a more
+ systematic fashion and make the video available on the
+ emacsconf/grail  URL. My sense is that this URL will be active for
+ the foreseeable future.
+- I am going to try and revise some of the answers which I typed quite
+ quickly and may not have provided useful context or might have made
+ errors.
+- .
+- Please feel free to email me at pradhan@cemantix.org for any futher
+ questions or discussions you may want to have with me or be part of
+ the grail community (doesn't exist yet :-), or is a community of 1)
+- .
+
+## Questions and answers
+
+- Q: Has the '92 UPenn corpus of articles feat been reproduced over
+ and over again using these tools?
+ - A: 
+ - Yes. The '92 corpus only annotated syntactic structure. It was
+ probably the first time that the details captured in syntax were
+ selected not purely based on linguistic accuracy, but on the
+ consistency of such annotations across multiple annotators. This
+ is often referred to as Inter-Annotator Agreement. The high IAA
+ for this corpus was probably one of the reasons that parsers
+ trained on it got accuracies in the mid 80s or so. Then over the
+ next 30 years (and still continuing..) academics improved on
+ parsers and today the performance on the test set from this
+ corpus is somewhere around F-score of 95. But this has to be
+ taken with a big grain of salt given overfitting and how many
+ times people have seen the test set. 
+ - One thing that might be worth mentioing is that over the past 30
+ years, there have been many different phenomena that have been
+ annotated on a part of this corpus. However, as I mentioned
+ given the difficulty of current tools and representations to
+ integrate disparate layers of annotations. Some such issues
+ being related to the complexity of the phenomena and others
+ related to the brittleness of the representations. For example,
+ I remember when we were building the OntoNotes corpus, there was
+ a point where the guidelines were changed to split all words at
+ a 'hyphen'. That simple change cause a lot of heartache
+ because the interdependencies were not captured at a level that
+ could be programmatically manipulated. That was around 2007 when
+ I decided to use a relational database architecture to represent
+ the layers. The great thing is that it was an almost perfect
+ representation but for some reason it never caught up because
+ using a database to prepare data for training was something that
+ was kind of unthinkable 15 years ago. Maybe? Anyway, the format
+ that is the easiest to use but very rigid in the sense that you
+ can quickly make use of it, but if something changes somewhere
+ you have no idea if the whole is consistent. And when came
+ across org-mode sometime around 2011/12 (if I remember
+ correctly) I thought it would be a great tool. And indeed about
+ decade in the future I am trying to stand on it's and emacs'
+ shoulders.
+ - This corpus was one of the first large scale manually annotated
+ corpora that bootstrapped the statistical natural language
+ processing era.  That can be considered the first wave... 
+ SInce then, there have been  more corpora built on the same
+ philosophy.  In fact I spent about 8 years about a decade ago
+ building a much larger corpus with more layers of information
+ and it is called the OntoNotes. It covers Chinese and Arabic as
+ well (DARPA funding!) This is freely available for research to
+ anyone anywhere. that was quite a feat. 
+- Q:Is this only for natural languagles like english or more general?
+ Would this be used for programing laungages.
+ - A: I am using English as a use case, but the idea is to have it
+ completely multilingual. 
+ - I cannot think why you would want to use it for programming
+ languages. In fact the concept of an AST in programming
+ languages was what I thought would be worth exploring in this
+ area of research.  Org Mode, the way I sometimes view it is a
+ somewhat crude incarnation of that and can be sort of manually
+ built, but the idea is to identify patterns and build upon them
+ to create a larger collection of transformations that could be
+ generally useful.  That could help capture the abstract
+ reprsentation of "meaning" and help the models learn better. 
+ - These days most models are trained on a boat load of data and no
+ matter how much data you use to train your largest model, it is
+ still going to be a small spec in the universe of ever growing
+ data that are are sitting in today. So, not surprisingly, these
+ models tend to overfit the data they are trained on.  
+ - So, if you have a smaller data set which is not quite the same
+ as the one that you had the training data for, then the models
+ really do poorly. It is sometimes compared to learning a sine
+ function using the points on the sine wave as opposed to
+ deriving the function itself. You can get close, but then then
+ you cannot really do a lot better with that model :-)
+ - I did a brief stint at the Harvard Medical School/Boston
+ Childrens' Hospital to see if we would use the same underlying
+ philosophy to build better models for understanding clinical
+ notes. It would be an extremely useful and socially beneficial
+ use case, but then after a few years and realizing that the
+ legal and policy issues realted to making such data available on
+ a larger scale might need a few more decades, I decided to step
+ off that wagon (if I am using the figure of speech correctly).
+ - .
+ - More recently, since I joined the Linguistic Data Consortium, we
+ have been looking at spoken neurological tests that are taken by
+ older people and using which neurologists can predict a
+ potential early onset of some neurological disorder. The idea is
+ to see if we can use speech and langauge signals to predict such
+ cases early on. The fact that we don't have cures for those
+ conditions yet, the best we can do it identify them earlier with
+ the hope that the progression can be slowed down.
+ - .
+ - This is sort of what is happening with the deep learning hype.
+ It is not to say that there hasn;t been a significant
+ advancement in the technologies, but to say that the models can
+ "learn" is an extremely overstatement. 
+
+
+
+- Q: Reminds me of the advantages of pre computer copy and paste. Cut
+ up paper and rearange but having more stuff with your pieces.
+ - A: Right! 
+ - Kind of like that, but more "intelligent" than copy/paste,
+ because you could have various local constraints that would
+ ensure that the information that is consistent with the whole. I
+ am also ensioning this as a usecase of hooks. And if you can
+ have rich local dependencies, then you can be sure (as much as
+ you can) that the information signal is not too corrupted.
+ - .
+ - I did not read the "cut up paper" you mentioned. That is an
+ interesting thought. In fact, the kind of thing I was/am
+ envisioning is that you can cut the paper a million ways but
+ then you can still join them back to form the original piece of
+ paper. 
+
+```{=html}
+<!-- -->
+```
+
+
+
+- Q: Have you used it on some real life situation? where have you experimented with this?
+ - A: NO. 
+ - I am probably the only person who is doing this crazy thing. It
+ would be nice, or rather I have a feeling that something like
+ this, if worked upon for a while by many might lead to a really
+ potent tool for the masses. I feel strongly about giving such
+ power to the users, and be able to edit and share the data
+ openly so that they are not stuck in some corporate vault
+ somewhere :-) One thing at a time.
+ - .
+ - I am in the process of creating a minimally viable package and
+ see where that goes.
+ - .
+ - The idea is to start within emacs and orgmode but not
+ necessarily be limited to it.
+
+- Q:Do you see this as a format for this type of annotation
+ specifically, or something more general that can be used for
+ interlinear glosses, lexicons, etc? -- Does wordsense include a
+ valence on positive or negative words-- (mood) . 
+
+- Interesting. question.  There are sub-corpora that have some of this
+ data. 
+
+- - A: Absolutely. IN fact, the project I mentioned OntoNotes has
+ multiple layers of annotation. One of them being the
+ propositional structure which uses a large lexicon that covers
+ about 15K verbs and nouns and all their argument structures that
+ we have been seen so far in the corpora. There is about a
+ million "propositions" that have been released recently (we
+ just recently celebrated a 20th birthday of the corpus. It is
+ called the PropBank. 
+
+- There is an interesting history of the "Banks" . It started with
+ Treebank, and then there was PropBank (with a capital B), but then
+ when we were developing OntoNotes which contains:
+ - Syntax
+ - Named Entities
+ - Coreference Resolutoion
+ - Propositions
+ - Word Sensse 
+
+- All in the same whole and across various genre... (can add more
+ information here later... )
+
+- Q: Are there parallel efforts to analyze literary texts or news
+ articles? Pulling the ambiguity of meaning and not just the syntax
+ out of works? (Granted this may be out of your area-- ignore as
+ desired)
+ - A: :-) Nothing that relates to "meaning" falls too far away
+ from where I would like to be. It is a very large landscape and
+ growing very fast, so it is hard to be able to be everywhere at
+ the same time :-)
+ - .
+ - Many people are working on trying to analyze literature.
+ Analyzing news stories has been happening since the beginning of
+ the statistical NLP revolution---sort of linked to the fact that
+ the first million "trees" were curated using WSJ articles :-)
+
+- Q: Have you considered support for conlangs, such as Toki Pona?  The
+ simplicity of Toki Pona seems like it would lend itself well to
+ machine processing.
+ - A:  This is the first time I hearing of conlangs and Toki Pona.
+ I would love to know more about them to say more, but I cannot
+ imaging any langauge not being able to use this framework.
+ - conlangs are "constructed languages" such as Esperanto ---
+ languages designed with intent, rather than evolved over
+ centuries.  Toki Pona is a minimal conlang created in 2001, with
+ a uniform syntax and small (<200 word) vocabulary.
+ - Thanks for the information! I would love to look into it.
+
+- Q: Is there a roadmap of sorts for GRAIL?
+ - A: 
+ - Yes. I am now actually using real world annotations on larg
+ corpora---both text and speech and am validating the concept
+ further. I am sure there will be some bumps in the way, and I am
+ not saying that this is going to be a cure-all, but I feel
+ (after spending most of my professional life building/using
+ corpora) that this approach does seem very appealing to me. The
+ speed of its development will depend on how many buy into the
+ idea and pitch in, I guess.
+
+- Q: How can GRAIL be used by common people?
+ - A: I don't think it can be used by common people at the very
+ moment---partly because most "common man" has never heard of
+ emacs or org-mode. But if we can valide the concept and if it
+ does "grow legs" and walk out of the emacs room into the
+ larger universe, then absolutely, anyone who can have any say
+ about langauge could use it. And the contributions would be as
+ useful as the consistency with which one can capture a certain
+ phenomena.
+ - .
+ - Everytime you use a capta these days, the algorithms used by the
+ company storing the data get slightly better. What if we could
+ democratize this concept. That could lead to fascinating things.
+ Like Wikipedia did for the sum total of human knowledge.
+
+- Q: 
+ - A: 
+
+
+
+
+[[!inline pages="internal(2022/info/grail-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/grail-nav)" raw="yes"]]
+
+[[!taglink CategoryLinguistics]]
diff --git a/2022/talks/handwritten.md b/2022/talks/handwritten.md
new file mode 100644
index 00000000..962ec4ca
--- /dev/null
+++ b/2022/talks/handwritten.md
@@ -0,0 +1,138 @@
+[[!sidebar content=""]]
+[[!meta title="How to incorporate handwritten notes into Emacs Orgmode"]]
+[[!meta copyright="Copyright &copy; 2022 Bala Ramadurai"]]
+[[!inline pages="internal(2022/info/handwritten-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+[[!img /i/2022-handwritten-title.png alt="title" size="600x"]]
+
+# How to incorporate handwritten notes into Emacs Orgmode
+Bala Ramadurai (his/him, <mailto:bala@balaramadurai.net>)
+
+[[!inline pages="internal(2022/info/handwritten-before)" raw="yes"]]
+
+
+[[!img /i/2022-handwritten-abstract.png alt="title" style="max-width: 100%; height: auto"]]
+
+Research suggests that note taking is most effective when done by hand. Yes, handwritten notes. Certainly, typewritten or typed out notes are more efficient, however notes written by hand are retained by the human brain much longer.
+
+Integrating handwritten notes into a computer leaned productivity workflow is tricky. Also, in terms of hardware, if all you have is a smartphone, then we need to deal with the situation a bit differently.
+
+This talk will introduce to you a simple system to integrate handwritten notes into your org-mode (Emacs) based productivity workflow.
+
+- Gist of the problem of dealing with handwritten notes
+- Advantages of handwritten notes
+- Emacs org mode workflow
+ - Option 1: Hardware for handwriting not available
+ - Option 2: Hardware for handwriting available
+
+
+# Discussion
+
+## Notes
+
+- Tesseract is a free and open source tool to do OCR (may or may not
+ convert handwriting)
+ - <https://github.com/tesseract-ocr/tesseract>
+- Karl Voit: I'm not practicing handwritten OCR at the moment. From
+ what I've read, offline handwriting OCR (offline OCR = not
+ recognizing while writing but form a (scanned) document) is only
+ implemented in a good way in highly proprietary services such as
+ Microsoft OneNote and Evernote and Apple Notes. Since I don't use
+ those services on purpose
+ (<https://karl-voit.at/2018/04/21/end-of-OneNote/>), I don't have
+ personal experience. I'm still hoping that there will be a FOSS
+ solution one fine day.
+ - I'm (rarely) taking notes on my BOOX Note Air e-ink tablet
+ (which I love). It has decent on-device offline-OCR but it's
+ really tedious to use it. So usually, I keep the notes as PDF
+ file and don't care to OCR it. Not great but at the moment I
+ can live with it.
+ - After all: I'm much faster when typing on my keyboard
+ (<https://karl-voit.at/2021/03/21/advantage2-plans/>) - so if
+ there is no graphical information to be captured, I'm faster
+ typing in Org mode than writing by hand.
+ - Do you have a blog article about that? I own a BOOX Air myself but I can't think of a viable workflow using it with handwriting + OCR on-device.
+- <https://capture2text.sourceforge.net/> \-- another potential OCR
+ solution that is FOSS, but supported only on Windows OS
+- mathpix seems to support OCR now as well:
+ - <https://mathpix.com/blog/mathpix-text-ocr>
+ - <https://mathpix.com/handwriting-recognition>
+- Leo Vivier owns an e-ink tablet: Boox Max Lumi (almost A4-size,
+ bigger brother of Boox Note Air)
+- Digital pens and digitizing platforms help to get your notes from
+ analogue into digital form: 
+ - <https://www.wired.com/gallery/best-smart-pens/>
+ - Also, livescript uses special pens and tablets (erasable and
+ correctable), transcribes your handwriting
+
+- [LiveScribe](https://www.amazon.com/Livescribe-Single-Subject-Notebook-4-pack/dp/B001AALJ1I/ref=asc\_df\_B001AALJ1I/?tag=hyprod-20&linkCode=df0&hvadid=167151358503&hvpos=&hvnetw=g&hvrand=14286771041209503377&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9027973&hvtargid=pla-359920653567&psc=1)
+
+- I always love the way Bala records his talks :D
+- i read every word
+- Apple notes scanning is working very well these days.
+- OneNote is super locked-in these days.
+- Thank you Prof!
+- Lol @ just type out the damn note XD. It's a good point, but I have over a year of handwritten notes that I haven't bothered typing out ;-)
+- I have had some success with tesseract and my handwritten notes
+- has anyone training such a OCR system to make it more accurate for your handwriting or additional symbols.
+- shh I've been using Google Cloud Vision to get the text out of my sketches =)
+- wow what a refined video. really solid editing. this is enjoyable to watch
+- would it be better to use OCR or to read the notes and use speech-to-text?
+- Does it work well with free software, klavul
+- hmh, there seems to be plugin to integrate orgmode with xournalpp ( https://gitlab.com/vherrmann/org-xournalpp )
+- I use capture2text , made a small wrapper
+- Would it be possible to make a libre software which could detect handwritten notes as does the Boogie Board and run Emacs on it?
+ - other: people with short-term requirements and who don't care are using great OCR with cloud-based lock-in services. Therefore, there isn't much incentive to create FOSS.
+
+## Questions and answers
+
+- Q: How do you link the notes together so that you could search
+ through them in the future?
+ - A: I'm still in the process of trying to link these topics. Once you convert these notes from handwritten text --or if you have a handwriting device and you can convert it into text-- import it into org-roam and link it the way that you'd normally do it. I started a week ago linking these texts. That would be my response-- which leads into the next question...
+- Q: Is it necessary to OCR your handwriting or change the way you
+ write to use your workflow? 
+ - A: Yes, this is a necessary step. You have to conduct optical character recognition. Because otherwise, indexing and linking becomes a problem later on. If it's just for you and reading your own text and you browse it and read it when you want, then that's different. You don't have to worry about the OCR-- just import the jpeg or png or whatever and put it under the org-mode or org-roam headline and you should be good to go.
+ However, if you want to search and link then OCR becomes necessary. I'm unfamiliar with anything inside the emacs ecosystem that does OCR. I use tools like OneNote and I think Google Keep does that. I use an external tool to convert if you want linking and indexing. For me sometimes screenshots and handwritten notes have to go together. The key is to have those together.
+- Q: What about Searching notes, notes to text while being offline
+ - A: Yes, there are no two ways about it. Only proprietary software like Google Keep and Microsoft, perhaps Dropbox does it. I would say it's absolutely mandatory for you to convert this... unless the emacs org mode community puts their heads together. If you want me to help by reviewing a package I am keen on doing that and trying it out.
+ OneNote can search with OCR, as far as Bala is aware.
+- Q: Those articles on notetaking seem interesting. Could we get a link
+ for them?
+ - A: I will definitely drop a link in the etherpad after the talk to make it available. A good friend in France shared this with me. He had a whole bunch of articles that supported my thesis. (an email was sent with a follow-up request on 10 December)
+- Q: Have you looked at taking handwritten notes on a tablet like
+ Xournal++
+ - A: [Not yet] The only tools I've used have been OneNote and Google keep. For now, the dropbox method for me is to write the notes, then take a photo with a mobile phone camera, upload it to dropbox-- why dropbox-- because it allows jpeg to be uploaded. I find pdf very cumbersome. I then import it into OneNote which converts it into digitized text. Then I take and move it from the inbox into the org mode system. That's how my workflow is. I have started to experiment with other devices and workflows, but not enough to give you intelligent advice.
+ Q: Have you tried out the "Remarkable" device and figured out how to link the files back into org mode constructively yet?
+ - A: Yes, I've heard of that device as well as Book and Amazon has come out with the writing Kindle. These devices do exist, but I'm not sure if they convert to text and put it in a format you can import into org mode. This would be nice, if you can integrate it into emacs. I use dropbox to do all the good stuff. I can certainly do that.
+- Q: Something to think about is handwritten and org transcribed notes
+ de-duplication for searching, do you want one or the other, both?
+ - A: Thank you for asking this. Transcription has become very important not only transcribing written but voice notes. In spite of so many tools out there, I find it extremely cumbersome to transcribe voice notes. It would be nice if we had voice, and handwritten transcription helps. Actually that's a great idea. I would be very interested in voice and handwriting. I've seen this in software in OneNote and transcription packages. This is really important and a great idea. I volunteer to test this out. Right now I find it very difficult to transcribe, so if this can do it for us that would be amazing.
+ - side note: org-remark could be useful for this
+ <https://github.com/nobiot/org-remark>
+- Q: How fancy have your imports of handwritten notes been for org mode?
+ (Bullets, TODO , org tables etc...)
+ - A: Bala uses a star on paper when writing tasks and makes
+ them into org tasks during manual transcription. He also uses dates for this. I know then that I need to keep track of those things in a task. It would be really cool to OCR org constructs from paper. TODO items etc. Doing away with all of the intermediate steps would be nice. A writing org-mode as if it was a human language instead of something that is restricted to a computer.
+ - Just to glorify handwriting. I decided that I would hand write what I was going to talk about. The handwritten notes turned out much better than my plain vanilla talk. I even wrote some jokes this way. Handwriting helps thinking and speaking with an audience. Computers have led to handwriting being less important, but Bala thinks
+ they're very efficient and important :)
+- Q: How often do you instead use keyboard entry to type in and
+ summarize your notes? Would you consider that a suitable approach
+ for yourself, e.g. at the end of the day?
+ - A: When in a hurry, Bala types notes directly into Org Mode.
+ - He has not yet established a habit of daily journaling but
+ would like to do so in the future. I have a shortcut for org-roam dailies that shows up in blue text on the calendar. Daily writing would be helpful.
+ - Handwriting can be easier depending on language/script.
+ Perhaps handwriting is best for non-Roman script. My mother tongue has a script that is not English.
+- Q: Do you have any ideas about mindmapping and incorporating those notes into your process? I've used nebo and other tools, but wish I had a better way of extracting key words.
+ - A: I have used mindmapping which is hierarchical, in fact I use something called function maps. Just like org-roam and interacting relationships. All of this I've been drawing on my laptop screen. All of this helps me. I don't digitally convert it. It helps me and is a lot easier. When I need to add to it I can do so. I find that doing it on a device and retaining it without conversion is best. Converting does not help me at all. YOu can select it, with a lasso select. Those things can be done. I like it to be that way. Then I link it into org mode.
+- Q: Bala, sorry to join late to the party, you might have answer. Do you train your own OCR?
+
+
+[[!inline pages="internal(2022/info/handwritten-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/handwritten-nav)" raw="yes"]]
+
+ [[!taglink CategoryOrgMode]]
diff --git a/2022/talks/haskell.md b/2022/talks/haskell.md
new file mode 100644
index 00000000..c5307788
--- /dev/null
+++ b/2022/talks/haskell.md
@@ -0,0 +1,45 @@
+[[!sidebar content=""]]
+[[!meta title="Haskell code exploration with Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Yuchen Pei"]]
+[[!inline pages="internal(2022/info/haskell-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Haskell code exploration with Emacs
+Yuchen Pei (he/him/himself/his/his, IRC: dragestil, <mailto:id@ypei.org>)
+
+[[!inline pages="internal(2022/info/haskell-before)" raw="yes"]]
+
+
+In this talk I will describe and demonstrate some tools for Haskell
+development using Emacs, including code exploration using hcel and
+haddock org documentation generation using haddorg.
+
+# Bio
+
+Yuchen is a programmer and mathematician. He co-maintains [librejs](https://www.gnu.org/software/librejs/index.html) and
+[h-node.org](https://h-node.org), and a couple of Emacs packages at GNU ELPA. He is also a
+licensing volunteer with the FSF. In his personal time, he likes to
+program in Haskell and elisp and license all of his programming work
+under AGPLv3+ (see <https://g.ypei.me>). He can be reached at
+<id@ypei.org>.
+# Discussion
+
+## Notes
+
+- <https://gitlab.com/tseenshe/haskell-tng.el>
+- <https://gitlab.com/tseenshe/hsinspect>
+
+## Questions and answers
+
+- Q:Is the indexing faster when re-indexing? Would it be too slow to
+ re-index on-demand?
+
+
+[[!inline pages="internal(2022/info/haskell-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/haskell-nav)" raw="yes"]]
+
+[[!taglink CategoryCoding]]
diff --git a/2022/talks/health.md b/2022/talks/health.md
new file mode 100644
index 00000000..230e3682
--- /dev/null
+++ b/2022/talks/health.md
@@ -0,0 +1,105 @@
+[[!sidebar content=""]]
+[[!meta title="Health data journaling and visualization with Org Mode and gnuplot"]]
+[[!meta copyright="Copyright &copy; 2022 David O'Toole"]]
+[[!inline pages="internal(2022/info/health-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Health data journaling and visualization with Org Mode and gnuplot
+David O'Toole (he/him, <https://emacs.ch/@dto>)
+
+[[!inline pages="internal(2022/info/health-before)" raw="yes"]]
+
+
+**Note: The correct name of gnuplot is gnuplot, not GNUplot. It is not GNU software, nor is it licensed under a GNU license. [Details](http://gnuplot.info/faq/index.html#x1-70001.2)**
+
+"GNU Emacs with Org Mode and gnuplot offer a complete Free Software
+solution for tracking health information based on a daily data
+journal. With Org capture templates and data tables, you can easily
+enter facts for each day such as hours of sleep, minutes of exercise,
+doses of medication, weight, or even add freeform notes. Through the
+use of subjective numeric scores you can track symptoms like stress,
+anxiety, or pain. Org Mode's gnuplot support enables you to visualize
+the data in order to spot correlations and evaluate trends. The use of
+detailed record-keeping and graphing can help you communicate with
+health care providers."
+
+A reusable org template will be provided at:
+<https://gitlab.com/dto/health-template>
+
+
+# Discussion
+
+## Notes
+
+- I agree that just tracking is a great thing. I heard of some people starting to lose weight, just because they started recording it daily.
+- just Thank you very much
+- I like this demo of plotting use
+- Damn, this template looks awesome, nice work
+- (incf eieio-reputation)
+- huh, I could probably use that thing that shows a line for other sexps at the same level...
+ - Yeah, that looks super handy!
+ - A: yeah it's cool. i think it's called indent-guide
+- very good talk!!!
+- emacs is like willy wonkas candy factory
+- thanks for the talk; was thinking that you could use a mobile app like BeOrg and cloud file sync to help automate your data entry
+ - hmm i haven't heard of BeOrg i'll have to look it up!
+
+## Questions and answers
+
+- Q: do you use this just for yourself? Or do you use this to
+ discuss/show with doctors/health professionals? 
+ - A:
+- Q:How do you input the health data? semi automated with org mode
+ capture templets?, copy paste, Automated with a smart watch and
+ ifttt or tasker in an org mode document to automatily add stuff like
+ sleeping data? and which parts are and are not automated, semi
+ automated or manual.
+ - A:All manually
+- Q:How do you track the various health statistics that you are
+ gathering?
+ - A:Manaully for example for sleeping I look at the clock before
+ and after I go to sleep.
+- Q: It's possible to download data from the apple watch's health
+ app. Is it easy enough to incorporate those .csv files into your
+ implementation of Gnuplot? 
+ - A:You can import csv to org. Just copy paste the csv data to
+ org, highlight it and press C-c | (the function is
+ org-table-create-or-convert-from-region)
+- Q: Regarding the medication tracking you only have option to record
+ missed or not. If one needs to take multiple medication throughout
+ the day, how would you propose to track that? Within gnuplot or
+ separate?
+ - A:
+- Q:How's the workflow when working on the gnuplot code -- can you
+ e.g. C-c C-c and the svg output on the right is updated
+ automatically?
+ - A:Use auto-revert-tail-mode in the buffer that displays the svg,
+ then it will update automatically
+- Q: How much time does it take to process the amount of data that you
+ add inside GNU Emacs?
+ - A: some seconds (no issues to manage that inside the editor)
+- Q: will indent-guide behave well with yaml files for helm?
+ - A: 
+- Q: Have you noticed your behaviour changing as a result of tracking
+ your data?
+ - A: Yes, definitively and in a good way
+- Q: did you not have exercise data for the final period of bad sleep,
+ or was it the case that you did not exercise? This question tells me
+ that you want to symbolically represent missing data differently
+ from "0". And, if the answer is "no exercise", then it is
+ possible that this is a factor in your lack of sleep, it's not
+ necessarily the withdrawal from nicotine. As always, use caution
+ when drawing up causal links from correlation. Recommended in this
+ context - "The book of why", by Judea Pearl.
+ - A: 
+
+
+
+[[!inline pages="internal(2022/info/health-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/health-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]]
diff --git a/2022/talks/hyperorg.md b/2022/talks/hyperorg.md
new file mode 100644
index 00000000..ccfed5a5
--- /dev/null
+++ b/2022/talks/hyperorg.md
@@ -0,0 +1,160 @@
+[[!sidebar content=""]]
+[[!meta title="Powerful productivity with Hyperbole and Org Mode"]]
+[[!meta copyright="Copyright &copy; 2022 Robert Weiner"]]
+[[!inline pages="internal(2022/info/hyperorg-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Powerful productivity with Hyperbole and Org Mode
+Robert Weiner (wine-er)
+
+[[!template id="help"
+summary="main talk does not have captions"
+tags="help_with_main_captions"
+message="""This talk does not have captions yet.
+Would you like to help [caption this talk](/captioning)?
+You may be able to start with these [autogenerated captions](/2022/captions/emacsconf-2022-hyperorg--powerful-productivity-with-hyperbole-and-org-mode--robert-weiner--answers.vtt)."""]]
+
+GNU Hyperbole and Org Mode are both parts of Emacs;
+both offer outlining and hypertext support but Org uses its own
+native format while Hyperbole can work across all major modes and
+data formats, including Org's. The two systems are compatible.
+This talk will show ways to use them together and the resultant
+productivity benefits that can be achieved.
+
+Outline:
+
+a. Context-sensitive Action Key on Org Constructs
+b. Automate Actions in Org Mode with Hyperbole Key Series
+c. Rapidly Link to or from Org Headers, e.g. in Source Code
+d. Search over Org Notes with Hyperbole's HyRolo
+e. Dynamically Expand/Contract Org outlines exported to web pages
+f. Embed Org Tables in Hyperbole Koutlines
+g. Create Your Own Hyperbole Implicit Buttons from Org
+h. Hyperbole Expands Org Mode to an Emacs-wide Persistant Hyperbutton-Action Capability on Any Textual Format
+
+
+# Discussion
+
+## Notes
+
+- Sorry a few pixels at the left of the screen are cut off due to how
+ it was recorded but it should not affect the bulk of the information
+ you'll see.  We'll also make the Org document driving the
+ presentation available for offline review.
+
+## Questions and answers
+
+- Q: Can you have multiple implicit button files, if so how would you
+ know which link came from what files?
+ - A: Links are one way at the present time, so you just place them
+ where they are needed and activate them.  Things like HyRolo can
+ be used to locate matching elements across multiple files.
+- Q: What about using implicit buttons with multiple people with
+ different configs?
+ - A:As mentioned in the talk, environment and Lisp variables
+ embedded in path links allow for sharing links whose location
+ varies by user/team.  In other cases you often want team members
+ to see the same result as someone else sees when a button is
+ activated.
+- Q: Coming in from Org/Org-mode, would it be a fair assessment that
+ Hyperbole is in some way a *generalization* of what most people
+ think of the great features of Org to work across formats (i.e. not
+ just in Org buffers, though *also* therein), with the Hyperbole
+ links/buttons being the recurring example? And that it then further
+ adds some capabilities (again across formats and thus including in
+ Org buffers). Being a global minor mode (vs a major mode and thus
+ coupled to a particular format namely org) is interesting per se,
+ and I think goes to RMS's talk that Org's features could be more
+ generalized and modularized. How is Hyperbole in that respect?
+ - A:Org, I believe, is focused on being an interactive notebook
+ and publishing tool notably for scientists or academics, even
+ though it is used by other technical people.  Hyperbole is for
+ creating a hyperverse filled with many types of text files and
+ interlinking them while maintaining their native formats; it
+ does little with conversion to formats for publication, aside
+ from export of Koutlines to HTML for use on the web.
+- Q: Internal/Radio targets: are they able to link to other Org mode
+ files (that are part of my agenda)? Background: <<<example
+ target>>> (default Org mode feature) is great for glossary and so
+ forth but only works within a single Org mode file.
+ - A: You could develop an implicit button type that would link
+ from an external file to a radio target in another file.  These
+ usually are just a few lines of code.
+- Q: Your package advances how useful a mouse can be with creating
+ links, do you have any experiance or thoughts about how
+ touchscreens, or mice could be used or improved with emacs..
+ - A: I place the Action Mouse Key on my middle mouse button and
+ the Assist Mouse Key on my right mouse button because I find
+ them that useful.  The existing drag capabilities of the mouse
+ are similar to actions we would have for a touchscreen
+ interface.
+- Q: Would you consider Hyperbole to be more of a format spec that can
+ then be handled however we want? Or the engine itself along with
+ that format? i.e. can the simple link formats be used for other
+ extensible purposes?
+ - A: yes, hyperbole was thoughts a s an hypertxt engine and then
+ be avail. to multiple apps (as API). turns out didnt work really
+ well
+- Q: How is the integration with org-roam?
+ - A: We are just beginning to work with org-roam and will likely
+ add a Hyperbole interface to it across time.  We are also
+ looking at related tools and how
+- Q: When doing something where do you determine where to put it
+ 'kotl, rolo, org".? I like kotl for journaling and org mode for
+ gtd.:)
+ - A: sure, they're both outlined formats and they work well.
+ depends on your taste
+- Q:Would you recommend a specific resource for getting into
+ Hyperbole, or should I just start with the manual? Definitely
+ interested in getting into this. (oh I love interactive demo style
+ formats, great!)
+ - A: dont start with the manual! :) for learning use the menu
+ system C-h-d-d and watch the interactive demo. Then watch one of
+ the tutorial videos (mentioned before)
+- Q: What is hyperorg?
+ - A: probably a typo for hyperborg
+ - sachac: I had to come up with IDs for all the talks, that was just the one I made up for this one
+- Q:Do you have advice for people who'd like to try using Hyperbole
+ with Org, but don't want to pollute Org files with inline Hyperbole
+ links (e.g., with files that will be published)? (...Or is that
+ inevitably the point of Hyperbole links?)
+ - A:
+- Q: How is the integration with org-roam?
+
+## Other discussions from IRC
+
+- I like the use of the term "cognitive overhead"
+- I really need to spend more time digging into Hyperbole. So far I only use it to open urls in the browser :D
+- These hyperbole talks are making me want to try
+- The issue I've got is that plain org-mode can deal with probably 50% of the use-cases of Hyperbole and the other 50% are not that important to me (yet). ...
+- Interesting idea: "Hyperbole golf" - somebody suggest something that should be accomplished. I'm doing it with my Org mode setup and the other person does it with Hyperbole. I'm sure that Hyperbole may be more elegant but so far, I didn't see anything that I can't do with my setup as well.
+- I would love to see a table comparing how to do things with Org and with Hyperbole with examples, with eev, zk, org brain. There are a lot of these type of packages
+- no problem. However, some things are non-standard org mode because they depend on my personal setup such as file links which I do use without path.
+- Notice how there is so little to Hyperbole buttons embedded in the buffer, so it doesn't break your flow when reading the text, e.g. if you just open the file without a structured viewer.
+- would it be easy to add a section to the table saying "to run these examples in Org you need to run this first?"
+- I understand eev even less than hyperbole somehow, so having a matrix of the 3 would do wonders for me.
+- i suppose another aspect to consider with hyperbole is that it can work outside org mode as well?
+- assist key == escape key
+- btw, people can download a .zip with all the videos by Rainer Koening from here: http://angg.twu.net/eev-wconfig.html#learn-org
+- That grid popup is really cool
+- Gosh it's time to check out hyperbole.
+- there's sooo much I want to check after this conference
+- There is not enough time for all of these
+- Action Key = {M-RET}; Assist Key = {C-u M-RET} though you can bind them as you like.
+- for action key and action key assist a good idea would be use a mouse that has extra buttons for those
+- I just installed hyperbole and I think it just works.
+- Awesome demo, thanks!
+- Thanks rswgnu! Great exposition, I'm much further along on my way towards Hyperbole enlightenment that's for sure.
+- Awesome talk, definitely planning to try out Hyperbole
+- Intense but too much information for just a Hyperbole newbie
+- I will have to watch your talk 3 or 4 times...too much directly to the vein!
+ - A: Thanks. That was the idea, to expose people to new things rapidly just to encourage interest. Install Hyperbole and you can learn at your own pace.
+
+[[!inline pages="internal(2022/info/hyperorg-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/hyperorg-nav)" raw="yes"]]
+
+[[!taglink CategoryHyperbole]]
diff --git a/2022/talks/indieweb.md b/2022/talks/indieweb.md
new file mode 100644
index 00000000..4c9b1ab6
--- /dev/null
+++ b/2022/talks/indieweb.md
@@ -0,0 +1,132 @@
+[[!sidebar content=""]]
+[[!meta title="Putting Org Mode on the Indieweb"]]
+[[!meta copyright="Copyright &copy; 2022 Michael Herstine"]]
+[[!inline pages="internal(2022/info/indieweb-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Putting Org Mode on the Indieweb
+Michael Herstine (IRC: sp1ff)
+
+[[!inline pages="internal(2022/info/indieweb-before)" raw="yes"]]
+
+
+# Table of Contents
+
+
+
+Many of us maintain personal websites using Org Mode. While an
+Org-generated static site has advantages over full-blown Content
+Management Systems, its simplicity comes with costs such as fewer
+features. The first feature I missed was supporting comments on my
+site, but I quickly began to feel isolated on the web altogether.
+
+Enter the Indieweb: the Indieweb is a collection of protocols for
+connecting to other independent sites, pushing your content to social
+media sites, collecting likes, comments & responses from other sites
+<span class="underline">back</span> to yours, and many other things as well.
+
+In this talk, I'll briefly sketch out the dilemma of the independent
+web site & how the Indieweb tries to address it. The focus, however,
+will be on how Emacs, Org Mode, and a few Unix tools suffice to get
+your static Org Mode site onto the Indieweb.
+
+
+(Update July 2023) I've created a simple site demonstrating how
+to use the package [here](https://indie-org.sh/). The source for
+the site is on [Github](https://github.com/sp1ff/indie-org.sh)
+for anyone to see or tinker with.
+
+
+Michael is a developer and long-time Emacs user from the San Francisco
+Bay area. He hacks in C++, Lisp & Rust and thinks a lot about writing
+provably correct code. You can find him at:
+
+ - his [home page](https://www.unwoundstack.com)
+ - on IRC: sp1ff on Libera.Chat
+ - through [e-mail](mailto:sp1ff@pobox.com)
+ - or on [Github](https://github.com/sp1ff)
+
+# Discussion
+
+## Notes
+
+- Thanks for a great talk - this was the missing piece in the puzzle
+ of the website I'm tinkering with!
+ - I'm so happy to hear that!
+- Similar: <http://www.by-star.net/> and
+ <http://www.by-star.net/content/generated/doc.free/bystar/PLPC/180038/current/accessPage>
+
+## Questions and answers
+
+- Q: Have you wu. This allows you to make a login that you own or at
+ least is more open souree and ownable. Seems to fit in with indie
+ web
+ - A: No but I will check it out later
+- Q: How did you create the graphical drill-down representation of the
+ make call? Is it hand-written and scanned in?
+ - A: LOL... I started with a diagram I made at
+ <https://excalidraw.com/>. The initial diagram was the complete
+ flow. Exported that to Gimp & made the intermediate slides there
+- Q: what happens when you re-publish or re-export the same post? i.e.
+ will the webmention be sent out repeatedly?
+ - A: You could do that but it would annoy the recipient. The
+ system is smart enough not to re-send the mentions.
+- Q: An advantage I see to using org mode for the indieweb  for this
+ is you can use it for your notes "org roam for example" and org
+ mode no-export for private data you don't want ot share. Your
+ webmentions could be org files as notes.. Anything else good about
+ using org mode for this.
+ - A:
+- Q:  Any thoughts on using with with Ox-Hugo?
+ - A: No. So far, I was following an Emacs/Org mode OOTB (out of
+ the box) approach and pushing emacs as far as I could take it
+- Q: So, is this a Web3 approach? Web 1 = static sites Web 2 =
+ interactive sites- but centralized
+ - A: Indieweb is about reclaiming your data. It's a distibuted
+ approach.
+ - Annotation Karl: some people started the term Web0 for similar,
+ decentralized approaches. ;-)
+ - Annotation Karl: Web3 is supposed to be something really strange
+ with Blockchains and this is definitely nothing like that Web3
+ (which will be a dead bubble in a few months IMHO)
+ - Here's the link: Do you see this as a format for annotations
+ specifically, or something more general that can be used for
+ interlinear glosses, etc?
+- Q: Is there a workflow to use emacs to publish and connect directly
+ to target websites instead of telegraph?
+ - A: If you want to cut telegraph cut out of the equation, you'll
+ need more work on the client-side. "What if they're down?"
+ ... 
+- Q: Do you have to have a process running on the web server to
+ recieve requests?
+ - A: Nope-- just a cron job
+- Q: I think perhaps you are doing too much inside of emacs?
+ - A: When I started, I thought that I was so close with the OOTB
+ (out of the box) features. 
+- Q: Say you start out using webmentions-as-a-service (webmention.io,
+ telegraph.p3k.io) and then you want to chnge endpoint, whether to a
+ different service, or to your own new server with a CGI script or
+ something. Will that work smoothly, do you think, or will there be
+ mentions piling up at your old address?
+ - A: Should be fine, unless your senders are doing something very
+ odd
+- Q:Have you seen <https://github.com/AgregoreWeb/agregore-browser> It
+ is a decentrilized kiss browser. Using some of the peer to peer
+ protocols used whithin this could be useful for propgating stuff
+ like webmentions.
+ - A: No, I haven't (but I will soon!).
+
+## Other discussions from IRC
+
+- I think perhaps you are doing too much inside of emacs.
+ - mohsen: Somethings are better done outside of emacs. I have built something similar at http://www.by-star.net/PLPC/180038 and also please see http://www.by-star.net
+
+
+[[!inline pages="internal(2022/info/indieweb-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/indieweb-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]]
diff --git a/2022/talks/journalism.md b/2022/talks/journalism.md
new file mode 100644
index 00000000..2ca1f2fd
--- /dev/null
+++ b/2022/talks/journalism.md
@@ -0,0 +1,208 @@
+[[!sidebar content=""]]
+[[!meta title="Emacs journalism (or everything's a nail if you hit it with Emacs)"]]
+[[!meta copyright="Copyright &copy; 2022 Alfred Zanini"]]
+[[!inline pages="internal(2022/info/journalism-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Emacs journalism (or everything's a nail if you hit it with Emacs)
+Alfred Zanini (he/they)
+
+[[!inline pages="internal(2022/info/journalism-before)" raw="yes"]]
+
+
+# PART I - Where I started
+
+
+## Figuring out what you want out of your workflow
+
+For me, that is:
+
+- note-taking and todos for admin and work tasks
+- project management - setting up deadlines for each task and reminders to check in with people
+- a writing environment when I need to focus on script work
+- a way to experiment with coding and integrating that into my work
+- storyboarding different scenes
+- scheduling interviews and reachouts for interviews
+
+
+## Presentation of my previous workflow
+
+Using google drive, word, storyboarder, wechat, notion
+
+
+# Part II - Where I ended up
+
+
+## Why Emacs ?
+
+
+## Org-Contacts
+
+Setting up Org-Contacts to track documentary leads and keep up with them -
+also in use for personal contacts
+
+
+## ORG Roam
+
+Using Org-Roam to link project ideas and leads, and add summaries of interviews
+/ transcripts to contact files. Org-Mode and Org-Contacts to schedule interviews,
+reaching out, check-ins. All the while writing the script for the project on the
+Org-Roam page, with global project questions and specific interview questions
+for each scheduled shoot.
+
+
+## PANDOC and working with colleagues
+
+Once my first draft of the script is ready, I need to be able to share it for review.
+This is where the "Everything's a nail when you hit it with emacs" part comes
+in. Using Org-Mode for comments and for coloring with HTML tags and source
+blocks Not the easiest nor the most fun way to collaborate, but it is where I
+have ended up on.
+
+
+## Other packages I use regularly for a documentary workflow
+
+Mu4e Fountain.el hledger-mode bibtex for research papers present
+
+
+# Conclusions
+
+
+## Forever Work In Progress
+
+A lot of features to be added and kinks
+to be worked out but getting to a state where you can use software
+that you love every day is the most important point to me
+
+So let's keep modding our configs!
+
+
+# Discussion
+
+## Notes
+
+- WRT Literate programming, if you've never read Knuth's
+ Tangle/Web/Weave stuff, it's worth knowing about
+- Using the Calendar in conjunction with task managment and email show
+ off the power off the holistic workflow of Emacs
+- CRDT-- an easy way to work with other people in emacs --
+ <https://code.librehq.com/qhong/crdt.el>
+- Yes, liberal arts types.
+- I relate with so much of this talk so far :-P
+- I didn't know about :ignore: for org-mode headings. Is that set up by default?
+- I also use COMMENT as a todo and it is ignored too.
+- Ahhhhh. Good call. I use TODO in headings when I'm writing to remind me to finish sections later.
+- Yeah, I use :noexport: in pretty much every doc for all of my notes and throwaway scratch writing and stuff.
+- Huh, CRDT sounds interesting.
+- I export docs to Markdown, but I also use pandoc to generate DOCX files from org. Because most writers aren't using Emacs.
+- Thanks, I'll check that out. The writers and editors that I'm working with are frequestly looking for ways to handle change tracking and version tracking for docs. I recommend stuff like git but they need something that's easier for non-techie folks to use.
+- Feedback
+ - Great talk!
+ - Well done!
+ - flipping great stuff. Thanks!!!!!!
+
+## Questions and answers
+
+- Q: It'd be interesting if you explained why WeChat is a necessity
+ for you; outside China, most people have no reason to use it at
+ all.  Thanks.
+ - A: I think he meant Weechat (the IRC client) not WeChat --
+ Chinese exigency 
+ - The captioning did mention WeChat.  If he lives in Hong Kong,
+ then I totally understand, so consider this question answered.
+ - Oh nvm then
+ - Yeah, you've (Alfred) gotten WeChat spot on.  Most people here
+ don't care much, but I'm probably one of the only people in
+ this country not using WeChat, and it's a major PITA to live
+ without.
+- Q:Have you looked at CRDT.el for collaborative realtime editing?
+ - A: most of my work is just versions
+ - CRDT has great org mode support for task managent
+ - CRDT
+ - <https://code.librehq.com/qhong/crdt.el/>
+ - <https://elpa.gnu.org/packages/crdt.html>
+ - related:
+ <https://www.emacswiki.org/emacs/CollaborativeEditing>
+- Q:Sharing orgmode files is trickier than we expect. Do you do this?
+ If yes, how do you do it?
+ - A: Direct sharing was not successful. Exporting to docx or ODT
+ is problematic (Latex structure). 
+ - has tried github and gitlab, but that might require signups - is
+ also suboptimal
+ - Export profiles for ODT or DOCX is a better approach, or at
+ least worked well so far
+ - Karl Voit's notes on collaborative working with non-Org users:
+ - - <http://irreal.org/blog/?p=6234>
+ -   -
+ <https://www.wisdomandwonder.com/link/9922/how-to-reintegrate-changes-for-word-back-into-org-mode>
+ -   - Export to docx via pandoc and re-import via =pandoc
+ --track-changes=all=
+ -     : pandoc --track-changes=all Document.docx
+ Compare_to_original.org
+ - -
+ <https://www.reddit.com/r/emacs/comments/ad43hf/question_how_do_you_manage_tasks_calendars_with/>
+ - - <https://github.com/200ok-ch/organice>: an implementation
+ of Org mode without the dependency of Emacs. It is built for
+ mobile and desktop browsers and syncs with Dropbox, Google
+ Drive and WebDAV.
+ - - [2021-06-08 Tue]
+ <https://www.reddit.com/r/orgmode/comments/nuit8u/coordinating_with_people_who_dont_use_emacs_or/>
+ → discussion
+ - Karl Voit's notes on collaborative working with Emacs users:
+ - - 2020-05-29
+ <https://gitlab.com/emacsomancer/collaborative-writing-environment-emacs>
+ -   - special emacs setup that allows collaboration on the
+ same LAN
+ -   - needs separate emacs config (different host or user or
+ move config out of the way)
+ -   - [ ] try it out myself
+ - - [2020-08-31 Mon] <http://typeintandem.com/> +
+ <https://github.com/jscheid/tandem-emacs>
+ -   - unmaintained:
+ <https://github.com/jscheid/tandem-emacs/issues/1>
+ - - [2021-11-03 Wed]
+ <https://code.librehq.com/qhong/crdt.el.git>
+ -   - via Sacha Chua's EmacsConf21 Emacs news
+- Q:Do you use pandoc for incoming and outgoing docs? Do you find that
+ repeated conversions lose document quality?
+ - A: Layouts are kind of wonky, but that's possible to work through if you go into the settings and adjust basically to how you want it to look like.
+ - And for incoming docs, so that's a bit more of a hassle. My plan for this talk was to have it a bit more ready, but I've got this integration for org-ic, org-apple-pages documents, that kind of thing. So that's often the documents that I get from my colleagues, and I found a way to transfer them into org documents. I did that kind of quickly, so I don't think I'm quite ready to share exactly how it went, but I'm planning on doing some documentation around that. But yeah, basically the gist of it is, I don't find it a huge issue.
+- Q: I am beginning on emacs (again) after falling off every time
+ because of the "working in config-files" whole day. What was your
+ moment when you really started to work in emacs instead of
+ config-editing?
+ - A: Had the click after finding text editor workflow. Don't be
+ too frustrated :-) , use templates, put ideas off to a later
+ moment. 
+ - related: <https://xkcd.com/1205/> and <https://xkcd.com/1319/>
+- Q: Why is emacs recommended for journalism? -vidianos asks
+ - A: I wouldn't say it's recommended-- a personal choice--
+ valuable as a tool-- can be tailored so that it's easy to
+ transfer skills from other disciplines-- more scientific ones
+ to journalism. Org-Roam is a game changer because it allows me
+ to set thoughts aside and know that I can get back to it. Helps
+ with self-control.
+- Q: Do you use any fancy solutions for annotation text onto
+ particular video timestamps?
+ - Clarification: Yes, asking about making notes on a video, when
+ something happens 
+ - Side Note: subd.el could be useful
+ <https://github.com/sachac/subed>
+ - A: Taking notes with org-roam and linking them to BiBTeX etc
+- Q: When you get stuck with an emacs problem-- is there somewhere you go to get help (nice place for non-tech people?)
+- Q: is it possible to use emacs bookmarks capability to literally bookmark a specific timestamp in a video clip (and by that the note taking could be done in that bookmark instance)… ?
+- Q: is Alfred australian?
+ - I suspect he's Swiss
+- Thanks, I'll check that out. The writers and editors that I'm working with are frequestly looking for ways to handle change tracking and version tracking for docs. I recommend stuff like git but they need something that's easier for non-techie folks to use.
+- I did not know about org-mpv
+- There isn't a proper org-mpv, but there are a few functions to combine mpv.el with org-mode here: https://github.com/kljohann/mpv.el/wiki
+- Alfred is a very quick learner
+
+[[!inline pages="internal(2022/info/journalism-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/journalism-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]] [[!taglink CategoryOrgRoam]]
diff --git a/2022/talks/jupyter.md b/2022/talks/jupyter.md
new file mode 100644
index 00000000..1a9304a9
--- /dev/null
+++ b/2022/talks/jupyter.md
@@ -0,0 +1,102 @@
+[[!sidebar content=""]]
+[[!meta title="Edit live Jupyter notebook cells with Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Blaine Mooers"]]
+[[!inline pages="internal(2022/info/jupyter-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Edit live Jupyter notebook cells with Emacs
+Blaine Mooers (Blane Moors, he/him, <mailto:Blaine-Mooers@ouhsc.edu>)
+
+[[!inline pages="internal(2022/info/jupyter-before)" raw="yes"]]
+
+My talk will address a dilemma faced daily by many technical writers and programmers.
+Like many academics, I use several web-based platforms for writing prose (e.g., 750words, Overleaf) and interactive computing (Jupyter Notebook, Google Colab Notebooks).
+The first group lacks support for snippets.
+The second group has support for snippets, but this support does not include tab triggers and tab stops.
+The absence of tab stops can increase the number of bugs by overlooking parameter values in the snippet that need to be changed to adapt the snippet to the current problem.
+One solution to the absence of full-powered snippets is to apply Emacs with yasnippets to these web-based platforms.
+
+One route to doing so is to use the atomic-chrome package for Emacs and the GhostText Extension for web browsers.
+These two software packages enable two-way communication via a web socket between an Emacs buffer and the text area of the web page.
+Edits made on the web side of the socket are immediately sent to the Emacs buffer and vice versa.
+The Emacs's snippets and other editing tools only work in the Emacs buffer.
+The connection can be closed from either side.
+This route has enabled me to apply snippets of LaTeX code to my daily writing in 750words.
+I have been able to convert 750words into a platform for writing in LaTeX; by default, it uses markdown.
+I have also been able to apply code snippets for Julia, Python, R, and so on in Jupyter notebook cells.
+In other words, I get to extend my time writing in Emacs.
+
+In my ten-minute talk, I will describe my problems with web-based platforms and their solution with Emacs.
+I will describe where to find the required software and how I configured Emacs.
+I will present several precautions for using GhostText and describe the limitations of its application.
+I will provide links to collections of snippets I found handy daily usage of 750words and Jupyter.
+
+
+# Discussion
+
+## Notes
+
+- <https://github.com/alpha22jp/atomic-chrome> atomic chrome is by
+ alpha2jp. It is available on MELPA.
+- <https://ghosttext.fregante.com/> Central website for GhostText.
+- <https://www.youtube.com/watch?v=JWW3o104npY&t=190s> Example of
+ using GhostText with Moodle to write web papes.
+- <https://github.com/MooersLab/latex-emacs> My configuration
+ targeting LaTeX in Gnu Emacs.
+- <https://github.com/MooersLab/BerlinEmacsAugust2022> Slides from a
+ 90-minute talk in August at the Berlin Emacs Meetup about using
+ LaTeX in Emacs.
+- <https://github.com/MooersLab/DSW22ghosttext> Slides to 50-minute
+ talk in July about using GhostText with Emacs and other editors.
+ Includes slides for friends that use Vim.
+- Great talk, thank you!
+- Btw, great talk Blaine!
+- I've got ghosttext and emacs via atomicchrome working now: very easy and very useful! Thank you.
+- Nice job Blaine!
+- Thank you!
+- Pretty inspring!
+
+## Questions and answers
+
+- Q: Kind of a silly question but I'm curious... Do you have a
+ favourite color theme?
+ - A: I like several themes and use different ones in different Emacs profiles to distinguish their windows if two are more are open at once. I use the leuven theme in my default config file. It resembles the ef-light theme in the ef-theme. package by Protesilaos Stavrou. I use the ef-spring theme in my latex-emacs config; it has mint green background color.
+- Q: Really interesting to discover GhostText thanks. I use ein (Emacs
+ Ipython Notebooks
+ <https://github.com/millejoh/emacs-ipython-notebook>) for running
+ notebooks locally, I can clearly see the advantage of using
+ GhostText with non-local notebooks/websites but is there anything
+ that GhostText provides over EIN when interacting with locally
+ running Jupyter Notebooks?
+ - A: Good question. I have used the juptyer package in org files, but I do not have much experience with EIN.
+ EIN has a long list of commands specific to editing Jupyter Notebooks.
+ I expect that EIN provides the more powerful approach after making the investment in learning the new keybindings.
+ GhostText was not designed specifically to edit Jupyter cells.
+- Q: To your knowledge are recent/coming security changes in Chrome
+ going to impact the browswer exstention?   Thanks !
+ - A: I do not know the answer.
+ If the secuirty changes inhibits GhostText, it should continue to work in the FireFox family of browsers and Safari.
+- Q:Is this browser-agnostic, or do you have to use Chrome? (answered
+ in talk 15:58)
+ - A: Works on different browsers
+- Q: You mentioned a couple other solutions to allow emacs editing of
+ text areas.  Pointers?
+ - Two options: (1) A: Emacs Everywhere (https://github.com/tecosaur/emacs-everywhere); however, it requires uses emacs-client.
+ (2) The above-mentioned atomic-chrome package can use the browser extension for chrome called "atomic-chrome" in place of GhostText.
+ It is called "atomic" because the extension was orginally designed to work with the text editor Atom. However, I cannot find this extension.
+- Q: Why not save text from emacs?
+ - A: The text in the file will get out of synch with the text in the Emacs buffer and the browser. This can lead to loss of all of the text. Maybe you can set up continuous saving of the text to the file from Emacs.
+- Q: What was the key binding for Linux/Firefox?
+ - A: Ctrl+Shift+h
+- Q: how long have you been in Emacs?
+ - A: 18 months ago I made the commitment to adopt GNU Emacs as my main text editor. I had several false starts earlier. I was too impatient to master one of the starter kits.
+
+
+[[!inline pages="internal(2022/info/jupyter-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/jupyter-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]]
diff --git a/2022/talks/justl.md b/2022/talks/justl.md
new file mode 100644
index 00000000..640bc168
--- /dev/null
+++ b/2022/talks/justl.md
@@ -0,0 +1,42 @@
+[[!sidebar content=""]]
+[[!meta title="justl: Driving recipes within Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Sibi Prabakaran"]]
+[[!inline pages="internal(2022/info/justl-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# justl: Driving recipes within Emacs
+Sibi Prabakaran (he/him, <mailto:psibi2000@gmail.com>)
+
+[[!inline pages="internal(2022/info/justl-before)" raw="yes"]]
+
+[justl.el](https://github.com/psibi/justl.el) is a major mode for driving justfiles.
+
+Justfiles are a way to save and run project specific commands. Think
+of it like Makefile, but purely focused as a command runner.
+
+The purpose of the talk is to give a brief introduction about
+justfile and then followed by how to use the justl.el extension to
+drive justfiles from within Emacs.
+
+Bio: [https://psibi.in/about.html](https://psibi.in/about.html)
+
+## Resources
+
+- [justl.el Home page](https://github.com/psibi/justl.el)
+- [Just tool Home page](https://github.com/casey/just)
+
+## Discussion
+
+- thanks for the great talk sibi :)
+- Seems like a pretty focused and useful tool!
+- will try out Just after that talk
+- Great talk. I'll definitively give it a try.
+
+[[!inline pages="internal(2022/info/justl-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/justl-nav)" raw="yes"]]
+
+[[!taglink CategoryCoding]]
diff --git a/2022/talks/links.md b/2022/talks/links.md
new file mode 100644
index 00000000..b8e9bc83
--- /dev/null
+++ b/2022/talks/links.md
@@ -0,0 +1,2 @@
+[[!sidebar content=""]]
+[[!meta redir=/2022/talks/orgsuperlinks]]
diff --git a/2022/talks/localizing.md b/2022/talks/localizing.md
new file mode 100644
index 00000000..2677d4ee
--- /dev/null
+++ b/2022/talks/localizing.md
@@ -0,0 +1,53 @@
+[[!sidebar content=""]]
+[[!meta title="Pre-localizing Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Jean-Christophe Helary"]]
+[[!inline pages="internal(2022/info/localizing-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Pre-localizing Emacs
+Jean-Christophe Helary (he/him)
+
+[[!inline pages="internal(2022/info/localizing-before)" raw="yes"]]
+
+Before Emacs user-facing strings are localized to users’ languages (will that ever happen?), there are things developers must remember when including such strings in the code, and there are things that emacs-lisp beginners (like me, forever) can do to help when they face such issues.
+
+It is not easy to write naturally flowing language when the language depends on program variables, but even if we stick to English for the time being, it is important to separate natural language from computer language as much as possible.
+
+I will be presenting an old patch to packages.el accepted in June 2018 that took me about a year to write. The origin of the patch is a plural mistake in the packages install messages. As you can see pre-patch, the code was filled with English substrings embedded into the code to produce pasts, plurals and all sorts of English grammatical constructs.
+
+<https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=61f73703c74756e6963cc622f03bcc6938ab71b2>
+
+Even if it is a beginner’s patch (thoroughly reviewed by dev-experts), it shows what can be done by emacs-lisp beginners to help with “straightening” the strings to reduce the number of potential English bugs and then to make Emacs strings easier to be handled by real localization processes, one day.
+
+
+# Discussion
+
+## Questions and answers
+
+- Q: I use Emacs on English but my mother tongue is Spanish. Is Emacs
+ localized/localizable?
+ - haha I have no English knowledge to help fixing text labels, but
+ it is of use for new developments.
+ - A:
+- Q: You mention regex on strings is a red flag for localization, are
+ there others to look out for?
+ - A:
+- Q: So, your project is to localize all of Emacs?
+ - A:
+- Q: How deep would usefull localization go? Because at the core of
+ emacs are Docstrings and localizing them could also imply localizing
+ Elisp.
+ - A:
+
+Other feedback:
+
+- Merci Jean-Christophe ! I really enjoyed your talk (and would very much like to help localise Emacs).
+
+[[!inline pages="internal(2022/info/localizing-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/localizing-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/lspbridge.md b/2022/talks/lspbridge.md
new file mode 100644
index 00000000..a6fcfb19
--- /dev/null
+++ b/2022/talks/lspbridge.md
@@ -0,0 +1,143 @@
+[[!meta title="lsp-bridge: a smooth-as-butter asynchronous LSP client"]]
+[[!meta copyright="Copyright &copy; 2022 Andy Stewart"]]
+[[!inline pages="internal(2022/info/lspbridge-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# lsp-bridge: a smooth-as-butter asynchronous LSP client
+Andy Stewart and Matthew Zeng (IRC: Andy: manateelazycat)
+
+[[!inline pages="internal(2022/info/lspbridge-before)" raw="yes"]]
+
+Emacs built-in single-threaded mechanism and GC design will cause Emacs to freeze when receiving oversized LSP data.
+
+Lsp-bridge uses python's threading technology to build caches that bridge Emacs and LSP server. Lsp-bridge will provide a smooth completion experience without compromise to slow down emacs' performance.
+
+lsp-bridge is completely asynchronous, to the point that even the completion popup is controlled by lsp-bridge. It offloads all the computation to an external python process, and hence the emacs session itself stays always responsive, as it has very few things to do.
+
+lsp-bridge has now supported 39 LSP servers and all kinds completion backend: include LSP、 TabNine、 Citre、 Elisp、 Search Words、 Path、 Yasnippet、 Tempel、 Telegra、 English etc, it just works pretty well out of the box.
+
+Related design, please check <https://manateelazycat.github.io/emacs/2022/05/12/lsp-bridge.html> and <https://manateelazycat.github.io/emacs/2022/06/26/why-lsp-bridge-not-use-capf.html> (sorry, I'm Chinese Emacser)
+
+
+[[!sidebar content=""]]
+# Discussion
+
+## Notes
+
+- <https://github.com/manateelazycat/lsp-bridge>
+
+## Questions and answers
+
+- Q: Is the fatal mistake of this approach that you can't M-x
+ find-function into the code?
+ - A: It is an unfortunate tradeoff. But what is the "fatal"
+ part?
+- Q:Will lsp-bridge replace eglot/lsp-mode, or could it work with
+ them?
+ - A: Yes, lsp-bridge will replace lsp-mode/eglot and
+ company/corfu.
+- Q:Is it possible to use lsp-mode and lsp-bridge together (Disabling
+ completions of lsp-mode)?
+ - A: lsp-bridge is plugin to replace lsp-mode and eglot, can't
+ work with lsp-mode.
+- Q:Is there a demo of lsp-bridge showing its performance?
+ - A:Hard to do that in 20 minute presentation about the
+ principles. Best to try it to see.
+- Q:Will this be a candidate for core Emacs?
+ - A:Perhaps not, it uses a lot of Python and many Emacsers may not
+ like that instead of pure elisp.
+ - (someone else on IRC): And as I said above, this breaks introspectivity, which is one of the main features of Emacs.
+- Q:If performance is the main objective, why Python and not something
+ like, e.g. Rust?
+ - A:Python is easy to develop in, and LSP's performance is
+ IO-based. The key is multi-threading, not language performance.
+ - A: LSP is IO intensive not CPU intensive, Python isn't doing
+ too good with latter but former is pretty fine. Anyways, as
+ I've explained in the talk, the multithreading design
+ fundamentally fixed the problem, it doesn't need any faster
+ language. Existing python ecosystem and python's ease of
+ development were also part of consideration
+- Q: Is there a benchmark comparison with lsp-mode and eglot?
+ - A: It is a nuisance to create a benchmark comparison when
+ lsp-bridge and lsp-mode/eglot are structured so fundamentally
+ different (single-thread & multi-thread). Feel free to try
+ lsp-bridge on a huge repository with a slow server (i.e volar,
+ java), you will experience the difference immediately
+- Q:You tried lsp-mode , but have you tried Eglot re:performance? I
+ heard lsp-mode isn't that efficient.
+ - A:lsp-bridge is much much faster than eglot and lsp-mode
+ - A: lsp-mode and eglot both suffer from bottlenecks from the
+ single-threaded Emacs and the uncontrollability of the codebase
+ size & lsp-servers, I've also heard eglot is better in terms of
+ performance than lsp-mode, but lsp-bridge avoided this problem
+ fundamentally
+- Q:How well does lsp-bridge coexist with clojure-lsp and cider?
+ - A: clojure-lsp is part of the supported language servers
+ already., C# also supported by OmniSharp
+- Q:Can lsp-bridge work with all LSP backends or just Python at the
+ moment?
+ - A: All LSP backends.
+ - A:
+ <https://github.com/manateelazycat/lsp-bridge#supported-language-servers>
+- Q: Is there any plan to support dap-mode or something alike?
+ - A: Yes, but this year I've already spent so much time on
+ develop lsp-bridge/EAF/blink-search/deno-bridge/markmacro. We
+ can use lsp-bridge's technology build faster dap-mode similar
+ project.
+- Q: does lsp-bridge work over Tramp?
+ - A: tramp is very slow, I will planinng write new plugin to
+ replace otramp, then we will make lsp-bridge work on remote
+ machine, and something like VSCode does,  idea
+ <https://github.com/manateelazycat/lsp-bridge/issues/357>
+- Q: Does acm mode work on terminal or it only works on GUI?
+ - A: The main acm-mode bundled with lsp-bridge only works on GUI
+ at the moment. There is a community maintained repo that enables
+ acm-mode to work on terminal:
+ <https://github.com/twlz0ne/acm-terminal>
+- Q: acm-mode is fast, is it possible to use it outside of lsp-bridge
+ as a standalone mode?
+ - A: No, acm-mode fast is because lsp-bridge's multi-thread and
+ asynchronous design, not because acm-mode itself
+- Q: What lsp features will not be considered in lsp-bridge? How about
+ symbol highlight, breadcrumbs?
+ - A:lsp-bridge's highest priority is performance, symbol
+ highlight is not useful and it will slow down the render
+ performance (symbol-overlay is better choose)
+ - A: breadcrumbs is not LSP procotol, I just want we coding like
+ hacker that live in Emacs, I don't want make Emacs like a
+ VSCode clone.
+- Q: doesn't Python have the same fundamental problem with threads? I mean GIL.
+ - A: NO, if you really wrote multi-thread code.
+- GIL doesn't matter for handling blocking IO in multiple threads
+ - lounge-4227, same is true for elisp
+ - Most emacsers haven't experience on multi-thread, python GIL won't block this.
+ - But Emacs's haven't multi-thread.
+ - Emacs's single-thread and GC can't handle LSP in real-time.
+- Q: ManateeLazyCat Do you think Emacs could be fixed in order to allow for this kind of multithreaded implementations in Elisp itself?
+ - A: No, there have so many elisp code running single-thread, if elisp implement multithread, Emacs will break out.
+- Q: I tried lsp-bridge, and it's wonderful. What I miss most is imenu integration in lsp-mode/eglot. Is there any plan to support it ?
+ - A: I doesn't use imenu, I'm personal no plan to support it, but any PR are welcome.
+- I don't have anything against Python, in fact I like it myself, but it seems strange that this can't be solved without requiring a second runtime
+ - A: It's not technology, it's about Emacs's history, if emacs include multi-thread, will break most elisp plugins.
+- Q: Does the package manage the external LSP and bridge processes.
+ - A: Yes.
+
+Other feedback from IRC:
+
+- I can relate Java LSP and a huge repository :D
+- Fast response from LSP really impressed me.
+- Smooth-as-butter, that's a really apt description of it. In the past few days I have learned it for the improvement of acm-mode and I am very comfortable. I was a TabNine user, so it was exciting that acm-mode supported it out-of-box.
+- I was hooked on Corfu and Cape right before I touched on acm-mode, but acm-mode turned me around in an instant.
+- Yeah, I like the ideas behind lsp-bridge, and a great explanation of it. I may have to have a wrapper function to toggle corfu and whatnot whenever I start the lsp-bridge.
+- Well, you just did, with this work, so there is at least one way that was done. It means that it should be a way to restrict multithreading in a way that doesn't break existing code but adds functionality for solving particular problems
+- Yes, definitely not easy, but worth it. Your work proves it, so I hope it motivates people to solve the fundamental problem at some point. In the meantime, please continue the awesome work you are doing!
+- Big thanks for working on this project, I think it's great that there's a solution out there for LSP performance. My setup has been struggling on some particularly large projects w/ many thousand line TS/Ruby files
+
+[[!inline pages="internal(2022/info/lspbridge-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/lspbridge-nav)" raw="yes"]]
+
+[[!taglink CategoryCoding]]
diff --git a/2022/talks/mail.md b/2022/talks/mail.md
new file mode 100644
index 00000000..e0a54386
--- /dev/null
+++ b/2022/talks/mail.md
@@ -0,0 +1,153 @@
+[[!sidebar content=""]]
+[[!meta title="Revisiting the anatomy of Emacs mail user agents"]]
+[[!meta copyright="Copyright &copy; 2022 Mohsen BANAN"]]
+[[!inline pages="internal(2022/info/mail-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Revisiting the anatomy of Emacs mail user agents
+Mohsen BANAN (MO-HH-SS-EN, he/him, <mailto:emacs@mohsen.1.banan.byname.net>)
+
+[[!inline pages="internal(2022/info/mail-before)" raw="yes"]]
+
+Actually, it makes very good sense to use Emacs as your Mail User Agent (MUA).
+A dominant and fundamental aspect of
+mail composition and mail processing is editing. And, if you live inside of
+Emacs, of course you expect to have the
+ultimate messaging environment.
+
+Over the years many Emacs MUAs have appeared. As of 2022, the following Emacs
+MUAs are available to choose from:
+Gnus, VM, WanderLust, Mew, mu4e, notmuch.el, mh-e and Rmail.
+
+Emacs MUAs can be used as Monolithic-MUAs (with elisp smtp and imap protocol
+implementations) or as Split-MUAs (with external
+smtp and imap protocol implementations). We make a case for superiority of the
+Split-MUA model.
+Recent evolutions of Gmail and Outlook towards requiring OAuth and our agility
+to better address that
+requirement based on the Split-MUA anatomy is one of our justifications for
+converging
+towards the Split-MUA anatomy.
+
+While what we are presenting here applies to all Emacs MUAs, our focus is Gnus.
+Gnus is distributed with Emacs proper and is the richest and most potent MUA,
+anywhere!
+
+We have wrapped all that is needed to use Gnus as a complete Split-MUA for
+Unix-like environments in a package
+called MARMEE (Multi-Account Resident Message Exchange Environment).
+
+MARMEE consists of a set of packages that span:
+
+- Deb GNU/Linux Packages
+- PyPI Python Packages
+- Emacs Elisp Packages
+
+plus everything that is needed to properly install these on Debian-like GNU/
+Linux systems and
+integrate them with Gnus. By choice, we have limited our integration languages
+to elisp, python and bash.
+
+MARMEE component packages include:
+
+- OuterRim-qmail (deb+PyPI) – Outer Rim oriented qmail, as a Resident Mail Submission UA.
+ qmail-remote is replaced by a python implementation which includes OAuth
+ awareness.
+ qmail-inject is replaced by a python implementation which is X822-Bus aware
+ (for DSN requests)
+- offlineimap (PyPI) – as a Resident Mail Retrieval UA.
+ offlineimap includes OAuth awareness.
+- notmuch (deb) – for searching
+- gpg (deb) – for privacy and integrity
+- flufl.bounce (PyPI) – for bounces and DSN (Delivery Status Notification)
+ processing.
+- bisos.cs (PyPI) – BISOS CommandServices for configuration and secrets
+ management and integration.
+- gmailOauth2.cs (PyPI) – For SMTP and IMAP authentication/authorization
+ through gmail.com
+ Used by qmail-remote for out-going and by offlineimap for in-coming OAuth
+ based mail.
+- org-msg (EmacsPkg) – For HTML-composition in org-mode and for htmlized
+ citations.
+- mcdt (EmacsPkg) – Mail Composition, Templating, Distribution and Tracking.
+
+The integration framework for MARMEE is BISOS (ByStar Internet Services OS).
+Full integration of Emacs, MARMEE and BISOS is called Blee (ByStar Libre-Halaal
+Emacs Environment).
+The easiest way to use MARMEE is to install BISOS – which includes Blee.
+
+In this talk I will demonstrate what a wonderful environment the Split-MUA
+model of Gnus+MARMEE can be.
+
+After walking through the concepts and the integration framework, I&rsquo;ll walk
+through transparent access to
+multiple mail servers conveniently and show org-mode composition of BIDI emails
+going out as html.
+
+My primary goal is to show that these packages can be integrated, but that
+integration is not simple.
+Furthermore, various improvements can be made to the packages to enhance the
+complete integrated environment.
+I&rsquo;ll be enumerating my requests from relevant package managers.
+If we were to collectively buy into something like this, we can greatly
+simplify use of Emacs MUAs
+with all mail systems – including the commonly used Gmail and Outlook.
+
+Of course, we should not be using Gmail and Outlook. Instead we should extend
+Libre Software into Libre Services
+and provide for edge-oriented autonomy and privacy in the services domain.
+There is a services side to
+what we have presented here. It is called &ldquo;The Libre-Halaal By* (ByStar)
+Digital Ecosystem&rdquo; – <http://www.by-star.net/>
+Perhaps that could be a topic for the next EmacsConf.
+
+For questions or comments, feel welcome to email me at: <mailto:emacs@mohsen.1.banan.byname.net>
+# Discussion
+
+## Notes
+
+- great talk -- this is a **LOT** of info to ingest!
+- link to book on polyexistentialism:
+ <http://www.by-star.net/content/generated/doc.free/mohsen/PLPC/120033/>
+
+## Questions and answers
+
+- Q:something I have liked about notmuch is using maildir makes
+ searching fast and the knowledge that you have all your email
+ period:) why gnus over notmuch. as a side note you also have
+ muchsync for notmuch clients and jmap for more exotic normal
+ clients.
+ - A:
+- Q:So the idea is more about emacs as a holistic computing experiance
+ with other packages and services rather than about email specificly.
+ as an alternative to the something like the microsoft office suite?
+ - A:
+- Q: Early on you expressed misgivings about the western copyright
+ regime, but you're using a GPL license.  Is this a conflict? (great
+ work BTW)
+ - A:
+- Q: Do you know of GNU Guix how do you think about using it for
+ packaging/configuring Emacs & your various packages else you might
+ look it up;) Or nix"os"
+ - A:
+- Q:Is this being split up in a heavily configured server for emall
+ hosting and a thin client package for youl local client to integrate
+ with your emacs packages, maybe with a client thin docker container
+ for other packages like notmuch locally
+ - A:
+- Q:Could you expand on the definition libre-halaal?
+ - A:(answered - capture TBD)
+- Q: What is the scope of what you are imagining? Just software?
+ - A: (answered - capture TBD)
+- Q:NFTs! 
+ - A: (responded - capture TBD)
+
+
+[[!inline pages="internal(2022/info/mail-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/mail-nav)" raw="yes"]]
+
+[[!taglink CategoryMail]]
diff --git a/2022/talks/maint.md b/2022/talks/maint.md
new file mode 100644
index 00000000..e573ba65
--- /dev/null
+++ b/2022/talks/maint.md
@@ -0,0 +1,249 @@
+[[!sidebar content=""]]
+[[!meta title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"]]
+[[!meta copyright=""]]
+[[!meta license="The material on this wiki page is placed in the public domain. Where copyright is taken to apply, the material is dual-licensed under CC BY-SA 4.0 and GPLv3+."]]
+
+[[!inline pages="internal(2022/info/maint-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+# Maintaining the Maintainers: Attribution as an Economic Model for Open Source
+Sid Kasivajhula (any pronouns, commonly he/him, IRC: countvajhula, <mailto:sid@drym.org>)
+
+*The material on this wiki page is placed in the public domain. Where copyright is taken to apply, the material is dual-licensed under CC BY-SA 4.0 and GPLv3+*
+
+[[!inline pages="internal(2022/info/maint-before)" raw="yes"]]
+
+This talk is based on research on a new model for interactions in
+living systems, including human social systems, called identity
+architecture. The paper is available at this link:
+<https://www.drym.org/IALS.pdf> In particular, the sections on "Economic
+Systems," "Property," and "A Universal System" describe the rationale,
+underlying principles, and dynamical consequences of an
+attribution-based economic system. Follow its development at
+<https://github.com/drym-org/identity> and support an ABE project near you!
+
+----
+
+The problem of supporting open source software and contributors is a
+pressing one, and one for which we don't have good solutions.
+
+So many developers today pour their creative energies into
+freely-distributed works only to have those same works of passion turn
+into a pain in the neck when they find themselves eternally on the
+hook to provide support in exchange for minimal or no compensation,
+and often with limited assistance.
+
+Fundamentally, the reason it's this way is that traditional economic
+systems operate on <span class="underline">supply and demand</span> as the basis of value. In such
+systems, open and unlimited availability translates into zero market
+value, and consequently, open source enterprises are not economically
+sound. Even in high profile projects, developers make a living purely
+through value added services rather than from the core of the value of
+their contributions &#x2013; that is, from the code they wrote. Since, from
+a market value standpoint, <span class="underline">that code is worthless</span>.
+
+Copyright and patents (not to mention proprietary software) are an
+attempt to address this within the existing economic model by imposing
+artificial scarcity in order to induce market value. In principle,
+they also provide safeguards against appropriation. On the other hand,
+the unlimited availability of creative works is a profoundly good
+thing from the perspective of maximizing value, and thus suppressing
+it is deeply misguided. Organizations like the Free Software
+Foundation have campaigned against such restrictions for some time
+now, for related reasons; nevertheless, the problem of providing a
+viable economic basis, aside from these crude attempts, remains
+unaddressed.
+
+Attribution-based economics is a new model that aims to remedy this
+state of affairs by changing the basis of value from supply and demand
+to <span class="underline">collective recognition</span>. This is facilitated by a process of
+"inheritance attribution" where we collectively agree on the extent of
+inherence of ideas and works in other (e.g. derivative) ideas and
+works, by means of transparent and evolving standards. This model is
+capable of recognizing a much larger set of valuable contributions,
+including forms of value that cannot be coerced into a
+supply-and-demand equation. That is, in this model, there is no need
+to artificially restrict availability in order for something to be
+considered valuable. By virtue of the curious property that
+innovations on the process are themselves subject to the process of
+recognition in a self-reflective way, we gain accuracy, and by the
+property that agreed-upon standards apply equally to all, we gain
+fairness &#x2013; guarantees that are at best tenuously present in today's
+economic systems.
+
+This talk introduces some early experiments with attribution-based
+economics in the Emacs community, and some initial proposals that
+point the way forward on how, with your help, such a system might
+scale up to larger projects and communities far beyond open source.
+
+# Discussion
+
+## Questions and answers
+
+The initial questions below were answered live, and as they may be found in the live Q&A transcript, they are not fully transcribed below. The question on "human nature" has a more clear answer below, added after the fact. Following the live section is an extended Q&A section for the benefit of future readers who may have more questions.
+
+### Live Q&A
+
+Q: This seems to assume that there will be $ contributions commensurate with the value of the project vs. everyone freeloading because there is no incentive to pay
+
+A: This concept of economy will make all participants stakeholders, so there is an incentive to pay. There are a number of open questions, though, as this idea is new.
+
+Q: Are you aware of projects like OpenQ (https://www.openq.dev/)? Would that fit the model in your opinion?
+
+A: Not familiar with OpenQ
+
+Q: I see incredible amounts of overlap with the SourceCred system https://sourcecred.io/ , where attribution of antecedents, graph of contributions, fair-in-hindsight backpropogation is built-in. Are you aware of SourceCred?
+
+A: Not very familiar with it [answered in more detail live, but I've also added more on this after the live section of Q&A below]
+
+Q: How is this different from money? Not in some abstract ownership vs attribution way. Open source funding is an incentive problem, which this does not change as far as I can see.
+
+A: Money can be revisited in the future but maybe not immediately.
+
+Q: How would you approach a viable experiment?
+
+A: We have a Github Action that automatically creates the boilerplate of files and directories needed for the accounting. Further development through dialogue because of the many questions open.
+
+Q: Given that the oversight is a social process, how do you constrain the cognitive and time burdens of deciding the values of attributed contributions?
+
+A: We start with simple heuristics and first tackle the majority of issues.
+
+Q: How are the attribution amounts calculated? (ORGA NOTE: restored from a prior version; welcome to remove if this was your question and you removed it intentionally)
+
+A: Dialectical Inheritance Attribution (DIA), a social practice described in the talk. One heuristic strategy that will be used will be "Analyze, Appraise, Anonymize, Attribute."
+
+Q: What are your assumptions about human nature vis. self interest vs. altruism?
+
+A: In the live Q&A I meandered on this point, so let me answer more clearly here.
+
+ABE does not assume anything about human nature. It is neither cynical nor idealistic. Rather, it achieves the goals I mentioned in the talk in a purely structural way, setting up the source of value in such a way (DIA) that emergent incentives align with the common good. The "common good" emerges as simply being the aggregate of desires in a particular context. Since selfish desires cancel out at a sufficiently large scale, the incentive resultant from DIA forms what is good for everyone rather than what is good for some, in other words, exactly what we mean by the common good.
+
+Another way of saying this is that in an ABE system, you don't have to choose between being altruistic and being selfish. The more you give, the more empowered you are, and so, the more selfish you are, the more altruistic you'll be. As a result, it isn't useful anymore to see things in terms of selfishness and altruism.
+
+In response to this, some may say, well then we won't get credit for being "truly" good. To them I would say, it's so much more important for our world to teach people to be better than for us to worry about who is "truly" good on their own. If our world lets selfish and parochial people become cruel and deluded and further the cause of hate and injustice, then we have failed them and each other. Even the worst among us has great capacity for good, and the wonder of ABE is that it could use them to do good, teach them to be good, a kind of "Aikido" that redirects their inclinations to align with (without being limited by) what everyone agrees is good. After all, if we teach moral lessons in the ivory towers of our churches, temples, mosques and synagogues, while also teaching by our actual practices and systems that selfishness and winning and being egotistical are good, then what results can we expect?
+
+Q: URL of the project?
+
+A:
+
+- The founding documents for the prototype economic system are at https://github.com/drym-org/foundation
+
+- The accounting system which you can use in your projects (contains setup instructions) is at https://github.com/drym-org/old-abe
+
+- The research on which this is based is at drym.org
+
+### Extended Q&A
+
+The rest of these questions will be categorized under "ABE Now" -- relating to the prototype and practical considerations for adoption today, and "ABE Future" -- which discusses more philosophical issues regarding the nature and goals of the system.
+
+#### ABE Now
+
+Q: How is this different from splitting donations to my project with my partners?
+
+A: In one respect it is dramatically different from that, and that is that *creators are not required to participate in this process*. Rather, it is a service provided to members of the community by members of the community. This shift may seem small on the surface, but it is precisely what lends this idea the power to solve the big problems I mentioned in the talk. There are two other differences, as ABE:
+
+1. Recognizes antecedents in both directions. It's not just sharing proceeds from your project with your buddies, but also sharing with creators whose works and ideas are reflected in yours. And likewise, it's others sharing proceeds from their projects with you.
+
+2. Encourages investment. It's easy enough to write a small project with your buddies, but when you have big dreams, you need big resources. If you are doing a startup in today's system, you divide "ownership" shares with your buddies and also with investors with deep pockets who can help you scale your project up to provide the maximum value. It's the same in ABE, except that anyone can be an investor simply by paying money to the project. This allows you to scale up your project by the support of ordinary mortals and not only "angels." It also means that every project will scale up to the right extent -- not too much and not too little -- because there are no incentives to wring value out of projects when there are more efficient ways to get the same amount of value -- there are no barriers to becoming an investor, after all. If your particular horse isn't winning, there is no cost, and indeed an incentive, to pick another horse rather than force your horse to win at any cost. Of course, in an ABE system, you don't own these horses, they aren't even competing, and there usually wouldn't even be a clear boundary between them!
+
+Q: How is this different from SourceCred and OpenQ? When there are technologies and services like these around, why do we need ABE?
+
+A: Systems like SourceCred are promising, and it's great that they're being developed. Technologies such as these will be indispensable to ABE's operations in the long term. At the same time, I want to strongly emphasize that technology is not the _basis_ of the new system. Instead, the basis of ABE is dialogue and agreement. This is a central idea because it means that anyone who has ever contributed value, and anyone who is contributing value today, and anyone who will contribute value in the future, can rest in the safety of collective attribution and be recognized and empowered -- people like you. Aside from sharing your work, there is nothing technological that you need to do (e.g. record your contribution on a blockchain, or be part of a software project that is using an attribution-oriented compensation scheme such as SourceCred, or have patents on your ideas, or anything else) in order to be eligible to be recognized for what you did, are doing, and will do.
+
+Q: What prevents bad actors from taking over?
+
+A: There are many possible kinds of bad actor.
+
+- Those who use your project and don't pay.
+
+For now, this is OK and expected. But as the system scales, becoming eligible to _receive_ attributive payments means consenting to participate in ABE wholesale. So the more valuable a project is, the greater is its incentive to participate.
+
+- Those who will make improvements and sell independently instead of contributing back.
+
+This person is operating under the assumption that they will be able to generate more money on their own than through others via well-established channels of attribution and use. This assumption is generally unlikely to hold.
+
+- Those who attempt to set standards that benefit themselves.
+
+Because standards are set in an anonymized way, such self-serving standards are only likely to prevail on small scales where participants cannot be truly anonymous. At larger scales, this "Dialectical Mirror" ensures that these incentives cancel out ensuring that fair standards win over selfish ones. Additionally, since DIA is applied globally -- that is, the standards agreed upon in special cases are generalized to the maximum extent possible -- self-serving incentives in special cases would be negated by standards decided in the general case. To put this all in simple terms, "desires that benefit only oneself don't scale, desires that benefit all do." I call this the "Good vs Evil" principle. It is a very interesting mathematical property of an ABE system.
+
+- Those who do not report payments.
+
+The ABE constitution requires that payments being reported is a collective responsibility -- both payers as well as payees can report it. Payers have an incentive to report it because it counts as an investment. Payees have an incentive to report it because being in non-conformance with the constitution can make the project ineligible to continue receiving attributive payments from the system.
+
+But in general, yes it is important to put safeguards in place to protect against identified risks, and no doubt, there is a lot of work to do on this front. If you can think of such risks, you can help by bringing them up and/or helping to implement the necessary safeguards. We're all in this together!
+
+Q: If in ABE some portion of payments to my project go to upstream projects, then isn't there less incentive for me to work on my project?
+
+A: Some portion of your revenues go upstream, but by the same token, some portion of revenues of downstream projects come to you. Determining the precise proportions of value is not an easy problem, and it will take time and experimentation to arrive at the "sweet spot" for simultaneously incentivizing future work while fairly recognizing past work.
+
+Q: I don't see a license on ABE projects. What gives?
+
+A: Whether you have a license or not, and whether your project is proprietary or not, it is in all cases eligible to be recognized by ABE (but note that if your code is not open source, then there is less value there to be recognized -- constituting an _incentive_ to release your code).
+
+By virtue of this, having a license on ABE projects would amount to introducing something distracting which has no bearing on the process. Additionally, as ABE endorses non-ownership, that essentially puts these projects in the public domain. Projects that are not owned don't need licenses. After all, who would be in a position to issue such a license if no one has special privileges to begin with?
+
+Q: OK, but why not use the Unlicense or Creative Commons?
+
+A: Licenses like the Unlicense, well intentioned though they are, don't really help because they offer a glimpse at an open and free world that they don't provide any means of attaining, leading to complacency on the part of the user. To be fair, we owe such licenses a debt of gratitude as they have helped us get to the point where people are more receptive to the idea of non-ownership. But such crutches hinder us now -- if a potential user sees the Unlicense and if this vision of a free world takes the place of the need for a real solution in their minds, then no one is better off for it. On the other hand, a declaration of non-ownership is, to paraphrase Leo Vivier, a thread of curiosity that you can follow to reveal more complete answers. Follow that thread, friends!
+
+Q: DIA sounds like an involved process. How can it be done efficiently enough to usefully keep up with the pace of contributions to a project?
+
+A: We use an idea that we call "Renormalization," which I'll explain soon. First, the system, at least at the initial stages, assumes that preferences in the system are consistent. If a person says they like A better than B and B better than C, we assume that they will like A better than C. By making this assumption, we can reduce the hard problem of appraising the value of a contribution to a project to the problem of simply appraising its value in relation to any other single aspect of the project that has already been appraised, and then "renormalizing" (i.e. ensuring the proportions total to 1, or a 100%) the attributed proportions to include the newly created value. For instance, it's hard to say how valuable a particular bug fix is to a project, but it's much easier to say how valuable it is in comparison to another bug fix that was already appraised. So, once there is a seed of appraised contributions, it becomes much easier to appraise new contributions. Periodically, the process of DIA would be conducted afresh to apply the standards more rigorously. This is analogous to a similar algorithm followed in the field of robotics, where a robot navigating a large room can have a rough idea of its position even if it is unable to see its surroundings, by maintaining an internal model of its own movements until visual data is available. Likewise, we can maintain useful appraisals of the value of pull requests even before we have had a chance to conduct the full process of DIA, which may be done at a much less frequent rate (e.g. monthly or quarterly) than the frequency of contributions.
+
+#### ABE Future
+
+Q: You said ABE solves appropriation. How does it do that?
+
+A: Appropriation is unfairly benefiting from someone else's contributions. It is an inevitable consequence of the power law distribution where more empowered members of society are in a position to disproportionately benefit from the contributions of others due to the "loudspeaker" that empowerment equips one with, leading to a kind of "double counting" in empowerment causing the rich to get richer in a general (not just financial) sense.
+
+The current solution to this problem is to impose constraints on the freedom of such empowered individuals and groups in order to prevent their profiting in this manner from the cultural creations of marginalized groups and individuals. Yet, while constraining the freedom of others is sometimes necessary, it is rarely desirable. Additionally, this solution isn't very effective, since it is only able to address visible acts of appropriation, and comes nowhere near addressing the full scale of the problem. In truth, by the time creations have been appropriated over timescales of years, decades, and centuries, the knowledge that they ever came from the marginalized group has long faded, and, indeed, such a claim would scarcely be believable since the creation would have a long association with the empowered group in the mainstream -- a mainstream which, after all, is disproportionately shaped by that group. In ABE, since attribution is the source of value and empowerment, and since this is done in an anonymized way that has strong fairness guarantees, greater empowerment does not enable one to unfairly benefit from creations. Indeed, it encourages mass dissemination of cultural creations since the originators will be empowered by virtue of such dissemination, allowing them to create _even more_ creations representative of their culture and traditions. In this way, it solves the problem of appropriation at every level of society, from contributions in a collaborative project to cultural creations at the scale of human society.
+
+Q: You said ABE solves war. How does it do that?
+
+A: War on the scale of nations is the same as fisticuffs on the scale of two blokes having a disagreement. It happens because of misaligned interests. The a priori "state of nature" of human interactions, and national interactions, is one where such misalignments may occur since these interests arise independently. Capitalism doesn't change the origin of such interests, and only pits them against one another on battlefield as a way for someone to get the prize. ABE invites us to reflect on those a priori interests and shows us that, if we all agree to "look in the dialectical mirror" before allowing these interests to interact in the world, we could modify these interests before the fact so that they align, by devising conventions, protocols, and standards that allow us to each get what we want. One such protocol is Dialectical Inheritance Attribution, which by virtue of a certain structural property (see "altruism"), allows us to place economic value on goods and services to the extent that they align with the common good. This removes the conditions for war in the great majority of cases. For the remainder, there may be other solutions to be found by looking in the dialectical mirror - it is full of illusion and wonder, and some say that all of our answers lie there for anyone who will peer far enough into its mists :)
+
+Q: You said ABE solves poverty. How does it do that?
+
+A: It may seem inconceivable that helping the poor could lead to financial rewards, but that's exactly what I'm saying an ABE system would do.
+
+Response: That is a naive and idealistic position. According to your own statements, empowerment in an ABE system would be representive of true value contributed. Then, by definition, the poor are those who contribute the least value to society. If they don't contribute value, then how does helping them contribute value?
+
+A: Even in the new system, although everything that is empowered would be good, not everything that is good would be empowered. People would be poor for many reasons. Sometimes it would be because they didn't contribute value, or because they caused problems for others. But other times, it would just be statistical accident, since the world isn't deterministic and things don't always go the way we expect. People may also be poor because we simply aren't able to discern the value in their contributions, though they may be valuable. After all, to use a timely example as it is Christmas time, many would say that Jesus contributed value to the world, and yet, he was poor, and it was a rudimentary system based on dialogue that saw him condemned to death. ABE cannot fully escape our capacity to make mistakes. But by recognizing helping the poor as a valuable activity, we allow such people to stand on their own feet and have a chance to create value in the future. No one would ever not be in a position to create value. Today, on the other hand, millions waste all of their time simply struggling to make ends meet, a neverending cycle that isn't conducive to creating value.
+
+Response: But wouldn't it be more valuable to create real value directly, instead of helping those who may be unlikely to create such value?
+
+A: Let me tell you about something I call the "Bhulbulaiyya Principle." The story goes that at one time in the past, the Indian town of Lucknow was struggling economically and there was widespread poverty. In response, its eccentric ruler decided to invent a project to engage the whole community -- the construction of a large maze (which is now called Bhul Bhulaiyya). The project, ostensibly a pointless one, created jobs for thousands and created downstream needs that created more jobs, so that the entire community came alive economically and all of their problems were solved.
+
+Another name for this same principle could be the "Military Industrial Complex Principle," because, indeed, wars -- even the most pointless wars without a political goal -- are often good for a nation's economy.
+
+So, when unambiguously "pointless" activities can be good for the economy in a capitalist system, it should not be so surprising that an activity like helping the poor, that is widely agreed upon as being good, would be good for the economy in an ABE system.
+
+Q: In that case, what prevents freeloaders from just living off of the support of others?
+
+A: Without even considering the structural inequities nor the dynamical tendencies (e.g. the cycles of addiction and crime) that are at play, an important factor in why people "freeload" today is that there are sharp discontinuities between being disenfranchised and being a self-sustaining and contributing member of society, resulting in a "chasm" that must be crossed by a force of will and fortune for the rehabilitation of those on the periphery of society. These discontinuities include (1) the finiteness of jobs, (2) the logistical and operational difficulties of managing the relationship of employment (on both sides), (3) the rigidity of the employment contract... among many other more subtle and deep-seated aspects. On the other hand, in an ABE system, if collective attribution of value created is the source of recognition in the form of money, employment is a superfluous concept as it is unnecessary to the process of value recognition and consequent payment. This significantly reduces the barriers to rehabilitation. Added to that, since the system also incentivizes working together, and is in principle able to recognize arbitrarily small contributions, the net result is the elimination of these discontinuities -- the "chasm" -- between being disenfranchised and being solvent.
+
+Another thing is that the support of others doesn't only take the form of fulfilling the immediate needs of such would-be freeloaders. Rather, the greatest incentive is to help them in such a way that it puts them in a position to create value. Additionally, there is also an incentive to innovate on the ways of accomplishing this, so that we might expect there would be an entire industry around helping disenfranchised individuals in the most effective way as agreed upon collectively. All of these derive their value from recognition and attribution rather than supply and demand, so that even though, just like in a capitalist system, such methods and practices would be governed by financial incentives, in an ABE system these incentives would be aligned with the common good, so that it is structurally robust against abuse.
+
+Q: Although you decry the Darwinian, winner-takes-all aspect of capitalism, it is a powerful incentive to innovate. If I don't have existential concerns in ABE, would I really be as intent on creating value? Are there sufficient incentives in ABE in comparison with capitalism?
+
+A: Even setting aside for a moment that causing non-economical harm as a side effect of creating value is nowhere accounted in capitalism, in practice, only a small proportion of people in a capitalist society are truly creating the most value that they might. Most are coopted into established revenue streams because the system enables, and incentivizes, appropriating the talents of others less empowered than you, so that in a mathematical sense, even a small advantage for any individual actor leads to a biasing of local value to the maximization of value from the perspective of that actor, i.e. making the rich richer. That is, the system inherently has a second order effect of the rich getting richer, regardless of who they are, and this isn't based on something they do but is a dynamical property of the system -- it is _because_ they are rich that they get richer.
+
+The net of it is that the incentives to innovate in capitalism are quickly smothered by locally self-serving incentives. To see evidence of this, look no further than the hundreds of promising startups that are acquired by larger companies and then simply shut down, essentially constituting a bribe to these founders to stop competing with the larger company, and instead to help the larger company with its existing programmes -- effectively defusing the very innovation that competition is supposed to spark.
+
+So capitalism, after all, isn't as good at innovation as we like to think. But what about ABE?
+
+In ABE, I would say that the incentive to innovate is stronger because you can rest assured that you will be fairly recognized the same way as anyone else, without having to jump through hoops to get startup capital or resources of any kind, or have special "connections" or a "network" or worry about who can be trusted and who might take advantage of you, since anyone can be an investor and a simple payment to a project makes you one. Thus there are incentives in place for others to invest in value you have to contribute, and therefore for others to discover what you have to say, if indeed what you have to say is valuable. It frees you up to do precisely what you love and precisely what you are good at and precisely what contributes the most value, without your having to worry about any of the logistics since there are incentives in place for those logistical details to be taken care of by all. _There will always be help_ at every stage, for any purpose, since it is all attributable.
+
+## Feedback
+
+- Thanks. Love your license.
+- cue up a marxist analysis, and then shut down the proletariat? :D
+- If I was being told that this man is one of Protesilaos' long lost siblings, I would believe it.
+
+[[!inline pages="internal(2022/info/maint-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/maint-nav)" raw="yes"]]
+
+[[!taglink CategoryCommunity]]
diff --git a/2022/talks/meetups.md b/2022/talks/meetups.md
new file mode 100644
index 00000000..8f7118a0
--- /dev/null
+++ b/2022/talks/meetups.md
@@ -0,0 +1,81 @@
+[[!sidebar content=""]]
+[[!meta title="Attending and organizing Emacs meetups"]]
+[[!meta copyright="Copyright &copy; 2022 Bhavin Gandhi"]]
+[[!inline pages="internal(2022/info/meetups-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Attending and organizing Emacs meetups
+Bhavin Gandhi (he/him, IRC: bhavin192,
+[@bhavin192@toots.dgplug.org](https://toots.dgplug.org/@bhavin192))
+
+[[!inline pages="internal(2022/info/meetups-before)" raw="yes"]]
+
+
+(You can select English or Spanish as the closed captions for this talk.)
+
+Events like EmacsConf are a great place to meet Emacs users around the
+world. You get to learn about new ideas, workflows, packages, and make
+new friends as well :) What if I tell you that you can meet fellow Emacs
+users more frequently, that too in your region/time zone? Yes, meetup
+groups!
+
+In this talk, I will help you explore Emacs meetup groups of your
+interest. And cover how to attend meetups, how to stay updated with all
+the Emacs related events, and more.
+
+Organizing a meetup and setting up a platform for others is even more
+fun! I will cover how to easily get started with organizing meetup
+events as well.
+
+Outline:
+
+- Why meetups?
+- How to find nearby groups?
+- Staying updated with events
+- Organizing meetups
+- My learnings from organizing meetup events
+
+## Links
+- [EmacsWiki: Usergroups](https://www.emacswiki.org/emacs/Usergroups)
+- [Emacs calendar](https://emacslife.com/calendar/)
+- Slides: [meetups.org: rendered on
+ GitLab](https://gitlab.com/bhavin192/talks/-/blob/master/2022/emacsconf-2022/meetups.org),
+ [meetups.org:
+ raw](https://gitlab.com/bhavin192/talks/-/raw/master/2022/emacsconf-2022/meetups.org)
+# Discussion
+
+## Notes
+
+- Anybody in NoVA (Viriginia area) interstesd in starting meetup?
+- EuGE is Latin for "ah-ha"
+ - pronounced "huge"
+- Thank you so much. Good talk.
+- Thank you for promoting and informing about meetups. I think I am gonna look for one.
+- yay, quiliro's spanish subs now display in https://emacsconf.org/2022/talks/meetups/
+- I have found that we needed at least 2 hours before any event and 2 hours after, besides the proparations. You said that it takes 1 hour to organize.
+- Also, bhavin192 - thanks for the shout-out for M-x Research. I'm the organiser :D
+
+## Questions and answers
+
+- Q:  Do you attend or organize a Emacs meetup?
+ - A:
+- Q:  Thoughts on physical meetups? 
+ - A:
+- Q: Any thoughts on hybrid meetups (physical wher most peopel are
+ plus stream it online)?
+ - A:
+- Q: bhavin192 - I'm interested! Should we start by having an irc/matrix channel to discuss?
+ - IRC or Matrix for all the organizers. Hmm, sounds good as well. How about reusing #emacsconf? It is pretty much free during rest of the year.
+- How do you automate?
+- What is ILUGC ?
+- could you share your slides? there were a few links and emails I couldn't get
+ - slides: https://gitlab.com/bhavin192/talks/-/blob/master/2022/emacsconf-2022/meetups.org
+
+[[!inline pages="internal(2022/info/meetups-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/meetups-nav)" raw="yes"]]
+
+[[!taglink CategoryCommunity]]
diff --git a/2022/talks/orgsuperlinks.md b/2022/talks/orgsuperlinks.md
new file mode 100644
index 00000000..ba94f71d
--- /dev/null
+++ b/2022/talks/orgsuperlinks.md
@@ -0,0 +1,196 @@
+[[!sidebar content=""]]
+[[!meta title="Linking headings with org-super-links (poor-man's Zettelkasten)"]]
+[[!meta copyright="Copyright &copy; 2022 Karl Voit"]]
+[[!inline pages="internal(2022/info/orgsuperlinks-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Linking headings (poor-man's Zettelkasten) and defining advanced task dependencies
+Karl Voit (he/him, IRC: publicvoit, <mailto:EmacsConf22@Karl-Voit.at>)
+
+[[!inline pages="internal(2022/info/orgsuperlinks-before)" raw="yes"]]
+
+As written in [this blog
+article](https://karl-voit.at/2020/06/14/Zettelkasten-concerns), Karl
+thinks that a full-blown Zettelkasten workflow is not always a perfect
+match for a given set of requirements.
+
+To him, the most important aspect of the Zettelkasten method are the
+**bi-directional links between arbitrary headings**. If you want to use
+such links without the additional burden and benefit of a
+Zettelkasten implementation, you might want to learn how
+bi-directional links are able to help you here.
+
+In this talk, you will see a demo how links are used in the author's
+setup for linking headings and **defining advanced dependencies between
+todo headings**.
+
+You can find [the **self-contained demo file** on
+Gitlab.com](https://gitlab.com/publicvoit/orgmode-link-demo). It
+consists of various packages and some Elisp glue to create these methods:
+
+- Bi-directional links between headings:
+ - [org-super-links](https://github.com/toshism/org-super-links) with `org-super-links-org-ql` and `org-super-links-org-rifle`
+ - `org-super-links-quick-insert-inline-link`
+ - `org-super-links-quick-insert-drawer-link`
+ - [org-linker](https://github.com/toshism/org-linker)
+
+- Advanced dependencies:
+ - [org-edna](https://www.nongnu.org/org-edna-el/)
+ - [org-linker-edna](https://github.com/toshism/org-linker-edna)
+
+- Search, completion and narrowing:
+ - [helm](https://emacs-helm.github.io/helm/)
+ - [helm-org](https://github.com/emacs-helm/helm-org)
+ - [org-ql](https://github.com/alphapapa/org-ql) with `helm-org-ql`
+
+- Adding CREATED properties for new headings: [org-expiry](https://git.sr.ht/~bzg/org-contrib/blob/master/lisp/org-expiry.el) (not necessary for any demo functionality)
+
+More on bi-directional links and Karl's Org mode projects:
+
+- [UOMF: Linking Headings With org-super-links (Poor-Man's Zettelkasten)](https://karl-voit.at/2020/07/22/org-super-links/)
+- [UOMF: On How to Define Projects in Org Mode](https://karl-voit.at/2019/11/03/org-projects/)
+- [A Draft Workflow for Advanced Project Management Using Org Mode and Org Edna](https://karl-voit.at/2020/08/14/project-mgt-draft/)
+- [Zettelkasten/Org-roam/Org-brain Is Crap](https://karl-voit.at/2020/06/14/Zettelkasten-concerns/)
+
+[More Emacs-related articles by Karl](https://karl-voit.at/tags/emacs/)
+
+# Discussion
+
+## Notes
+
+- Please note that Karl has written additional notes and links on
+ <https://emacsconf.org/2022/talks/orgsuperlinks/> + the linked blog
+ article <https://karl-voit.at/2020/07/22/org-super-links/>
+- Method vs. tool:
+ <https://karl-voit.at/2021/01/18/feature-vs-method/>
+- nice talk
+
+## Questions and answers
+
+- Q: so the LINKS drawers holds so-called "backlinks"?
+ - A: yes. You can customize the drawer name.
+- Q: does this configuration you use need packages outside elpa?
+ - A: yes. repository link:
+ <https://gitlab.com/publicvoit/orgmode-link-demo>
+- Q:Can you filter out blocked taskes on stuff like your agenda or a
+ specific agenda view, When you want to know what you can do next?
+ - A: Blocked tasks are never shown on the agenda by default.
+ Whenever there is no scheduled timestamp attached to a heading,
+ it's not visible on my agenda. If you use the dependencies as
+ described in the demo, the timestamp is only marked if the
+ previous one is canceled. So blocked tasks are not shown in this
+ setup.
+- Q:The functionality seems quite nice but the markup seems pretty
+ heavy in the property drawers.  Do you ever have any issues having
+ so much meta-level information in the file?
+ - A: As long as it doesn't need to be typed manually there's no
+ real issue. The orgmode files tend to be large. I haven't felt
+ it's bloated.
+- Q:Does this change how you use todo keywords "next, todo,
+ blocked?", avoiding some or starting to use others
+ - A: No. My keywords are NEXT, STARTED, WAITING, DONE, CANCELLED
+- Q:Org Brain has stuff like parent links and directional links,
+ sibling links. If org roam else has nothing else intersting what
+ about like the previous stuff?
+ - A: My links are not "directed" most of the time. So I don't
+ have the requirment for specific link types or directions. In
+ short: I don't need semantic links so far. Following the KISS
+ principle. I get the information from the context of the link.
+- Q: DO you find that the links are fragile, hard to maintain?
+ - A: not really. sometimes I rename links and the link name is not
+ updated, that require some fixes by hand
+- Q: PhD Thesis link
+ - A: <https://karl-voit.at/tagstore/en/papers.shtml> The first
+ chapters of my thesis should be easy to read for the general
+ public as I summarize the history of PIM (Personal Information
+ Management) research
+ - + related github projects around tagstore
+ <https://github.com/novoid/>
+ - tagstore <https://karl-voit.at/tagstore/> = research
+ prototype software in Python to do research around tagging
+ interfaces for local files
+ - flexible to adapt
+ - Topic: improving the local file management beyond the usual
+ hierarchy of directories (tagging + TagTrees)
+ - DONE AFTER my PhD:
+ <https://karl-voit.at/managing-digital-photographs/>
+ filetags, date2name, move2archive, ...
+- Q: why not org-id's UUIDs for IDs, and the preference for
+ human-readable ones (and not just use CUSTOM_ID for those)?
+ - Karl: I hate UUID because they're opaque, so I removed them.
+ - I don't understand. There is a part for human to read
+ description: [[UUID][A human readable description]]
+ - Karl: this would not add any benefit from my personal point
+ of view as longs as the human-readable ID is unique. So why
+ not get rid of the UUID and use the humand readable link
+ text?
+ - A human readble link is fragile, e.g. space, non acsii
+ characters. When unexpected things happen, it is hard to
+ detect the change. Using human-readable link text
+ release the stress, so the user could focus on the
+ content. 
+ - Karl: You should take a look at my Elisp function that
+ generates the ID strings. No problem so far.
+ <https://github.com/novoid/dot-emacs/blob/master/config.org>
+ - I found you write a blog about it:
+ <https://karl-voit.at/2019/11/16/UOMF-Linking-Headings/>
+ . I will read about it.
+ - I found `(defun
+ my-generate-sanitized-alnum-dash-string(str)`
+ in the
+ - way to generate your ID requires replace
+ non-ASCII characters: ;;
+ - Replace German Umlauts with 7-bit ASCII.
+ - ;; Replace German Umlauts with 7-bit ASCII.
+ - (str (replace-regexp-in-string "[Ä]" "Ae"
+ str t))
+ - (str (replace-regexp-in-string "[Ü]" "Ue"
+ str t))
+ - This is a very tedious work to do. I don't know
+ if users come from
+ - other non-ASCII characters would have to write
+ their own replacement
+ - regular expression.
+- Q. do you have/use anything for "what links here / to this
+ heading", in a more occur/grep-style buffer and auto.?
+ - A: not yet, I use org-occur in the buffer and get the result
+- Q: (totally tangential):  Do you navigate your files with the arrow
+ keys or with C-{pnbf}?  I saw arrows on your key-cast.
+ - It's more complicated than that:
+ <https://karl-voit.at/2021/05/23/advantage2-modifications/>
+ - In short: I'm using the arrow keys but they are not where
+ you'd assume they are. ;-)
+- Q: link to thesis please
+- Q: any way to do links by heading hierarchy?
+- Q: so the LINKS drawers holds so-called "backlinks"?
+ - A: yes. You can customize the drawer name.
+- does this configuration you use need packages outside elpa?
+ - A: my setup Elisp could be improved to great extend.
+ - A: <https://emacsconf.org/2022/talks/orgsuperlinks/>
+ - A: <https://gitlab.com/publicvoit/orgmode-link-demo>
+
+### Other discussions from IRC
+
+- Wow, this looks super organized
+- i have to admire embedding that much info into tasks (ie: blocked, next, etc), i never get that far. my headings are much more lightweight, i'd likely use a plain list if i could fold over the text below
+- Is there a specialized package for showing backlinks (org-mode) in a buffer, say based on IDs, in a normal occur buffer or even a grep/rg style thing?
+- i really like that both publicvoit's org-superlinks and hyperbole are both elisp and inside emacs, where org-roam is a hodgepodge of external tools (my impression)
+ - isn't sqlite the only external dependency for org-roam though?
+- Speaker: Actually, to create the demo fully self-contained was most of the effort with this demo. By far.
+- Fashion:
+ - *that* is a dapper looking fellow!
+ - Really loved the ending publicvoit
+ - haha the goodbye was epic
+ - I am way underdressed for this conference it appears
+ - oh! I backed up and see the shorts that publicvoit was wearing!
+ - A fashion leder if you will
+ - I was here for the fashion. Not dissapointed.
+
+[[!inline pages="internal(2022/info/orgsuperlinks-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/orgsuperlinks-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]] [[!taglink CategoryZettelkasten]]
diff --git a/2022/talks/orgvm.md b/2022/talks/orgvm.md
new file mode 100644
index 00000000..b4f3c72c
--- /dev/null
+++ b/2022/talks/orgvm.md
@@ -0,0 +1,45 @@
+[[!sidebar content=""]]
+[[!meta title="orgvm: a simple HTTP server for org"]]
+[[!meta copyright="Copyright &copy; 2022 Corwin Brust"]]
+[[!inline pages="internal(2022/info/orgvm-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# orgvm: a simple HTTP server for org
+Corwin Brust (he/him/any, IRC: corwin)
+
+[[!inline pages="internal(2022/info/orgvm-before)" raw="yes"]]
+
+OrgVM is, so far, a very simple nodejs wrapper, invoking Emacs in
+batch mode. I'll talk about how I use it to make project notes
+available on demand to my colleagues and how it works, especially the
+generation of elisp from javascript/JSON.
+
+
+# Discussion
+
+## Questions and answers
+
+- Q: Why not build upon Nic Ferrier's elnode web server written in
+ Elisp?  As Nic describes it: "Elnode is a non-blocking IO webserver
+ written entirely in EmacsLisp. It's like an EmacsLisp version of
+ node.js."  Your implementation will likely get much simpler if you
+ keep it all in Lisp.
+ - A: I chose to build with node.js because that was easy for me;
+ but an Emacs based version sounds awesome!
+- Q: Is this using org-info-js? 
+ - A: nope; I need to learn more about this - seems very exciting
+ and like it could influence this project
+- Q: Why did you make yet another web server?
+ - I read it was to make your org files portable.
+ - He's auto-generating .html files to match his org files in the background so that he can browse them via web browser right?
+- Q: How is that portable. You still need a web browser. Org files need the very basic..... cat
+- Q: Have you heard about https://codeberg.org/gopiandcode/emacs-viewer, by any chance?
+
+[[!inline pages="internal(2022/info/orgvm-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/orgvm-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]]
diff --git a/2022/talks/orgyear.md b/2022/talks/orgyear.md
new file mode 100644
index 00000000..010445a1
--- /dev/null
+++ b/2022/talks/orgyear.md
@@ -0,0 +1,129 @@
+[[!sidebar content=""]]
+[[!meta title="This Year in Org"]]
+[[!meta copyright="Copyright &copy; 2022 Timothy"]]
+[[!inline pages="internal(2022/info/orgyear-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# This Year in Org
+Timothy (he/him, IRC: tecosaur)
+
+[[!inline pages="internal(2022/info/orgyear-before)" raw="yes"]]
+
+You've all been avid readers of the (somewhat irregular) "This Month in
+Org", now you can be an avid listener of a special edition exclusive to
+EmacsConf: "This Year in Org", a quick rundown of major developments in
+Org over the past year, and perhaps a hint of some things lying around
+the corner.
+
+
+# Discussion
+
+## Questions and answers
+
+- Q: Not a question, but just a great thanks for "This month in org"
+ which helps us get awareness about the greatness of Org!
+ - A:Thanks :)
+- Q: Does the project need other kinds of support (infrastructre,
+ etc.) which can't be covered by donations to devs? (without
+ detriment to supporting devs!!)
+ - A: There isn't much in terms of ongoing costs (just hosting
+ <https://orgmode.org> really), but donations are great for
+ dignifying the work done, indicating the value it has to the
+ community, motivating developers, and also helping
+ justify/enable more time to be spent working on Org.
+- Q: What is the use of parsers in other languages? Is it to make org
+ available in other applications?
+ - A:Org is being used outside Emacs (e.g. Hugo, Logseq, rendering
+ on GitHub/GitLab/Gitea), and so it's worth trying to make sure
+ they treat the syntax in a consistent manner. Similarly, if
+ people build nice tools for Org outside Emacs, that's nice for
+ us :)
+ - Voit: Shameless plug:
+ <https://gitlab.com/publicvoit/orgdown/-/blob/master/README.org>
+ is also an idea to promote the syntax of Org mode in tools
+ outside of Emacs. After all, everybody is getting advantages
+ when Orgdown (syntax of Org mode; often named "org" but it's
+ frequently mixed up with the Elisp implementation) is a rather
+ popular syntax.
+- Q: citar package is a really pleasant addition with support for
+ org-style citations. What's your take?
+ - A: Citar is great, IMO
+- Q: How many hours a week do you spend contributing to org?
+ - A: It varies a lot. It's also a bit difficult to say, because
+ there have been a fair few patch sets which have been
+ "incubated" in my config before brining them to Org mode, and
+ so I need to detangle "time spent tinkering on Org in my
+ config" and "time spent working on patches for Org mode".
+ Some weeks it's ~0h, others it might be as much as ~30h. The
+ average might sit around ~5h, but that's just a wild guess.
+- Q: As a fan of emacs org-mode and Julia myself too, do you see any
+ possiblities/wishes/plans to somehow connect org and julia evenmore
+ (apart from ob-julia). Perhaps a julia parser of org-mode, or
+ something like that?  Just wanna personally thank you for all the
+ effort in org, emacs and julia you are putting throughout! I have
+ learned quite a bit about doom emacs config from your blogs too. I
+ feel like our setup/interest overlaps quite a bit, and its always
+ helpful too see your work out there. Thanks again, keep up the great
+ work!
+ - A: Wait a few slides 😉 (<https://github.com/tecosaur/Org.jl>)
+- Q: "Org", "Org-mode", "org-mode", "Org/Org-mode"? Which one
+ for the format/notation and which one for the software proper, and
+ then the whole thing (with org-contrib and third-party packages) vs
+ just the repo and major mode per se?
+ - A: "Org mode" for the project, "org-mode" for the major
+ mode, "Org" for the format
+- Q: How much time/week do you spend editing your doom config?
+ - A: Err, too much 😆 
+ - I feel that :D
+- Q:In your doom configs, you like using variables fonts and stuff,
+ basically a lot visuals everywhere. I feel that it makes everything
+ sluggish. Am I doing something wrong? Maybe there are less visible
+ tricks in your config?
+ - A: It doesn't make things slow enough that I care, basically.
+ Doom does some nice performance stuff, and I try to go for
+ deferred loading and look for text-properties over overlays for
+ performance in visual packages. As for varaible pitch fonts
+ look, that's handled by Harfbuzz not elisp AFAIK (and so
+ doesn't really affect performance).
+- Q: Do you use linux or mac system? What kinds if not a secret?Q
+ - Linux, OpenSUSE Tumbleweed specifically
+- Q: I wonder why the export to HTML has not been modernized. Any particular reason?
+ - A: It's going to take a whole lot of time an effort. I take that as being more flexible and better able to suit "modern HTML/CSS" usage. Incidentally, the HTML and Markdown backends are two things I'd like to have a look at next year (if I end up having the time).
+- Q: haven't looked at citation support at all yet, any great intro articles out there?
+ - I may be (am) biased, but try https://blog.tecosaur.com/tmio/2021-07-31-citations.html 🙂
+ - More discussion about citations:
+ - and I have found the citar package a really pleasant addition with support for org-style citations
+ - Citar is great, IMO
+ - Citar is indeed great. I have been meaning to switch to Citar from ivy-bibtex, but honestly I am just being lazy
+ - I am not sure as I haven't used ivy-bibtex. I am half-way migrating away from org-ref but will likely keep that around for a while longer (mostly for old links and its doi-utils import functions)
+ - I found citar really easy to set up and get started with. Very clear and clean entry points
+- Org mode outside of Emacs: https://gitlab.com/publicvoit/orgdown/-/blob/master/doc/Tool-Support.org
+ - A: Also https://orgmode.org/tools.html 🙂
+- your visuals have always been charachteristic, where did you learn that? in the sense that I can reasonably guess you made something when I see the result. I was also thinking about your config or the survey website, or are they inspired by that theme?
+ - A: I think that's just "themed Beamer metropolis". I do also naturally go to light themed content with a pale yellow-y background.
+- Q: "Org", "Org-mode", "org-mode", "Org/Org-mode"? Which one for the format/notation and which one for the software proper, and then the whole thing (with org-contrib and third-party packages) vs just the repo and major mode per se?
+ - A: "Org mode" for the project, "org-mode" for the major mode, "Org" for the format
+- Q: Thank you :) Any plans to use tree-sitter with org? How would it relate to org-element? But if I remember correctly org syntax can not be fully expressed as tree-sitter grammer... So maybe tree-sitter is not for org?
+ - i don't grasp the recent infatuation with external parsers.
+ - A: They're happening, and syntax divergence is bad. and if they are used to make neat things, it's nice if we can make use of them too
+
+## Other discussions from IRC
+
+- yeah org-modern ?
+- lots of progress on the syntax doc, i just checked it out on worg
+- engraved-faces is excellent.
+- Again, an excellent talk.
+- Both talks were great! Thanks
+- good pace, slides, and clearly delivered
+- "aspirational rather than descriptive" -- I will remember this for future use :D
+- thanks tecosaur for the very nice overview and reminder of all the recent changes in org!
+
+
+[[!inline pages="internal(2022/info/orgyear-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/orgyear-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/python.md b/2022/talks/python.md
new file mode 100644
index 00000000..21601833
--- /dev/null
+++ b/2022/talks/python.md
@@ -0,0 +1,69 @@
+[[!sidebar content=""]]
+[[!meta title="Short hyperlinks to Python docs"]]
+[[!meta copyright="Copyright &copy; 2022 Eduardo Ochs"]]
+[[!inline pages="internal(2022/info/python-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Short hyperlinks to Python docs
+Eduardo Ochs
+
+[[!inline pages="internal(2022/info/python-before)" raw="yes"]]
+
+If we have a local copy of the Python docs installed then it is easy
+to define the three hyperlink functions in the Python program below,
+
+ # (find-pydoc "tutorial/classes")
+ # (find-pydocw "tutorial/classes")
+ # (find-pydocr "tutorial/classes")
+ class MyVector:
+ def __init__(v, x, y):
+ v.x = x
+ v.y = y
+
+such that each one expands its argument in the right way, and the
+first one opens the local URL
+<file:///usr/share/doc/python3.9-doc/html/tutorial/classes.html> in
+the browser, the
+second one opens <https://docs.python.org/3/tutorial/classes.html>, and
+the third one opens the RST source of those HTML pages in Emacs: the
+file `/<rstsourcedir>/tutorial/classes.rst.txt`.
+
+The docs for Python are designed to be navigated in a browser. Suppose
+that we start on the page
+[classes.html](https://docs.python.org/3/tutorial/classes.html)
+above, follow a couple of
+hyperlinks, and then we find this other page that, ahem, is very
+interesting and important and we *need* to have hyperlinks to:
+
+<https://docs.python.org/3/reference/datamodel.html#object.__init__>
+
+The most obvious way to create elisp hyperlinks to that page is to
+copy its URL to Emacs, edit it by hand to produce a `(find-pydoc ...)`
+hyperlink, duplicate that hyperlink twice, and add a "`w`" and a "`r`"
+into the right places&#x2026; but this is not very practical.
+
+In this presentation I will show a practical way to handle that. It is
+a new module of eev &#x2013;
+[eev-rstdoc.el](http://angg.twu.net/eev-current/eev-rstdoc.el.html)
+&#x2013; that performs both the
+expansions needed by `find-pydoc{,w,r}` and the "shrinkings" that
+convert URLs and filenames to short hyperlinks. Eev-rstdoc.el comes
+with three "families" of hyperlinks, expansions, and shrinkings: one
+for Python docs, one for SymPy, and one for MatPlotLib. It is easy to
+add new families, and the parameters for expansion and shrinking in
+each family are easy to configure.
+
+For more info see [this
+page](http://angg.twu.net/emacsconf2022-py.html). For a translation of the Python tutorial
+to a format that has only executable examples and elisp hyperlinks,
+see [this](http://angg.twu.net/e/python.e.html#tut-numbers).
+
+
+[[!inline pages="internal(2022/info/python-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/python-nav)" raw="yes"]]
+
+[[!taglink CategoryPython]]
diff --git a/2022/talks/rde.md b/2022/talks/rde.md
new file mode 100644
index 00000000..62810ae7
--- /dev/null
+++ b/2022/talks/rde.md
@@ -0,0 +1,105 @@
+[[!meta title="rde Emacs introduction"]]
+[[!meta copyright="Copyright &copy; 2022 Andrew Tropin"]]
+[[!inline pages="internal(2022/info/rde-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# rde Emacs introduction
+Andrew Tropin (he/him, IRC: abcdw, <https://trop.in>)
+
+[[!inline pages="internal(2022/info/rde-before)" raw="yes"]]
+
+
+[rde Emacs](https://git.sr.ht/~abcdw/rde/tree/master/item/rde/features/emacs-xyz.scm)
+is a vanilla-flavored distribution of Emacs, which intergates well
+with your OS, WM and rest of the environment. It's built on top of
+[Guix Home](https://guix.gnu.org/en/blog/2022/keeping-ones-home-tidy/)
+project and allows to manage not only elisp packages and
+configurations, but other dependencies like operating system packages,
+user program configurations in a declarative and reproducible manner.
+
+You don't need to follow complicated installation instructions, apply
+workarounds and be afraid of updates: just do it, update rde, throw some
+custom elisp code, declare and customize features you need or want to
+try in a simple lisp (Scheme) file and you will get it. Don't like the
+result? Just rollback to previous generation and EVERYTHING will work
+as before. Once you make it to your liking, it will work forever*, even
+if you move to a new laptop/workstation.
+
+# Discussion
+
+## Notes
+
+- Thank you. Super cool that you started guix home. (:
+
+## Questions and answers
+
+- Q: Do you use this to have multiple configs running side by side for
+ live comparison?
+ - A: Yes, two separate configs. (more capture TBD)
+- Q: Are you using Guix System, or Guix on top of another distro?  If
+ System, any tips?  I tried Guix System, but found getting started
+ was very difficult due to lacking WiFi firmware and incomplete
+ documentation.
+ - A: Yes he uses Guix system and package manager. RE: WiFi: First
+ option is to buy a wifi adaptor that doesn't require
+ proprietary firmware.
+- Q: One of the issues I've had managing Emacs packages with Guix is
+ a conflict between the Guix package ethos (read-only) and the Emacs
+ package ethos (hackable in real-time). Any suggestions to resolve
+ this?
+ - A: There is an interactive/live workflow for editing emacs
+ configuration, which kinda similiar to usual, but you persist
+ your changes from time to time and rebuild the configuration to
+ apply those persisted changes for new emacs instances.
+- Q: What is next for rde?
+ - A: Short term plan is to prepare more documentation, getting
+ started guide, live CD to explore system. Also would like to
+ find maintainers to help. 
+- Q: Do you use emacs without this? If so, for what purposes, and how
+ does it feel compared to rde?
+ - A: No, I don't use emacs outside of RDE. There's a way to add
+ mostly anything in your emacs config into RDE.But doesn't use
+ it because it isn't reproducible. Can break between machines.
+- Q: Are there any plans to push things from rde to guix's main
+ channel?
+ - A: Would like to push some things upstream but can't always fit
+ patches 
+- Q: How difficult is it to add support for new Emacs packages to
+ Guix?  Have you found that's burdensome vs. package.el or other
+ in-Emacs package management approaches?
+ - A: Packaging elisp for guix isn't hard at all, in most cases
+ it's really easy. Sending patches is a little more involved,
+ but also not rocket science :)
+- Q: Do your reckon RDE is currently opinionated? Or is it a one size
+ fits all framework?
+ - A: It's vanilla-flavored and kinda opinionated at the same
+ time, but everyone free to use whatever parts/features fits
+ them, also they free to implement or use implemented by others
+ features, which can fit better for them than original rde's
+ features.
+- Q: How to get into RDE? Is there already documentation/getting
+ started guide?
+ - There is an example configuration and link to slightly sparse
+ manual at <https://git.sr.ht/~abcdw/rde>, you can ask question
+ #tropin at libera.chat.
+- Q: Can you mix RDE with custom emacs init file?
+ - Yes, you can, but it will add irreproducibility to your setup.
+
+Other discussions from IRC:
+
+- Easy reliable rollbacks is definitely one of the things I love about nix and guix
+- Yes! It is great to know that stuff is hard to mess up. This leads to more fun experimenting.
+
+[[!inline pages="internal(2022/info/rde-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/rde-nav)" raw="yes"]]
+
+# Related talks
+
+- [Building reproducible Emacs](/2020/talks/08/) - Andrew's previous talk at EmacsConf 2020
+[[!sidebar content=""]]
+
+[[!taglink CategoryConfiguration]]
diff --git a/2022/talks/realestate.md b/2022/talks/realestate.md
new file mode 100644
index 00000000..d3dbbdab
--- /dev/null
+++ b/2022/talks/realestate.md
@@ -0,0 +1,91 @@
+[[!sidebar content=""]]
+[[!meta title="Real estate and Org table formulas"]]
+[[!meta copyright="Copyright &copy; 2022 Daniel Gopar"]]
+[[!inline pages="internal(2022/info/realestate-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Real estate and Org table formulas
+Daniel Gopar (he/him, IRC: gopar, <mailto:gopardaniel@gmail.com>)
+
+[[!inline pages="internal(2022/info/realestate-before)" raw="yes"]]
+
+This will be a 20 minute presentation on how I use org mode tables (specifically formulas) on how I can quickly see if a deal is feasible or not.
+
+Topics will include:
+
+- Creating Table Formulas
+- Special Buffer Editing Formulas
+- Formatting output
+- Special Debugging just for formulas
+- Creating Custom Formulas
+- Automatically re-calculating rows/table
+- Finally Putting it all together to tell at a glance if a property is ideal or not
+
+Essentially bits and pieces from this section of the manual:
+<https://orgmode.org/manual/The-Spreadsheet.html>
+
+
+# Discussion
+
+## Notes
+
+- <https://orgmode.org/manual/The-Spreadsheet.html>
+- Really liking the idea of the talk so far, but I would suggest zooming in on the text more next time
+- Damn, org tables have so many more features than the ones I use already
+- tables in org are highly underused. all the functionality of spreadsheet calculators with the power of elisp at your fingertips!
+- this talk is awesome
+- and org-mode has plenty of hidden power...
+- and the power of Emacs Calc, to boot. Including handling units like kW, m, Pa, ...
+- +1 for the awesomeness
+- I've always been slightly apprehensive of going full spreadsheet with org tables but the features are very cool.
+- I actually learned a lot from this talk. Thanks @gopar.
+- great talk, thank you very much!
+- excellent presentation, thanks!
+- loved the presentation
+- just downloaded a .webm of the talk. looks great on my screen (1280x720)
+- Thanks for the Org mode Table tips
+- was a fun, straight forward how to. very useful.
+- I don't have any questions now, but I'm going to try to learn many things that you demonstrated!
+- I hadn't seen the formula debugger before. Very useful information.
+- org tables are so powerful
+- moving around cols + rows - is also way faster than what one can do in GUI spreadsheet apps
+- oh! great, thanks for sharing!
+
+## Questions and answers
+
+- Q:  Pretty neat-- Can you say how this is better than maintaining a
+ gui spreadsheet? 
+ - A: As all things in life, this is preference. org tables are
+ text only and for me this is easier than learning yet another
+ tool (google spreadsheets/MS excel/etc) but totally up to you
+ :)  Also, you can write your formulas in Elisp instead of
+ whatever crippled language you have to use in other
+ spreadsheets.+2 (move the logic to lisp to other package and
+ decouple/reuse it other documents, test it, etc.); Moving around
+ cols + rows - is also way faster than what one can do in GUI
+ spreadsheet apps
+- Q: Is there a way to share the constants between the tables?
+ - A: You can create a constants for the entire buffer, or save
+ them as variables :)
+- Q: Can you please provide the link to the org file?
+ - A: Currently the file is not hosted anywhere. I can put it in a
+ github repo in a bit :)
+- Q:Is there a way to link to a cell in another row in the same table?
+ or other tables?
+ - A:I think i remember reading that it is possible to do the first
+ part of your question. I don't think you can do the 2nd part
+ about linking cells from other tables. I'd recommend double
+ checking w/ the org docs since I can be misremembering things :)
+ - Update: Looks like it is possible ->
+ <https://orgmode.org/manual/References.html>
+- where is the org file for thase calculations?
+
+
+[[!inline pages="internal(2022/info/realestate-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/realestate-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]]
diff --git a/2022/talks/rms.md b/2022/talks/rms.md
new file mode 100644
index 00000000..a78c1d99
--- /dev/null
+++ b/2022/talks/rms.md
@@ -0,0 +1,433 @@
+[[!meta title="What I'd like to see in Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Richard M. Stallman"]]
+[[!inline pages="internal(2022/info/rms-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+# What I'd like to see in Emacs
+
+Richard M. Stallman
+
+[[!inline pages="internal(2022/info/rms-before)" raw="yes"]]
+
+We played [Richard Stallman's 2014 TEDx video: "Free Sofware, Free Society"](https://www.fsf.org/blogs/rms/20140407-geneva-tedx-talk-free-software-free-society) for context before his talk for EmacsConf 2022. The 2014 TEDx video is 14 minutes long, and is licensed under the Creative Commons Attribution-No Derivative Works 3.0 license. - EmacsConf organizers
+
+# Discussion
+
+## Notes
+
+- <https://stallman.org/>
+- <https://stallmansupport.org/> (regarding reports of attacks against
+ him)
+- "Free Software": A similar point of view related to contributing
+ to gated web forums:
+ <https://karl-voit.at/2020/10/23/avoid-web-forums/>
+- "Everything other than an Lispy language would be wrong for GNU
+ Emacs" (paraphrased)
+- RMS wants an update to "An Introduction to Programming in Emacs
+ Lisp" to cover changes to Emacs such as lexical binding.
+- Names of packages should help you remember what this package does.
+ Omit pure word-plays. Stick to names that people will remember.
+- RMS wants to edit formatted documents within Emacs using WYSIWYG
+ (like with LibreOffice)
+- RMS wants to get back to the situation where browsers decided how a
+ web page is rendered. Less browser features that allow to control
+ the look by the web page providers.
+- RMS doesn't want to use packages that are not actually part of
+ Emacs (e.g., Magit). RMS is using VC and not git.
+- RMS: "Happy hacking"
+
+## Questions and answers
+
+- Q: Pragmatically, how are people that buy into these ideals, and
+ especially those that build the software, meant to live/thrive,
+ short of renouncing many of the luxuries of modern life, as many
+ have been struggling to reconcile both it appears. Wouldn't it be
+ smarter and more productive longer-term to solve that problem too?
+ - A: (answered on stream, will be copied later)
+- Q: I have been admiring your work for free software for many years
+ now. I am a bit concerned about what will happen to the GNU project
+ when you retire (not soon, I hope!!). Have you planned how to manage
+ the GNU project in the long run?
+ - A: (answering on stream, will be copied later)
+ - RMS: haven't found a way yet. We'll have to try again.
+- Q: In response to your aversion to JavaScript support in Emacs: In
+ the same way that to revolt against the nonfree spirit in software
+ development one has to develop software, and that to fight nonfree
+ compilers one has to write a free compiler - can you fairly consider
+ rejection of JavaScript as a tool conducive to improving the state
+ of free JavaScript? A server can send back any MIME type to execute
+ on your machine, JS was just the most convenient.
+ - A: The issue is different in kind. We already have free JS
+ support.  Free browsers contain it.  The issue is the programs
+ that are going to run. If JS would allow you to inspect the code
+ before runing it, it wouldn't be problematic. The problem is
+ that they end up in your browser and the user has no idea
+ what's happening.  Websites are mistreating users. The
+ important thing about it is the danger it creates. 
+- Q: With all the recent additions and optimizations to Emacs Lisp
+ (lexical scoping, native compilation etc.) would you deem Emacs Lisp
+ suitable for general purpose programming outside Emacs (i.e.
+ scripting, running web servers). If not, why?
+ - A: Nothing wrong with this in principle, but it would be a
+ distraction. I'd rather we didn't do it. If we had 1K
+ programmers ready to do this and every other thing, no problem.
+ We don't. There are many other platforms that can accommodate
+ programs. I'd rather use emacs to do its work and leaving other
+ languages to theirs. 
+- Q: Would a namespace system similar to Common Lisp packages but
+ without :USE work in Emacs? Modern CL implementations have package
+ local nicknames to create package local prefixes.
+ - A: Basically, yes, but it has issues. [rest will be copied from
+ stream later...] A naming convention would be much simpler to
+ get right.
+- Q: With Emacs 29 adding more (awesome) features into vanilla emacs,
+ how should we ensure vanilla emacs does not get bloated with many
+ similar features? (example : ido/icomplete, vc/magit)
+ - A:To some extent we can't, because users do things differently.
+ I have never used Magit because I didn't want to use anything
+ not part of Emacs. I was unable to get into contact with the
+ Magit developer regarding integration of it within Emacs. I do
+ not use git as my main vc system. I think when packages have
+ very different approaches about how to handle things (like vc
+ versus magit) their approaches are not redundant.
+- Q: What do you have in mind for more modular Emacs development?
+ - A: There is no specific feature, but a way of thinking about
+ modularity when you write each package because you'll find that
+ when interacting with other packages you'll identify hooks that
+ may be there or may be missing. You could add a fairly general
+ hook so that instead of a rigid connection to other parts of
+ emacs you could use a general purpose hook that could do a lot
+ of things including the thing you need it to do.
+- Q: Could you give a few examples of the medium-sized jobs necessary
+ for WYSIWYG-editor support in Emacs?
+ - A: I can't really, but I would appreciate it if people started
+ putting that together. If you look at LIbreOffice then you could
+ choose a subset of very important ones that will give everyone a
+ start. 
+- Q:Is there an up-do-date document where people can see what is and
+ isn't on the roadmap, and why? i.e. a live version of talks like
+ this or email threads on emacs-devel?
+ - A: Not that I'm aware of.
+ - etc/TODO
+- Q: Should GNU (or someone else) define a safe-subset of HTML/CSS/JS
+ to make web browsers simpler and safer (e.g. by preventing JS from
+ contacting servers)?
+ - A: This would be an interesting thing to explore, but I don't
+ know if it can be done. Browser profiling is facilitated by
+ javascript. So, there is a collection of benchmarks and results
+ are different. So it allows the browser to gain information
+ without employing cookies. 
+- Q: How can we ensure the continuity of an understanding of the more
+ arcane parts of the [Emacs] source code, and increase their
+ evolvability, notably with regards to display, single-threading
+ limitations, etc.?
+ - A:  Single threading is a very specific thing. The furthest that
+ I've bothered to think about it is to enable multiple LISP
+ programs to run in parallel. My machine doesn't allow me to run
+ multiple threads in a single program, so it never mattered to
+ me. Basically, dev of the displaycode without threads is more
+ feasible. However, changes in the buffer data structure would be
+ required and that will be the hard part. Representing a buffer
+ with a certain display needs to be worked out first. You have to
+ decide the data structure thinking about how display can handle
+ it efficiently. Think about that at that stage. The editing and
+ data structure is the part to figure out.
+- Q: Do you recommend reaching out in [high] schools for volunteers
+ instead of universities because they are more prone to value the
+ objectives of freedom?
+- Do you recommend reaching out in schools for volunteers for both
+ advocacy and for development instead of unversities because they are
+ more prone to value the objectives of freedom?
+ - A: Reaching out for what? To teach about freedom or to find more
+ developers? Can you elaborate? **Questioner**:  
+ - A: my entrypoint in school was LaTex. 
+- Q: There was an effort called guile-emacs a while back, and there
+ was some effort to get guile to be able to compile and run
+ emacs-lisp, you mentioned there were still some challenges related
+ to guile, what road blocks kept some of these other efforts from
+ being used with Emacs?
+ - A: We never finished the problem of reconciling guile-emacs data
+ types with Emacs Lisp data types (such as handling nil/#f/()
+ interoperation [and string/buffer handling]).
+- Q: Are there any problems or disadvantages using the GNU AGPL for
+ non-networked software like Emacs packages?
+ - A: I figured the community would be happier if the radical
+ change did not happen in the license itself. 
+- Q: Is there a list of Emacs issues which can be solved by
+ programmers with different levels? For example my level is A, I know
+ basic elisp and C. How can i help?
+ - A: I don't know of one. I tend to think that people who know
+ only a basic knowledge. Looking at bugs and thinking about how
+ they could debug them, you could alert the developers. In the
+ process you'll learn more about how programs are written and
+ how to understand them. 
+- Q: What do you use emacs for beyond editing? Nice song :-)
+ - A: I use it for reading and writing email; this is what I do
+ most of the day.  (**Sings**) 
+ - "I've been answering my email,
+ - all the god-damned day / .. / <transcriber lost the thread
+ about here [lyrics available at
+ <https://stallman.org/doggerel.html#IveBeenAnsweringMyEmail>]
+- Q:With features like org-mode and enriched-mode, it seems like Emacs
+ is getting closer to the goal of WSIWYG. Are there specific ways in
+ which you see these as falling short?
+- Q: Do you use Org/Org-mode, and if so to what extent?
+ - A: No. Originally, it was an outlining mode that I never tried
+ to use. The documentation was not easy for  nme to grasp because
+ I had no use for it. Then others developed other ways to use the
+ org syntax. I was not interested in using the org syntax. The
+ process was daunting. It was not easy to separate other modules
+ used with org mode. Org mode could become an advance-- not
+ saying that it isn't useful-- if extended to do it, we could
+ use a replacement for texinfo. Texinfo's syntax was arcane and
+ was based on TeX. It could become a better way to write GNU
+ manuals. Probably more people know that syntax and if it could
+ be extended then it could be a superior way to write the
+ manuals. But we need to be able to generate all of the outputs
+ that we can generate now. HTML, info files, info browsers like
+ the one inside emacs, and generating input to TeX. This is not a
+ gigantic job. It is two or three medium-sized jobs.  
+- Q:Emacs is used by a small population relative to the population
+ that could benefit from it.  Do you have any thoughts on how to
+ expand the user base more broadly even among software developers?
+ - A: No. Basically, the fact is that vscode has an advantage--
+ which comes from Microsoft, which is putting it together as a
+ part of evil proprietary software... Users don't understand
+ that issue. I wish I could come up with a way to show them
+ what's at stake and why.  The TEDX talk is the closest thing. 
+- Q: It's hard to pick up Emacs if you do not speak English, can
+ something be done to address that?
+ - A: What do you actually suggest? Manuals? Messages that Emacs
+ displays? Command names? The easiest thing would be to deal wiht
+ the messages. It's hard to adapt it to Emacs because there is
+ no fixed set of messages. It could be done. It's not a terribly
+ hard process. Maybe differrent command names or an alternative
+ to meta-x. If you typed this other thing, it would only complete
+ over the other names in the native language. Working out the
+ details would take a great deal of thought. Docstrings: you
+ could write another set of them and write a set of help
+ commands. 
+- Q: What was the thought process behind making emacs lisp dynamically
+ scoped when you first created it? What advantages did it provide
+ over the alternative?
+ - A: It was simple. I did know how to implement it to build a
+ simple and small Lisp interpreter and being small was crucial to
+ bootstrap it on the hardware of that time. Things have changed
+ though, these days Eight Megabytes And Constantly Swapping is an
+ obsolete statement
+- Q: In light of that critique of JavaScript not being about the
+ language per se but rather the "culture of blindly getting and
+ running packages/libraries", what's so different with what's
+ currently done by the vast majority of Emacs/Elisp users to just
+ install packages blindly?
+ - A: Well, they know they're installing a package and that makes
+ all the difference. People could post various versions of a
+ package that people can look at and identify which to use or
+ whether one of them has horrible bugs. With JS there is no way
+ to do this, and most of these programs are not free. You don't
+ know which programs are being installed on your browser. These
+ things don't happen with elisp packages -- at least not when
+ they're in reputable package archives. 
+- Q: Do you think the freedom e.g., we have in Emacs, becomes a hurdle
+ for some people to pursue more important things in the world? I used
+ to do a lot of Emacs programming, but I recently try to stay away
+ from tinkering on Emacs.
+ - A: There may be more important things for you to do, but when
+ you look at all of the other distractions in the world it seems
+ unfair to criticize emacs. Look at video games which achieve
+ nothing but distraction. If you tinker with emacs code there is
+ a chance for you to discover something more important than how
+ to win a video game.
+ - Reply to Anwser: Sorry about the question. I do not intend
+ to criticize Emacs. It is more like a reflection on this
+ issue. The easiblity of jumping from anywhere in Emacs to
+ the source code, to the add-on packages, to the rich
+ documentation, to previous notes I have, becomes a strong
+ pulling force for me to do more important things. I often
+ found myself stay late in nights, and unable to have a good
+ sleep. Emacs gives me tremendous amount of freedom, I
+ definitely apprecitate it. On the other hand, I hate to stay
+ in non-free software, so I elimintate every possibility to
+ interact with them. This seems to be more effective to get
+ work done, since I only do the most important things, let it
+ go, and never thinking about the software. Don't get me
+ wrong, I agree with your point of view that the most
+ important thing GNU Emacs gives to the world is the freedom.
+ I  will do my part. 
+- Q: Do you still intend to merge your patch to the "shorthands"
+ feature to the master branch?
+ - A: Yes, but some work on the docstrings is blocking it. s.el
+ references other s.el functions in its docstrings and we'll
+ want to alter the docstrings, too. A new docstring construct
+ could fix that. We've added a lot alrady, one more would be
+ fine.
+- Q: Question about software freedom: how does it apply to software
+ that are art/media experiences, like videogames? In your view, Is
+ the creator of a videogame obliged to release it under a free
+ license?
+ - A: 
+- Q: And how would technologies like webassembly fit in with the
+ javascript issues?
+ - A: They don't change much. If the licensing situation is
+ handled the same way as with regular JS using LibreJS-recognized
+ license notices and complies with its license [like, by
+ providing its sources], it would be fine.
+- Q: Have you seen Haketilo <https://haketilo.koszko.org/> It looks
+ kinda like librejs?
+ - A: Haketilo is design to allow people to get some of the benefit
+ of free software. Potentially it offers a solution to the
+ javascript problem, but it has a long way to go. If you want to
+ do this, please do so. 
+- Q: Is writing a free software replacement to Github Copilot with
+ proper license attribution a good idea? (like Mozilla Common Voice)
+ - A: Maybe but remember that copilot is not a program, it is a
+ service. It is a computation that someone else will do for you
+ when you ask. What are the practical problems with doing that?
+ Not sure. Of course the server operates by running programs, but
+ there is still a difference. People who use copilot don't get
+ any kind of copy of the program. They send it to the server. It
+ might be a good idea. 
+- Q: Do you have any suggestions for helping propective contributers
+ streamline the copyright assignment needed to contribute to Emacs
+ (and other FSF software projects)?  If working for a large
+ corporation, simply navigating the internal beaucracy to find the
+ correct person/people to talk to who even understands what you're
+ talking about without a "deer in the headlights look" can be very
+ difficult.  This problem of gaining copyright assignment seems to be
+ a signifcant problem and ultimately splits people into two different
+ classifications, those who can contribute directly to FSF projects
+ (willing and able) and those who can't (willing but unable).
+ - A: The copyright assignment does not take long. The important
+ thing is the employer disclaimer. If your job entails
+ programming, we want to make sure that your employer does not
+ say, "you've got no right to contribute that program" and the
+ project is shafted. We are working on some simplifications to
+ make it easier for companies to say yes to it, but fundamentally
+ we need them to say yes. 
+- Q: What do you think of Hyperbole or EEV instead of org mode, or
+ other things for the stuff that org mode does "second brain /
+ knowledge base", or GTD 'getting things done' etc... among other
+ things in Emacs or other Emacs packages
+ - A: Well, I don't know that much about either of them. I don't
+ know EEV. I know Hyperbole, but it was many years ago. So I
+ can't have an educated opinion. Someone could study this, and
+ there would be a lot to study. If these are fairly similar-- is
+ either actually part of emacs? A: [Both are free software. ] 
+ - A: We might want to compare them to determine which is the best
+ possible add to emacs, but since I don't have specifics, I
+ don't want to state a priority preference. I don't have one. 
+- Q: I thought it was a virtue to separate the content from the style
+ or appearance of information. Part of being free is also to view
+ information in the format that you want. Does your WYSIWYG idea
+ erode this virtue and lead to more thinking -- perhaps undue
+ thinking about style over substance?  {seems like more freedom for
+ authors and less freedom for readers} (No the question is more about
+ the experience of creation.)
+ - A: I don't know actually. I know that in LibreOffice you can
+ make named styles, and you can change styles... Is that enough?
+ I am hardly a power user. 
+- Q: Do you ever dabble in retro-computing, e.g. logging into
+ TOPS10/20 systems SDF, etc?  
+ - A: No, I decided it's a waste of time. It's tinkering that
+ would not develop anything of any importance or use. And I know
+ if I'm going to enjoy developing something... I could enjoy
+ developing anything... I decided not to distract my attention
+ from useful computing. 
+- Q: Do you know Gemini <https://gemini.circumlunar.space/> ? (a
+ network of very simplified Markdown-like text files without images
+ and third-party content transmitted via an open/public/free protocol
+ which is not http(s)) If so, what do you think of it? (I'm dreaming
+ of a Gemini-web with interlinked Org mode syntax files)
+ - A: I don't remember and have no opinion. The lack of images
+ will turn out to be a considerable drawback. The exclusion of
+ images would be a big loss. 
+- Q: What is your opinion on the current state of large machine
+ learning/AI models? Even if the model is released under a free
+ license, it cannot be modified in a meaningful way without access to
+ vast quantities of training data, which isn't free. Even if it's
+ available, using the data requires datacenter-levels of computing
+ resources out of the reach of most users.
+ - A: I don't think that's true. You can modify it. You don't
+ need the previously used training data. The trained neural
+ network can be treated as source code. What else could it be? 
+- Q: Are there plans to bring modal editing (eg. evil-mode, viper) to
+ emacs core and did your opinion on modal editing change over the
+ years?
+ - A: I don't have a wish for that. Now it's not somehow morally
+ anathema. It's not a non-free program. How to incorporate this
+ into existing Emacs without doing any violence to its code is
+ the question. 
+- Q: Can complexity induced by company-funded free/libre code become a
+ problem, when the company pulls out, leaving the code potentially
+ unmaintainable?
+ - A: It's a matter of community, the same applies for software
+ developed by single individuals. Over-complicated programs
+ suffer more.
+- Q:  Hi Richard, do you know about [GNU
+ TeXmacs](<https://texmacs.org>)? If so, why doesn't it fit your
+ idea of a way to write rich documents with emacs-like keyboard-based
+ interfaces? (referring to "something like layout capabilities of
+ TeX and the editing capabilities of Emacs).
+ - A: 
+- Comment: If you've heard about attacks that others have been making
+ on me I refer you to stallmansupport.org.
+ <https://stallmansupport.org/>
+
+Some comments from IRC:
+
+- wasamasa : I admire the commitment and integrity. I'm just taking a step back and thinking if this should be expected, or a more pragmatic but still uncompromising approach would be warranted in the bigger scheme.
+- emacs has so many great features and packages just in the latest years and my feeling is that they are very much inspired/cloned/reworked from the features that came out of sublime text/atom/vs code/other current popular editor
+ - That's what happens when you have the freedom to shape the tool as you want. Different people like different features and sometimes (pretty often actually) it just happens that they end up implementing features they liked in other tools they used before.
+- it's important to state non-goals like fullblown webbrowser, javascript etc. because they are not obvious to newcomers and would add a lot of bloat
+
+Some comments from YouTube:
+
+- One thing I learned for sure after watching this great talk is that
+ Emacs is open to have all modern features that newer software like VS
+ Code use as long as it doesn't deteriorate user's freedom and privacy.
+
+- Great talk! I appreciate the continued effort into all things GNU,
+ ensuring our freedom to use these computers however we may choose. I
+ will add that the bits about JavaScript and the explosion of
+ complexity in browsers all being based in companies' unjust demand to
+ directly dictate what is displayed on a users screen are very clearly
+ true, and opens my mind up about how a truly free world is something
+ we need to continue to fight for
+
+- The formatted text editing in WYSIWYG was something I did not think I
+ would hear from RMS.
+
+- Looking at around 12:50, maybe it would be nice to have a nice
+ Org-Mode template that did that which incorporated the correct header
+ adjustments that could output in PDF or DOC forms for sharing. I keep
+ a couple of headers around that I reuse, but tweaking them is
+ monumental. It would be nice to have a "stock" selection of headers
+ for specific tasks.
+
+- RMS is a wonderful human being. Without him we would live in a world
+ of proprietary closed source software.
+
+- I would like to have "grammar sensitive selection and navigation" ...
+ basically putting numbers at the "syntax terms" (like variable, method
+ body, argument etc) .... But I'm not good/efficient enough at
+ programming to do something by myself ... I think this would make a
+ massive difference for coders and a nice feature to set apart from
+ IDEs. But hey, a man can dream :D
+
+- I still would love to see GNU/Hurd completed in my lifetime
+
+- Emacs 30 support for interoperation between libreoffice suite confirmed?? PogChamp
+
+Reactions:
+- <https://news.ycombinator.com/item?id=33888981>
+- [Why do we hack?](http://curious.galthub.com/blog/2022-12-04/)
+- [RMS On What He Wants and Doesn’t Want in Emacs](https://irreal.org/blog/?p=11013)
+- <https://www.reddit.com/r/emacs/comments/zktblg/emacsconf_2022_what_id_like_to_see_in_emacs/>
+
+[[!inline pages="internal(2022/info/rms-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/rms-nav)" raw="yes"]]
+
+[[!taglink CATEGORY:]]
diff --git a/2022/talks/rolodex.md b/2022/talks/rolodex.md
new file mode 100644
index 00000000..2da2a11f
--- /dev/null
+++ b/2022/talks/rolodex.md
@@ -0,0 +1,298 @@
+[[!sidebar content=""]]
+[[!meta title="Build a Zettelkasten with the Hyperbole Rolodex"]]
+[[!meta copyright="Copyright &copy; 2022 Ramin Honary"]]
+[[!inline pages="internal(2022/info/rolodex-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+# Build a Zettelkasten with the Hyperbole Rolodex
+Ramin Honary ("Rah-mean" (hard-H) "Ho-na-ree", he/him.
+
+- Email: <mailto:ramin.honary@gmail.com>
+- Homepage: <https://tilde.town/~ramin_hal9001/>
+- Mastodon: <https://emacs.ch/@ramin_hal9001>
+- GitHub: <https://github.com/RaminHAL9001>
+
+[[!inline pages="internal(2022/info/rolodex-before)" raw="yes"]]
+
+
+"Zettelkasten" is a methodology for marshaling your knowledge,
+ideas, creativity, into a database of hyperlinked notes, each note
+representing a single quantity of knowledge. The method was first
+devised by a well-published social scientist named Niklas Luhmann.
+Though he constructed his database with actual slips of paper in a
+box with a notebook for indexing, naturally, modern software removes
+the manual labor from the process.
+
+In the world of Emacs packages, Org Mode is the most well-known
+package that provides the tools necessary for building a Zettelkasten,
+along with extensions such as "Org Roam" which add functionality that
+manage links between Org Mode documents. But Org Mode is not the only
+Emacs package to provide such tools.
+
+In this talk, I demonstrate how to use an oft-overlooked package
+called Hyperbole as an alternative to Org Roam for managing hyperlinks
+and building a Zettelkasten. In particular I use the Hyperbole
+"Rolodex" feature, called "HyRolo." It was originally designed for
+tracking your personal relations, but it can be used to build a
+Zettelkasten with almost no additional configuration or 3rd-party
+packages. HyRolo is a purely textual database, and does not require
+an external database software to index the notes. It also provides a
+very rich set of "actions" so that notes not only link to each other,
+but can also trigger Emacs to execute code as well.
+
+# Presentation outline:
+
+## Introduction
+
+ - Ramin Honary
+
+ - Software Engineer, App Developer (mostly Python and Haskell)
+
+ - Emacs user for about 4 years (since 2018)
+
+## Key Takeaway
+
+ - The Hyperbole hyperlink markup language lets you create links that
+ execute arbitrary Emacs commands.
+
+ - To link entries, create a hyperlink that executes a **HyRolo**
+ search.
+
+## Quick overview of the Zettelkasten methodology
+
+ - **Note:** most of what I say about the Zettelkasten method comes
+ from Sacha Fast of <https://zettelkasten.de>
+
+ - **Zettelkasten is:** a database of interconnected ideas
+
+## Tools I use in day-to-day writing
+
+ - **Hyperbole:** for hyperlinking, search, project management
+
+ - **Embark:** arranging text, copy and paste
+
+ - **Org-Mode:** for markup
+
+ - **Dired:** for working with sets of files
+
+ - **Consult, Vertico, Orderless, Marginalia:** interactive search
+
+ - **Magit:** Git revision control of my plain-text database
+
+## Quick overview of Hyperbole
+
+ - **Core functionality:** a markup language for hyperlinks
+
+ - Applications such as **HyRolo** and **Koutline** built on top of
+ this core functionality.
+
+ - **HyRolo** is the feature I use as my Zettelkasten.
+
+## Configuration of Hyperbole using `use-package`
+
+ ```emacs-lisp
+ (use-package hyperbole
+ :config
+ (setq hbmap:dir-user "~/.emacs.d/hyperb/")
+ (setq hyrolo-file-list '("~/.emacs.d/hyperb/ideas.org"))
+ (setq hyrolo-date-format "%Y-%m-%d %H:%M:%S"))
+ ```
+
+## The Hyperbole Menu-Driven User Interface
+
+ - Menus are a kind of modal user interface
+
+ - Enter menu with Hyperbole leader key `{C-h h ...}`
+
+ - Select menu items with key presses
+
+ - Works a little like `which-key`
+
+## Getting started with **HyRolo**: Create a *zettel*
+
+ - Add entry: `{C-h h r a}` "*hyperbole rolodex add*"
+ - Prompts you for a title for the entry
+ - The Zettelkasten file (e.g. ~idea.org~) is opened
+ - Write the body of the *zettel*, save the file.
+
+## Searching the *HyRolo* database
+
+ - Multiple search options: by **string**, by **regex**, by **word**.
+
+ - I use **string search** most often: `{C-h h r s}`
+
+ - String search provides logical `AND`, `OR`, `XOR`, `NOT`
+
+ - Executing a search opens the `*HyRolo*` buffer.
+
+ - Read-only mode buffer with useful single-key navigation.
+
+## Searching the **HyRolo** database
+
+ - **`{o}` as in "overview":** hides all but the headings
+
+ - **`{a}` as in "all":** shows all information under each heading
+
+ - **`{t}` as in "top":** shows top-level entries
+
+ - **`{n}` and `{p}`:** next/previous result
+
+ - **`{h}` and `{s}`:** hide/show a search result subheading
+
+ - **`{C-u r}` as in "regex":** prompts for a new string search
+
+ - **`{e}` or `{M-RET}` :** jump to that entry for editing, although
+ using this command inserts a new timestamp, I just use `{C-/}`
+ to undo insertion of the timestamp.
+
+## How is **HyRolo** a Zettelkasten?
+
+ - **Key take-away:** The Hyperbole hyperlink markup language lets
+ you execute *arbitrary Emacs commands.*
+
+ - To link Zettelkasten entries, create an hyperlinks that execute a
+ **HyRolo** search.
+
+## How to create an explicit link
+
+ 1. Highlight text to be linked
+
+ 2. `{C-h h e c}` to create a link
+
+ 3. Prompted for link text with highlighted region (press enter)
+
+ 4. Prompted for action: `hyrolo-fgrep`
+
+ 5. Prompted for search string: `hyperbole`
+
+## How "explicit buttons" encode actions
+
+ - A **separate file** from the HyRolo flat-file database.
+
+ - By default, called `.hypb`, exists in the same directory as the
+ HyRolo flat-file database.
+
+## Conclusion
+
+ 1. A Zettelkasten is database of ideas linked together
+
+ 2. The Hyperbole **HyRolo** can run search queries
+
+ 3. The Hyperbole markdown creates links that execute queries
+
+ 4. This results in a minimal but useful Zettelkasten.
+# Discussion
+
+## Notes
+
+- My blog: <https://tilde.town/~ramin_hal9001>
+
+## Questions and answers
+
+- Q: Why is the time-stamp not implemented as an Org mode PROPERTIES
+ entry? (e,g, :CREATED:)
+ - A: Hyperbole pre-dates Org-Mode, although the maintainers have
+ made efforts to make Hyperbole compatible with Org-Mode as much
+ as possible. You could ask Bob Weiner directly, but it could
+ just be for backward compatibility, trying to keep the
+ formatting for current Hyperbole users. You could raise that as
+ an issue, they may be willing to include a config option
+ allowing you to specify the time-stamp format.
+- Q: why Hyperbole/HyRolo over Org-Roam? (I don't use either, just
+ curious)
+ - A: HyRolo and Hyperbole require no other software beyond code
+ builtin to Emacs.  For example, when I first built Org-Roam, it
+ did not work properly for me and I had to modify the build
+ process to get it set up.  With Hyperbole, you install one
+ package and you can start working.
+ - A: ^this, and I find it to be a lighter-weight solution. I was
+ able to get it working without depending on SQLite or doing any
+ indexing. Hyperbole is also a more general solution that can be
+ applied to a wider range of use cases than just Zettelkasten.
+- Q: How does this scale to very large data bases?
+ - A: It works very well with fairly large personal databases.  No
+ one has ever complained about performance.  Generally, people
+ are surprised how fast it is given that there is no separate
+ indexing in the background.
+ - A: I personally do not have a large database so I don't know
+ for sure. But it is basically as efficient as Grep is, and I
+ have used Grep on multiple-gigabyte files without noticing it
+ being too slow. Modern computers are fast enough that indexing
+ isn't required for reasonable performance on smaller databases.
+- Q: The demo displayed how to search occurances of certain keywords
+ in a giant single-document text database. But what about other open
+ (or not open) Emacs buffers? Think of IRC chars, emails, etc.
+ - A: Set the hyrolo-file-list variaable to include any directory
+ of files you want to search.
+ - I mostly referred to non-file buffers.
+ - Searching through (for example) an IRC buffer is a
+ different command than searching through a directory of
+ files, and this makes sense for the "Rolodex" use
+ case, since typically your database will be a file, and
+ not an in-memory buffer. But you can create a hyperlink
+ button that triggers an ordinary "isearch"-like
+ command the same way you would execute other Emacs
+ commands.
+- Q: if I may ask, why Hyperbole/HyRolo over Org-Roam? (I don't use either, just curious)
+ - rswgnu: HyRolo and Hyperbole require no other software beyond code builtin to Emacs. For example, when I first built Org-Roam, it did not work properly for me and I had to modify the build process to get it set up. With Hyperbole, you install one package and you can start working.
+ - A: @lounge-060 I found Hyperbole to be a more light-weight option over Org-Roam.
+- Q: did i misunderstand, that each time he's hitting a button he's going to a temporary buffer which is a search result?
+ - A: yes, the button executes a search, so the cursor jumps to the search result buffer, but you can jump to other links within the same search result buffer.
+ - interesting, but i asked if a link can go directly to the source file, not a search buffer. i'm thinking like org's follow link, which isn't always accurate as i'd like.
+ - A: yes, you could do that. the Hyperbole link syntax does not have to execute a search, you can link directly to a file.
+- Q: can the hyperlink goto the ORG file buffer at a specific location?
+- Q: Thanks for the links. Can you recommend resources for incremental peg too?
+- Q: wonder how that compares to plain org-mode, with links and in particular "elisp" links to built-in org-agenda functions, or org-ql (any of alphapapa's packages really)?
+ - One relevant distinction is that Hyperbole provides "alternative" action for a link. You may not just follow it, but do other things. Org mode does not have that
+ - custom link types are quite extensible though, and with the "elisp" type it's possible to call into many things without such customization. I'll have to try Hyperbole though.
+ - hyperbole looks like it can use code, has some assumption of data types, etc
+ - A: Yeah, hyperbole is a very general solution for establishing connections between various pieces of information. Hyperbole is a global minor mode so it works everywhere.
+- Q: Why do you have only one file?
+ - A: it is just easier for me to keep all the realted information in a single file. I could split it into several files in a directory, but I don't see any benefit to doing that. You can point the search function to the directory, and it will search all of the files there.
+ - i honestly find the idea of tons of little files to be a problem. why not have many headings in a file by primary category
+ - HyRolo does use single files for its databases. Ramin is just migrating from keeping a separate Org file per note.
+- Q: One thing that stopped me from using Hyperbole is that is does not load for me :( Reporting bug is still in my todo list
+ - A: curious. If you load, can you run M-x action-key and get it to work? If so, it probably works but is blocked by your key bindings.
+- another obvious issue I faced is M-RET is already used by Org extensively
+ - I had to compromise on marks by setting leader keybinding C-SPC C-SPC to hyperbole action instead
+ - Q: rswgnu perhaps already asked before, but M-RET (default hyperbole action key) conflicts with org-mode use. For now I've resorted to using C-SPC C-SPC (with leader package) but is there another better alternative generally preferred? Perhaps one that does not conflict with a major feature like marks?
+- Q: what would you recommend with emphasis on "beginner level" when starting with org-mode and planning to create the "2nd brain" approach: org-roam or hyberbole?
+- Q: if you have a blog somewhere, I'll be very interested to read more. Your style of explaining and demo-ing things is quite nice
+ - A: My blog is https://tilde.town/~ramin_hal9001
+- Q: what advantage do you see in using hyperbole?
+ - A: The big advantage for me is the "explicit links" feature, it lets me create a database of links that work universally. For example, you can change the link in the flat file database, and it updates in all of your files. If you and I shared a Hyperbole link file, I could write a link `<(like this)>` right here in the chat buffer and you could use it from within the Emacs chat client ERC.
+
+## Other discussions from IRC
+
+- Feedback
+ - I like this method of the talk slides being kinda transparent so you can see the speaker behind them.
+ - This looks very interesting tbf
+ - Its cool to see how many different note taking packages there are in Emacs
+ - Very nice talk-- and very understandable for me as a beginner who had never heard of hyperbole and did not understand the use-case. I also have not heard or read of a Zettelkasten, so this was even more useful.
+ - This talk has already given enough ideas on making some stuff dynamic
+ - There is a very good chance I'll keep coming back to this talk and its transcript over the next year, just to see how I can improve my presonal workflow more by integrating Hyperbole. Right now, I just use hyperbole to more conveniently (and more importantly, with same keybinding everywhere) open links across Emacs.
+ - Great talk Rami
+n, thank you!
+- Hyperbole
+ - Nice-- I needed this talk yesterday having not been familiar with hyperbole and use cases.
+ - i've been waiting to see a hyperbole use case, so i'm watching =]
+ - (Hopefully I can finally grok what this Hyperbole thing is about and how it contrasts with Org/Org-mode and such)
+ - sounds very vanilla...which I like
+ - Hyperbole sounds like something I definitely should get into, but I havent looked into it
+ - finally something that helped me grok hyperbole ;]
+ - Seeing an application thereof, as opposed to an exposition of its capabilities in the abstract (though quite interesting too, thanks rswgnu!), has given me a slightly better understanding, thanks!
+ - hyperbole has been something i've struggled to understand from the docs and examples. i think i've finally started to get that it's a text hyperlink with potential code embedded.
+ - ty for the explaination, like i said, this has helped me refine my impression of hyperbole further.
+ - I'm quite looking forward to more integration between org and hyperbole
+ - Thanks ramin_hal9001, I'm further on my way to enlightenment about Hyperbole that I was that's for sure!
+ - Watching Hyperbole videos like this, not understanding it completely: to me, Hyperbole doesn't have much advantage if you're happy with (bi-directional) Org mode links (as demoed in 15min). However, I do think that Hyperbole does have many advantages when you're starting to embrace the idea of "dynamic links" of all sorts. So far, I did not get creative enough to start with Hyperbole for that
+ - rswgnu : If I may ask, I keep looking for either uses cases or capabilities that Hyperbole could bring to bear beyond what I'm doing with Org/Org-mode (taking in account that its has custom link types and elisp links and such), are there some that would come to mind? I've watched most videos and skimmed the documentation a few times, but I'm still not reaching the aha moment, yet, but I feel one use case could change that.
+ - It could be interesting to use Hyperbole to auto-detect various links in Emails by matching common text patterns
+
+[[!inline pages="internal(2022/info/rolodex-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/rolodex-nav)" raw="yes"]]
+
+[[!taglink CategoryHyperbole]] [[!taglink CategoryZettelkasten]]
diff --git a/2022/talks/sat-close.md b/2022/talks/sat-close.md
new file mode 100644
index 00000000..e1e097b9
--- /dev/null
+++ b/2022/talks/sat-close.md
@@ -0,0 +1,50 @@
+[[!sidebar content=""]]
+[[!meta title="Saturday closing remarks"]]
+[[!meta copyright="Copyright &copy; 2022 EmacsConf organizers"]]
+[[!inline pages="internal(2022/info/sat-close-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Saturday closing remarks
+
+
+[[!inline pages="internal(2022/info/sat-close-before)" raw="yes"]]
+
+
+- Wheeeee! We made it to the end of the first day! Thank you so much
+ for joining us for the first day of EmacsConf 2022.
+- Pre-recorded talks are up on the talk pages and at
+ <https://media.emacsconf.org/2022>
+- We'll work on extracting the Q&As from the recordings in the weeks
+ to come. If you'd like updates, please subscribe to the
+ emacsconf-discuss mailing list.
+- Thanks
+ - Thank you to all the speakers, volunteers, and participants.
+ - This year's conference hosts are zaeph and bandali and our
+ streamer sachac
+ - Thanks to our captioning volunteers: sachac, bhavin192, Tom
+ Purl, Hannah Miller, triko, and anush, and also to the speakers
+ who captioned their own talks. Thanks to quiliro for translating
+ the meetups talk into Spanish subtitles, which you can find on
+ the talk page. 
+ - Thanks to Akshay Gaikwad for design contributions.
+ - Thanks also to other volunteers: corwin, vetrivln, dto, jman,
+ FlowyCoder who worked on all the other things that are needed to
+ make this happen.
+ - shoshin whose music you will hear tomorrow
+
+# Discussion
+
+- Q: we will gush tomorrow ...  so many good talks today, and so well
+ organized!
+ - A: Yay all those wonderful speakers! And there'll be even more
+ tomorrow, so tune in!
+
+
+[[!inline pages="internal(2022/info/sat-close-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/sat-close-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/sat-open.md b/2022/talks/sat-open.md
new file mode 100644
index 00000000..11cb6e54
--- /dev/null
+++ b/2022/talks/sat-open.md
@@ -0,0 +1,22 @@
+[[!sidebar content=""]]
+[[!meta title="Saturday opening remarks"]]
+[[!meta copyright="Copyright &copy; 2022 ${speakers}"]]
+[[!inline pages="internal(2022/info/sat-open-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Saturday opening remarks
+
+
+[[!inline pages="internal(2022/info/sat-open-before)" raw="yes"]]
+
+
+
+
+[[!inline pages="internal(2022/info/sat-open-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/sat-open-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/schedule-2022-12-03.svg b/2022/talks/schedule-2022-12-03.svg
new file mode 100644
index 00000000..c3a9d317
--- /dev/null
+++ b/2022/talks/schedule-2022-12-03.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="800" height="200" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sat</text> <a href="2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <rect x="8" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(39,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="2022/talks/school" title="Back to school with Emacs"> <rect x="75" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(106,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <rect x="125" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(139,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <rect x="191" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(222,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="2022/talks/meetups" title="Attending and organizing Emacs meetups"> <rect x="400" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(414,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="2022/talks/buddy" title="The Emacs Buddy initiative"> <rect x="450" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(464,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <rect x="483" y="15" opacity="0.8" width="50" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(531,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="2022/talks/realestate" title="Real estate and Org table formulas"> <rect x="583" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(614,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <rect x="633" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(664,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <rect x="700" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(714,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <rect x="750" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(764,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="2022/talks/localizing" title="Pre-localizing Emacs"> <rect x="100" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(131,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <rect x="175" y="100" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(189,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <rect x="208" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(239,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <rect x="400" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(431,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <rect x="475" y="100" opacity="0.8" width="50" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(523,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <rect x="583" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(614,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="2022/talks/eev" title="Bidirectional links with eev"> <rect x="658" y="100" opacity="0.8" width="8" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(664,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="2022/talks/python" title="Short hyperlinks to Python docs"> <rect x="683" y="100" opacity="0.8" width="8" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgreen"></rect> <g transform="translate(689,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="2022/talks/haskell" title="Haskell code exploration with Emacs"> <rect x="708" y="100" opacity="0.8" width="50" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(756,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 4</text></g></svg> \ No newline at end of file
diff --git a/2022/talks/schedule-2022-12-04.svg b/2022/talks/schedule-2022-12-04.svg
new file mode 100644
index 00000000..c0e8b517
--- /dev/null
+++ b/2022/talks/schedule-2022-12-04.svg
@@ -0,0 +1 @@
+<svg width="800" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="800" height="200" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sun</text> <a href="2022/talks/survey" title="Results of the 2022 Emacs Survey"> <rect x="8" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(39,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="2022/talks/orgyear" title="This Year in Org"> <rect x="58" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(72,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <rect x="100" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(131,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="2022/talks/links" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <rect x="166" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(180,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <rect x="216" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(230,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <rect x="400" y="15" opacity="0.8" width="50" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(448,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="2022/talks/workflows" title="Org workflows for developers"> <rect x="483" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(514,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers"> <rect x="550" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(581,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <rect x="633" y="15" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(664,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <rect x="700" y="15" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(714,98)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="2022/talks/rde" title="rde Emacs introduction"> <rect x="100" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(131,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="2022/talks/justl" title="justl: Driving recipes within Emacs"> <rect x="175" y="100" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="5,5,5" fill="lightgray"></rect> <g transform="translate(189,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <rect x="208" y="100" opacity="0.8" width="50" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(256,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="2022/talks/detached" title="Getting detached from Emacs"> <rect x="400" y="100" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(414,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <rect x="458" y="100" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(472,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="2022/talks/async" title="Emacs was async before async was cool"> <rect x="516" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(547,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="2022/talks/wayland" title="Emacs should become a Wayland compositor"> <rect x="608" y="100" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(622,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <rect x="666" y="100" opacity="0.8" width="16" height="84" stroke="black" stroke-dasharray="" fill="lightgreen"></rect> <g transform="translate(680,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="2022/talks/dbus" title="The Wheels on D-Bus"> <rect x="725" y="100" opacity="0.8" width="33" height="84" stroke="black" stroke-dasharray="" fill="lightgray"></rect> <g transform="translate(756,183)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="170"></line> <text fill="darkgray" x="0" y="183" font-size="10" text-anchor="middle"> 4</text></g></svg> \ No newline at end of file
diff --git a/2022/talks/school.md b/2022/talks/school.md
new file mode 100644
index 00000000..eaf34d95
--- /dev/null
+++ b/2022/talks/school.md
@@ -0,0 +1,102 @@
+[[!sidebar content=""]]
+[[!meta title="Back to school with Emacs"]]
+[[!meta copyright="Copyright &copy; 2022 Daniel Rösel"]]
+[[!inline pages="internal(2022/info/school-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+# Back to school with Emacs
+Daniel Rösel (ˈrøːzl̩, IRC: velocitatem, <mailto:daniel@alves.world>, <https://daniel.alves.world>)
+
+[[!inline pages="internal(2022/info/school-before)" raw="yes"]]
+
+This talk is aimed at those who would be interested in using Emacs for
+school purposes. What it will present the listeners with is a
+collection of tips and trick on how to be more efficient when taking
+notes and organizing student life. Methods should apply to a target
+audience studying at a university or high school.
+
+Outline:
+
+- **Part 1:** 5 - 10 min
+ - Present benefits of using Emacs over other software/hand-writing
+ - Present packages which support the mentioned benefits
+ - Packages used
+ - Usage and application of each package
+ - The ecosystem as a whole
+- **Part 2:** ~5 min
+ - Demonstrate the work-flow
+ - Show applications in various regions of academics
+ - External input from other users
+
+# Resources
+
+<https://gitlab.com/velocitatem/lectorg>
+# Discussion
+
+## Notes
+
+- ReOrg <https://github.com/velocitatem/reorg>
+- LectOrg <https://gitlab.com/velocitatem/lectorg>
+
+## Questions and answers
+
+- Q:regarding exporting notes from remarkable does this system works
+ with any tablet? Would love to use it with a boox max etc.
+ - A: Unfortunately, it does not (directly). The current software I
+ use makes use of OneDrive so in theory it could be integrated
+ with others.
+- Q: quiliro: is there a demo for lector?
+ - A: quiliro See <https://gitlab.com/velocitatem/lectorg>
+- Q: <quiliro> velocitatem: are you opening the pdf inside emacs?
+ - A: The PDF was being open in firefox.
+- Q:Have you tried org-noter for taking notes on pdfs?
+ - A:I have not, will make sure to check it out tho!
+- Q: How does lectorg diverge from using something like YASnippets for
+ the math insertations, etc. 
+ - A: It uses YASnippets to inser the math functions, the main idea
+ is to provide those snippets and to use them with lectorg's
+ functions to plot graphs.
+- Q: Can your notes interact with the vidoes at all? ex timestamps or
+ inserted subs, external player "mpv"
+ - A: As of now, they cannot, but that is a wonderful idea!
+- Q:  do you find that you can type fast enough / keep up with live
+ lectures using Lectorg?
+ - A: Not 100% but the package makes it easier for me to deal with
+ other things while taking notes
+-  <korkeala> velocitatem : thanks for the talk! you mentioned
+ integration with remarkable notes, could that be with other hand
+ writing software, like xjournalpp?
+ - A: I am really not certain, but im sure it could be. Since
+ reMarkable has a very proprietary cloud, the integration is a
+ bit of a hack.
+- Q: Is there a way of making latex rendering go in the background?
+ Also to lower its 
+ - A: 
+- Q: did you open that firefox from inside EXWM or is it a separate frame?
+ - Its bspwm
+- Q: "With lectorg you can easily capture the every detail without your attention wavering a single bit." What makes Lecter not waver your attention?
+ - Not 100% but the package makes it easier for me to deal with other things while taking notes
+ - It makes some actions more automated and quicker
+ - You can see some of the functions and snippets improving my speed when opening certain files or creating markup for my notes
+- how does the remarkable import works? can it be used with other tablets?
+ - Speaker: I am really not sure, but im sure it could be. Since reMarkable has a very proprietary cloud, the integration is a bit of a hack
+- how does the function graphing work?
+ - Insert new latex function with graph using `lectorg/insert-new-function`
+ - Generate graph for existing latex function with `lectorg/generate-graph-for-function`
+- I do read using nov.el and I use bookmarks. Is there a way to link the ePUB to your org documents?
+- how long have you been using Emacs? Did you find that you could take notes productively right away or did it take you a while before you reached the point where you could follow e.g. a lecture sufficiently quickly?
+ - Iv been using Emacs for about a year now. It definitely took me a while to become more productive
+- nov.el adds nov: link type
+- How you considered using something like https://mathpix.com/blog/image-to-latex-converter to speed up your workflow entering Maths equations, I wonder if an streamlined integration exists for that in Emacs already 🤔
+- I also have a remarkable, and would love to learn more about how other people integrate their hand-drawn notes into their org-mode notes :)
+- thanks velocitatem! I am considering whether to recommend it to my students; I have been using Emacs a long time and it is easy to forget how long it took to get into it ;)
+- yeah, same. Both handwritten notes and Treesitter are super interesting to me :)
+
+
+[[!inline pages="internal(2022/info/school-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/school-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/science.md b/2022/talks/science.md
new file mode 100644
index 00000000..b3fc4be9
--- /dev/null
+++ b/2022/talks/science.md
@@ -0,0 +1,167 @@
+[[!sidebar content=""]]
+[[!meta title="Writing and organizing literature notes for scientific writing"]]
+[[!meta copyright="Copyright &copy; 2022 Vidianos"]]
+[[!inline pages="internal(2022/info/science-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Writing and organizing literature notes for scientific writing
+Vidianos Giannitsis (<mailto:vidianosgiannitsis@gmail.com>)
+
+[[!inline pages="internal(2022/info/science-before)" raw="yes"]]
+
+Literature notes are a cornerstone of one's zettelkasten. Especially for scientific writing which needs to be based on bibliography, having notes on the literature you read is essential. Inspired by a chapter of "How to Take Smart Notes" by Sonke Ahrens - one of the best Zettelkasten books out there - which talks about the process of writing a scientific article, I crafted a heavily personalized workflow for writing and organizing my literature notes, which I wanted to present to you. Due to university, I have worked on assignments meant to simulate scientific articles and through them I refined this workflow to what it is today, which I am very happy with. I even wrote my own package for addressing part of this workflow, which will be a pivotal part of the talk. I have tried to not overcomplicate the talk, but a familiarity to zettelkasten and scientific writing is expected to get the most out of the talk.
+
+This talk will focus on how Emacs has aided me in scientific writing and will cover how I use various packages for this. Featured will be: Org-noter, one of my favourite emacs packages which I use to annotate articles using org-mode while reading them. I will focus primarily on its integration with my org-roam-capture-templates and how it, org-roam-bibtex and ivy-bibtex work together to very easily create and flesh out literature notes for the articles I find, but I will also briefly mention how I annotate articles. Then, how I use org-roam to then take what I learned from this literature and create permanent notes on it which I can then add easily to my Zettelkasten. And finally, how I organize both literature and permanent notes on a subject using my own project, the zetteldesk package, and how I can very easily create a first draft of my work using this. With the draft created organically through my notes, it is then almost effortless to write the final work, as it consists simply of reading the draft, making small changes and fixes and perfecting it so it is a ready product.
+
+## Links
+
+- [Zotero](https://www.zotero.org/), the app I use for capturing
+ literature I find, which is unfortunately not in Emacs as I haven't
+ figured out a good way to do this from Emacs. (P.S. if you have a
+ good workflow for doing this from inside Emacs, I would love to have
+ a discussion with you because leaving Emacs annoys me).
+
+- [Org-Roam](https://www.orgroam.com/), the bread and butter of almost
+ everything in my workflow. Org-roam creates my zettelkasten and is
+ the basis of the other packages here.
+
+- [Ivy-bibtex](https://github.com/tmalsburg/helm-bibtex), the package
+ that allows Emacs to read .bib files and do things with them,
+ allowing for bibliography management in Emacs.
+
+- [Org-roam-bibtex](https://github.com/org-roam/org-roam-bibtex).
+ Integration between the 2 packages listed above so I can easily add
+ literature notes to my Zettelkasten.
+
+- [Org-noter](https://github.com/weirdNox/org-noter), the package that
+ does all the annotating. I can't take notes on an article without
+ org-noter, its just the best way to do it.
+
+- [Zetteldesk](https://github.com/Vidianos-Giannitsis/zetteldesk.el)
+ my personal project which was inspired by making this workflow work
+ in Emacs. This package facilitates everything discussed in the last
+ part of the talk about organizing your literature.
+
+## Bio
+
+I am Vidianos Giannitsis, a 4th year chemical engineering student who loves to use Emacs. I have been using Emacs for about 2 and a half years and at this point it has become the most important part of my workflow. After seeing how awesome Emacs is, I was very inclined to learn elisp to truly customize Emacs to its limits. So I did, and at the start of 2022 I started working on a package of mine "zetteldesk.el". This package was inspired from "How to take smart notes" the well known zettelkasten book. I read something there and I was like, surely I can implement this in Emacs, can't I. And so I did.
+
+I have watched EmacsConf for the last two years and I was interested in participating in it myself. Since I recently wrote a package of mine, I thought it was a good opportunity to make a talk of my own. So I made this talk about managing literature as it is something I believe I can deliver unique information and something I have worked on a lot recently.
+# Discussion
+
+## Notes
+
+- Zettelkasten and zetteldesk
+ - <https://github.com/Vidianos-Giannitsis/zetteldesk.el>
+ - <https://github.com/Vidianos-Giannitsis/zetteldesk.el/wiki>
+ - Available on MELPA as well.
+- Org-capture--pandocs into a note-taking format
+- Karl Voit: Capturing HTML content from my Firefox is easy with
+ <https://github.com/kuanyui/copy-as-org-mode>
+- Leo Vivier's personal email address is dude@suits-do-suit-me.fr
+ ;-) Spam me!
+- link to Leo's talk from last year:
+ <https://emacsconf.org/2021/talks/erg>
+- Great talk, but I wish images in org mode would scroll smoother. It's a deal breaker for me. Does anybody know of a package that allows that?
+ - not sure but iirc emacs 29 has pixel-perfect mouse wheel scrolling instead for line-wise scrolling -- maybe that solves that?
+ - try M-x pixel-scroll-mode
+- have you looked into org-ref and specifically doi-utils? It adds a command that will download a bibtex entry for a given DOI. It even downloads the article (if possible) or to attach at pdf to it.
+- oh cool. what is the name of this package that scrolls an article? "org noter" "noder"?
+ - org-noter
+ - doctorhoo: I am using it quite intensively. The download does not work so often thanks to the journals making it difficult (I guess), but it is easy enough to add a manully downloaded one. The download of the bibtex (and assignment of a sensible key) on the other hand works very reliably.
+- This is a great demo. Thank you!
+- What is doing the org-mode presentation?
+ - its org-tree-slide-mode
+- That was excellent. Thanks very much!
+- wow that was really nice. thank you
+- thanks vidianos
+- oooh, dired icons
+- Great presentation and a nice Q&A session
+- For my part, I like seeing talks on zettelkasten !
+- zettelkasten is exciting but I ended up doing something much simpler
+- thank you again for a great presentation. very inspiring.
+
+- From the speaker: I saw a lot of kind words while scrolling here to see if there are any questions. Thanks a lot everyone! Happy to be part of this conference
+
+## Questions and answers
+
+- Q:Do you use fleeting notes as well? Do you keep them in org-roam?
+ - A:<https://github.com/Vidianos-Giannitsis/Dotfiles/blob/master/emacs/.emacs.d/libs/zettelkasten.org#fleeting-notes>
+ - To document the answer I gave live I am adding a small
+ description of it here. I do use fleeting-notes which I manage
+ with org-journal. I have a custom function
+ (org-roam-init-fleeting-note) in the link above which gives the
+ note an id (makes it an org-roam note), gives it a todo value
+ and links it to my Current Projects node. This way, the note is
+ inserted to my zettelkasten. But, when the TODO value becomes
+ DONE I have a hook that removes the ID. This is the method I use
+ for archiving fleeting notes when they are no longer needed. I
+ don't use org-roam-dailies as I am not aware of a way to
+ archive them that is this seamless.
+- Q:Does it work for PDFs only or can we use it for Word and Excel
+ files too? or epub, websites "eww" or videos like youtube?
+ - A:Leo says Org-noter does allow epub notes through an
+ extensions, and works with DocView for Office docs. Can also use
+ Pandoc
+- Q: I used to take notes on PDFs similarly in org-noter, but the
+ recent Zotero PDF reader is also very nice. Have you looked into
+ integrating the Zotero PDF reader with org-noter?
+ - A: While the program is nice the author dosn't use it becouse
+ it is not emacs nor have emacs bindings
+- Q:Great presentantion Vaidanos. Can you let us know your thoughts on
+ Zettlekasten's future?
+ - A: Zettelkasten has a great future because plaintext will never
+ go away
+ -        and orgmode is open source with a vibrant community.  Leo
+ adds: Zettelkasten popularity shot up big in 2020.
+- Q: Have you found a way to get a nice "overview of multiple notes"
+ to re-arrange them? Like physically putting many small notes on a
+ table and re-arranging them?
+ - A: Original goal of speaker's new package Zetteldesk.el is to
+ get notes
+ -        in a table and organize them. The idea is to use the
+ Zetteldesk as a scratch buffer. But making it graphical would be
+ hard.  (do check the 3rd demo of the talk if you haven't
+ already at 11:10 mins)
+ - A: The Koutliner in the GNU Hyperbole package can be used for
+ this where all notes would be organized, autonumbered and
+ automatically have a per-file unique hyperanchor ID.  You can
+ move notes/ideas around the same way you do in Org outlines. 
+ Besides collapsing and expanding trees of notes, you can also
+ clip the view to a particular number of lines per note for
+ overviews.  It supports Org tables too.
+- Q: Following up on the previous question, it seems difficult or
+ impossible to do with emacs rendering, but perhaps with similar
+ strategies as org-roam-ui one could get a Zooming User Interface for
+ manipulating the notes on a big canvas. This is a FOSS prototype:
+ <https://jermolene.com/cecily/> and this is a SaaS (proprietary)
+ one: <https://www.napkin.one/>. What are your thoughts on this? Do
+ you think it makes sense with your workflow?
+- Q: Can we use Zettlekasten for coding too? Especially when using
+ IDEs like Visual Studio and Excel?
+ - A: Not sure, speaker is not in coding beyond Emacs Lisp and
+ MATLAB. But he thinks it should be possible. Don't think it
+ breaks the principles of Zettelkasten, can make notes for
+ concepts. Leo confirms that note taking can be useful for
+ programming and problem solving. Leo says code could be good for
+ Zettelkasten "atomizing".
+ - Comment from Karl Voit: I'm not using Zettelkasten myself but
+ when I code, I'm heavily relying on my personal knowledge base
+ which also includes Python snippets and sources (in my case) as
+ I'm not a frequent programmer. So I forget the most basic stuff
+ from one session to the next when there are weeks/months
+ in-between. In the same fashion, a knowledge-base realized with
+ a Zettelkasten is something that helps you here, producing
+ better code and remembering previous
+ patterns/tricks/sources/...
+- Q: will your zetteldesktop.el be available in elpa?
+
+
+[[!inline pages="internal(2022/info/science-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/science-nav)" raw="yes"]]
+
+[[!taglink CategoryZettelkasten]] [[!taglink CategoryOrgMode]] [[!taglink CategoryOrgRoam]]
diff --git a/2022/talks/sqlite.md b/2022/talks/sqlite.md
new file mode 100644
index 00000000..89146b51
--- /dev/null
+++ b/2022/talks/sqlite.md
@@ -0,0 +1,175 @@
+[[!sidebar content=""]]
+[[!meta title="Using SQLite as a data source: a framework and an example"]]
+[[!meta copyright="Copyright &copy; 2022 Andrew Hyatt"]]
+[[!inline pages="internal(2022/info/sqlite-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Using SQLite as a data source: a framework and an example
+Andrew Hyatt (he/him)
+
+[[!inline pages="internal(2022/info/sqlite-before)" raw="yes"]]
+
+Emacs can now be built with SQLite, giving native support for reading
+and writing to a database. With this, we can start seriously
+considering a SQLite-first approach: instead of storing data on the
+filesystem, and using various ad-hoc solutions for metadata, we can
+use SQLite to store and search our data. This is essentially a
+tradeoff between the power and speed of SQLite and the universality of
+the filesystem. If we accept that this approach is useful, then a
+standard way to store information in database, may be useful and
+promote package interoperability, just as our single filesystem does.
+The triples packages is a RDF-like database for supplying such a
+flexible system for storing and retrieving data from SQLite. A sample
+application, ekg, a replacement for org-roam, is shown using this, and
+the advantages of the triple design are explained.
+
+For more information and the packages discussed here, see the
+[triples](https://github.com/ahyatt/triples) and
+[ekg](https://github.com/ahyatt/ekg) pages.
+
+# Discussion
+
+- <https://www.reddit.com/r/emacs/comments/zexv6b/using_sqlite_as_a_data_source_a_framework_and_an/>
+- <https://news.ycombinator.com/item?id=33853509>
+
+## Notes
+
+- <https://github.com/ahyatt/triples>
+- <https://github.com/ahyatt/ekg>
+- <https://www.gnu.org/software/hyperbole/man/hyperbole.html#Implicit-Buttons> -
+ discussed in the next talk could really help simplify access to your
+ triples and ekg primitives; have a look when you have time.
+- You had some delicious recipes in there. Made ME hungry!
+- Thanks, that's insightful
+
+## Questions and answers
+
+- Q:  To what extent did Datomic influence the design of triples? 
+ <https://www.datomic.com/>
+ - A: I wasn't aware of Datomics, but I think both triples and
+ Datomics are influenced by RDF & trends in Knowledge Graph
+ construction in the industry.  I took a look at that page, and
+ one interesting thing they do is (AFAICT) store edits to the
+ database instead of actual values, allowing you to reconstruct
+ the database or go forward or backward in time.  This is very
+ interesting, and I'm thinking of ways to make the database
+ safer, but not sure if I can get to such sophisticated
+ properties in this implementation. 
+- Q:built into Emacs? nice. multiple schemas (so to say
+ differentiation of "databases" (if you will so) are possible with
+ that built-in instance?
+ - A: Yes, with emacs 29. Full-featured with multiple databases,
+ transactions, etc.
+- Q:What about collaborative editing whith this? Multiple computers
+ with multiple emacs like crdt.el with org mode?
+ - A: Database are great for more async collaboration, multiple
+ people / processes can add to the repository at the same time. 
+ But I think it's not going to be a great solution for multiple
+ users modifying  the same buffer.
+- Q:What about using this on multiple computers? How would you
+ syncronize the data?  (This is a minor problem in org-roam where if
+ you share files between multiple computers, their SQLite databases
+ get out of sync and require M-x org-roam-db-sync to rebuild the
+ SQLite database.)
+ - A: This is an unsolved problem, one that I'm interested in
+ looking into.  There possibly are standardized db solutions to
+ this, but I don't yet know what they are.
+- Q: With EKG what about views like org roam node mind map view? Or
+ org mode virtual view for integration with other org packages?
+ - A: This is possible, it just needs to interface with the
+ database in a different way.  It's all graphs, so really any
+ triple library might be a good fit for this.
+- Q:  Are you planning to further develop EKG? It is highly
+ interesting to me, I do prefer SQLite over text.
+ - A: Andrew is using it; not ready for general use but quite soon
+ -- towards the end of  the month! Still in exploratory mode
+ though. Still thinking about (some of) the fundamental
+ concepts. 
+- Q: Is it then possible to combine the triples DB with some custom
+ tables in the same SQLite file? (e.g. to build a log table next to
+ the triples tables for quick query of event data)
+ - A: You could do that. AT the moment it's just one table
+ (triples). It's designed to be one table in one DB -- beware
+ of consistency issues if you add further tables, which you can
+ definitely do.
+- Q: What are your thoughts on adding a timestamp attribute to triples
+ so that the DB becomes append-only and by default you return the
+ latest fact for a subject/object pair?
+ - Q+ -> Use is to keep a record - you don´t delete? e.g. you get
+ all past addresses of a person or all past versions of a given
+ fact. Even version control for notes.
+ - A: I haven't thought of that / not seen in other triple stores
+ - A: Be ware that these DBs already take quite a bit of space
+ - A: may make synchronization easier
+- Q: can ordinary lisp data types (lists, symbols, etc) be stored in
+ the data base
+ - A: Yes, if you don't specify, it defaults to a list. Not sure
+ that was the right design choice; lists map to rows with a
+ hidden index column. emacs-sql and this also represent most
+ things as strings. 
+- Q: beyond note taking what kind of packages do you think would
+ benefit from triples library?
+ - A: Anything where you have lisp forms stored in a file would
+ probably be better implemented via a database.  And the triples
+ library makes this easy and standardized.  So, for example BBDB,
+ which is a "database" should actually be in a database.  And
+ then you might want to annotate, tag, etc, so having be in one
+ big database makes a lot of sense to me, because I think all
+ this kind of info wants to live together. 
+- Q: Are you trying to create a PIM with EKG?  What information do you
+ primarily want to manage?
+ - A: Yes, I think many uses of emacs is in line with PIM, and
+ those use-cases are a good fit for triples / ekg.  Notes,
+ people, projects, maybe even being able to integrate with org
+ and manage TODOs there as well.
+- Q: What about using other databases programs Postgres mongoDB etc..
+ [see last q too, but I guess you refer to other relational, e.g.
+ Postgresql]
+ - A: Those could work, maybe the triples library would work via
+ emacsql with those, but I haven't tested it.  I'm not sure
+ what the benefit would be, typically these database tend to be
+ simple and small, so a more full-featured DB is probably
+ overkill.  MongoDB and those kinds of row-oriented databases
+ probably wouldn't be a good fit, but I haven't tried it.
+- Q: What is your preferred reference to understand triples/graph dbs?
+ (e.g. think better about schema design)
+ - A: I know from using them / talking about them. I will come back
+ with some references!
+- Q: Will it slow down with a growth of database?
+ - A: there is a tradeoff -- triples gives you a standard schema,
+ but you lose the power of getting things in one SQL expression -
+ which makes it slow. But I have a bunch of data (2yrs of
+ org-roam usage) and it is still very fast. These limits exist,
+ but the usual rate of content creation is not large enough to
+ hit the limits.
+- Q: What are your thoughts on allowing for a "true" graph-db
+ backend? (whatever the current best free software alternative to
+ neo4j is, I guess). 
+ - A:  In my usage, the graph DBs tended to be slow and somewhat
+ clumsy in usage, we returned every time to SQL [please reword
+ if appropriate]. At the moment not a glaring need (for the
+ quantities of data people manage in Emacs).
+- Q: How hungry did you get while writing and recording this?
+ - A: I forgot that I used recipes as an example in my demo! 
+ org-roam / ekg and other things are a great way to cook better,
+ BTW.  When you make a recipe, write a org-roam daily (or in ekg,
+ an entry tagged with the date and the recipe) with notes about
+ how it went, what could be better, etc.  Then you can later see
+ the recipe and notes on it at once, which helps you further
+ refine the recipe.
+- Q: beyond note taking what kind of packages do you think would benefit from triples library
+
+Other discussions from IRC:
+
+- I like the font he's using in his org doc.
+- In some way, triples (turtle, RDF and similar things) describe a directed graph, where echa edge is like: Subject--Predicate-->Object. A datalog can describe this too (for example: with predicates like triple(S,P,O)).
+
+
+[[!inline pages="internal(2022/info/sqlite-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/sqlite-nav)" raw="yes"]]
+
+[[!taglink CategoryEmacsLisp]]
diff --git a/2022/talks/sun-close.md b/2022/talks/sun-close.md
new file mode 100644
index 00000000..8dc73050
--- /dev/null
+++ b/2022/talks/sun-close.md
@@ -0,0 +1,253 @@
+[[!sidebar content=""]]
+[[!meta title="Sunday closing remarks"]]
+[[!meta copyright="Copyright &copy; 2022 ${speakers}"]]
+[[!inline pages="internal(2022/info/sun-close-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Sunday closing remarks
+
+
+[[!inline pages="internal(2022/info/sun-close-before)" raw="yes"]]
+
+- Questions/comments related to EmacsConf 2022 as a whole?
+ <https://pad.emacsconf.org/2022>
+- Pre-recorded talks should already be up on the talk pages and at
+ <https://media.emacsconf.org> . We'll upload them to Toobnix and
+ YouTube as well in the coming weeks. (Some are already available.)
+ We'll also collect the recordings from the Q&A sessions and post
+ them. You can subscribe to the emacsconf-discuss mailing list
+ (<https://lists.gnu.org/mailman/listinfo/emacsconf-discuss>) for
+ updates.
+ - corwin - I'll jump in at this point
+- Love the conversations and the community? Here's how to keep going:
+ - Lots of meetups both online and in person:
+ <https://www.emacswiki.org/emacs/Usergroups>
+ - Like the IRC conversations? There's an #emacs channel,
+ #org-mode, #emacs-beginners on irc.libera.chat (put #emacs in
+ the channel field on chat.emacsconf.org, or use an IRC client
+ (bandali maintains ERC =) ) )
+ - If you blog about EmacsConf or Emacs, please let me know at
+ sacha@sachachua.com so I can include it in Emacs News
+ (<https://sachachua.com/emacs-news/>) . 
+ - <https://lobste.rs/t/emacs> , <https://reddit.com/r/emacs/> ,
+ <https://reddit.com/r/orgmode/> 
+ - Mastodon: there's a lively community at <https://emacs.ch>
+- Corwin - stop here
+- Flowy - starts here
+- Want to help out with EmacsConf? Please e-mail
+ emacsconf-org@gnu.org or emacsconf-org-private@gnu.org and we will
+ assimilate you. =) Volunteers get early access to the talks and end
+ up learning a lot about Emacs along the way. You don't need to be
+ very technical; all levels of experience, interest, and availability
+ welcome.
+ - Next up: copying the pads and extracting notes from IRC so that
+ they can be added to the wiki; adding chapter markers and
+ captions for Q&A; ...
+- Would be great if the webpage timestamps could be localized to the
+ web browser's local time.
+- Thanks
+ - Thank you to all the speakers, volunteers, and participants, and
+ to all the people in our lives who make this possible.
+ - This year's conference hosts are zaeph and bandali and our
+ streamer sachac (who did not go crazy managing two streams at
+ the same time, yay Org Mode and OBS in the cloud!)
+ - Flowy - stopping here
+ - Who next? ʕ ·ᴥ·ʔ?
+ - Maybe sachac?  It's about the captioneers!
+ - Thanks to our captioning volunteers: sachac, bhavin192, Tom
+ Purl, Hannah Miller, triko, and anush, and also to the speakers
+ who captioned their own talks. Thanks to quiliro for translating
+ the meetups talk into Spanish subtitles, which you can find on
+ the talk page. 
+ - Thanks to dto for describing things in #emacsconf-accessible.
+ - Thanks to everyone who added notes and questions to the pad, and
+ especially to publicvoit and jrootabega.
+ - zaeph can take care of this from here
+ - Thanks to bhavin192 for last-minute reencoding and captioning,
+ and to his brother for lending us a beefy computer for
+ last-minute panicky reencodes.
+ - Thanks to Akshay Gaikwad for design contributions (notably the
+ next-talk slides)
+ - Thanks also to other volunteers: corwin, vetrivln, dto, jman,
+ FlowyCoder, and vetrivln who worked on all the other things that
+ are needed to make this happen.
+ - Thanks to Zen Monk Alain M. Lafon, Alex Mihov, Phil Hofmann, and
+ friends from 200ok.ch and Ardeo for organizing an in-person
+ EmacsConf satellite in Lucerne, Switzerland in their Coworking
+ Hub venue
+ - Thanks to shoshin whose music you heard today
+ - Thanks to the GNU Project and the Free Software Foundation for
+ Emacs and the mailing lists, and libera.chat for IRC community
+ support. 
+ - Thanks to Ry P for the server that we're using for OBS
+ streaming and for processing videos.
+ - Thanks so much to all the organizers and participants in
+ EmacsConf 2022! (All of you! =) You're all awesome.)
+- From chat:
+ -  <edgarvincent[m]> I'd be very happy to help.
+ -  All right! Looking forward to hearing from you - please
+ e-mail us at emacsconf-org@gnu.org
+ - <minad> Seriously, an emacsconf-mode would be great. I browsed
+ the website from eww, started vlc from eww, irced from Emacs.
+ The only thing missing was this etherpad.
+ - <edgarvincent[m]> Yes, it may sound a bit cheesy, but it is
+ nonetheless very  true: I think emacs conf does a great job of
+ bringing in very different people together and producing a great
+ feeling of togertherness.
+
+## Questions
+
+- Q: What did you use to make this? 
+ - All free/libre/open source tools:
+ - One private Org file with speaker/volunteer/talk info
+ - The talks were generally run using run-at-time,
+ org-after-todo-state-change-hook, and some TRAMP (by the
+ way, TRAMP does not like being run from timers at the
+ same time, so we shifted some talks =) )
+ - A public Org file for processes:
+ <https://emacsconf.org/2022/organizers-notebook>
+ - An ansible repo for configuration management:
+ <https://git.emacsconf.org/emacsconf-ansible/>
+ - Lots of Emacs Lisp:
+ <https://git.emacsconf.org/emacsconf-el/>
+ - TRAMP for writing files and running commands on remote
+ computers
+ - OBS for streaming, Icecast for sharing the stream with
+ viewers
+ - VNC for letting hosts and streamers connect to the same
+ display for OBS streaming
+ - screen for naming shell commands and making them easier to
+ resume and kill
+ - BigBlueButton for video Q&A
+ - Mumble for speaking on the stream as well as for backstage
+ communications
+ - ERC for Internet Relay Chat within Emacs, The Lounge for
+ web-based IRC
+ - Ikiwiki for the wiki (editing through git commits)
+ - Etherpad for collaborative note-taking
+ - ffmpeg for reencoding videos to free (patent-unencumbered)
+ formats and compressing them
+ - Captioning (<https://emacsconf.org/captioning>):
+ - OpenAI Whisper for computer-generated transcripts to be
+ reflowed and edited by captioning volunteers
+ - Some Emacs Lisp code to help with reflowing
+ (emacsconf-reflow, in
+ <https://git.emacsconf.org/emacsconf-el/>)
+ - Aeneas (<https://www.readbeyond.it/aeneas/>) for
+ synchronizing reflowed text with the audio files
+ - subed.el (<https://github.com/sachac/subed>) for editing
+ captions within Emacs (synchronizes with MPV)
+ - MPV for playing videos (config tips:
+ <https://emacsconf.org/mpv/>
+ <https://git.emacsconf.org/emacsconf-ansible/tree/roles/obs/templates/mpv.conf>)
+- Q: How do you have multiple font sizes, countdowns and clocks in
+ fundamental mode?
+ - A:
+ <https://git.emacsconf.org/emacsconf-el/tree/emacsconf-stream.el>
+ : see emacsconf-stream-display-clock-and-countdown. You can
+ propertize a string with face attributes and then insert it.
+- Q:  [what were the] participation rates (# of users) [this
+ year]?
+ - A:  High-water mark was around 350: 240 people on Gen and ~100
+ on Dev.  It's not clear how these metrics compare to prior
+ years because we ran two streams in parallel this year. (i.e. a
+ given person could be watching both streams at the same time.)
+- Q: 
+ - A:
+- Q: A great problem is having too many talks that we have split into
+ 2 tracks. What about having multiple conferences a year?
+ - A: Want to help organize another one? =)
+- Q: "emacsconf-org.el" to elpa/core? :)
+ - There's a repo, it's probably very idiosyncratic, happy to
+ chat with whoever's interested - sachac
+ - A:
+- Q: My streaming improved immensely once I implemented the mpv
+ solution. I could have benefited from a short "how to" beforehand
+ for the command line tool. 
+ - A: ooh, good point, we'll recommend that more next time
+- Q: Suggestion really-- a few setup videos that orient people to the
+ tools and conventions for participation. would be better. I think
+ y'all also need to load balance Leo-- turn him into an MC and
+ allow someone to field and queue up questions.  That way Leo would
+ not be in a hurry to get back to the next presentation. He could
+ hand off the mic to someone who could facilitate. 
+- The number of users in the chat seem to have been around the 150 count. Is this typical-- less than normal participation? Higher participation? It would be a good data point from the organizers to note.
+- are we going to get participation rates (# of users) in the closing remrks?
+- quiliro: Would it be useful for next year's EmacsConf if I volunteered to set up crdt for creating pads directly from Emacs?
+- Q: Is there an EmacsConf howto?
+ - Impressive event... I wish sachac or bandali would provide an EmacsConf howto!
+- does the Emacs survey have geographic demographics on users? might use that to inform EmacsConf schedule
+
+## Discussion
+
+- Keep up the great work for EmacsConf every year
+- what a great weekend. been using emacs for 30+ years and still learned a boatload.
+- it's so nice the community keeps things rolling forward. thanks y'all for the work of organizing all this!
+- Definitely so much new stuff
+- Got stuff to tinker with for a month or two
+- thanks to all organizers and presenters. everything so well done!
+- And besides the organizers, thanks to everyone who gave a talk this year!!
+- pretty nice talks and emacsconf in general! Thanks a lot
+- I think we can all say that we enjoyed a lot of the talks
+- this conf already goaded me into trying out 29 (building on a mac, so far. Linux boxen are next) to try the core tree sitter stuff. I need to go back and watch talks I miss and follow up on notes I already have. Love all this content!
+- thanks a lot organizers! emacs, emacs people, emacsconf - all are outstanding 8-)
+- Great emacsconf, as always! Thank you all that have been involved making it happen!
+- As a longtime Emacs user, it was great to stumble on this conference. Thanks
+- bandali sachac zaeph & team : What a treat this yearly EmacsConf, many thanks to you for your outstanding work... once again!
+- 07:25] <bandali> <3
+- some notes on how we did it in the pad
+- Meeting or rather seing yu all reinforces the belive in me that Emacs is the better computing thing. It can archive this! Thank you.
+- I had to make some decisions on which track to listen to, but that comes with the territory, I suppose. The two traks worked great.
+- Me too. It went very well!
+- emacsconf.org -- It's a domain name! It's an org-mode file! It's a domain name and an org-mode file!
+- Tracks
+ - Yeah, there were some points where I wanted to watch 2 talks at the same time as well
+ - But I really liked the 2 tracks
+ - But, I liked the fact that it gave more time for Q&As and we were more relaxed
+ - Last year was much more of a hurry
+ - This edition went extremely smoothly.
+ - I don't think that many people watched both talks at the same time.
+ - I'm not sure, I think people who watched dev would probably be interested in gen also.
+ - most people would find their preference and not jump-room
+- Stack:
+ - //git.emacsconf.org looks to be interesting!
+ - Yes! Our wiki is git based (which I think is really cool)
+- Timezones:
+ - I am in Europe and I personally like the time in which the talk is for me more than the American timezone
+ - I try to schedule all the talks based on speaker availability
+ - I wouldnt like waking up at 9 am in the weekend
+ - But I think its good both for Americans and Europeans
+ - for me it was great because I wake up 4 hours before start and go to sleep 1 hour after closing
+- I think that previewing the talks would be great to be able to make more or better questions
+ - volunteer again next year! =)
+ - sure, sachac .... it has been a great experience...even better than giving a talk! more relaxed at least
+- I loved sameer's talk even with the problems
+- I loved that 95% of the talkes had captions. that is why i could follow up with the Sameer talk
+- i was impressed about the feedback the organizers had before and during the event
+- this organization was impressive
+- thanks to you for being so active during the two days of conference!
+- even being active in chat helps make the conference feel more alive
+- wanting to experience more of the conference in Emacs
+ - I found it a bit hard to switch between Emacs, IRC, VLC and the Etherpad. Something like crdt.el would be great.
+ - Impressive techsetup and execution. Amazing that you did this with that much polish and utility. I think next thing would be an Emacs mode :P
+ - Seriously, an emacsconf-mode would be great. I browsed the website from eww, started vlc from eww, irced from Emacs. The only thing missing was this etherpad.
+ - and even my mpv was running inside Emacs....in EXWM
+ - I have top half taken by emacs split into a bunch of irc windows and the bottom split into two with etherpad on the left and the mpv on the right
+ - Yes Emacs collaboration is missing. But maybe next? I too had most in emacs. Beste.
+ - I absolutely agree. Actually, I was unconsciously expecting to access the conf from within Emacs, for some reason (well, to some extent, I did, by using empv for the videos and ement for the chat :)
+ - I had the schedule in Agenda. You could download a localized org schedule.
+ - Yes this could be more visible #feedback
+ - https://github.com/isamert/empv.el (a package which allows one to use mpv from within Emacs)
+ - Organizing and running, and attending, an online conference about Emacs, all in Emacs - take that VS Code
+- jman, FlowyCoder, bandali : I did not see you.... were you in the back end?
+ - quiliro, i was a bit more present this year actually, but mainly on the dev track rather than gen
+ - bandali was hosting the dev track so on screen here and there and various voice overs;jman and FlowyCoder were indeed running different backstage things
+
+[[!inline pages="internal(2022/info/sun-close-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/sun-close-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/sun-open.md b/2022/talks/sun-open.md
new file mode 100644
index 00000000..7c83247e
--- /dev/null
+++ b/2022/talks/sun-open.md
@@ -0,0 +1,23 @@
+[[!sidebar content=""]]
+[[!meta title="Sunday opening remarks"]]
+[[!meta copyright="Copyright &copy; 2022 ${speakers}"]]
+[[!inline pages="internal(2022/info/sun-open-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Sunday opening remarks
+
+
+[[!inline pages="internal(2022/info/sun-open-before)" raw="yes"]]
+
+
+
+
+
+[[!inline pages="internal(2022/info/sun-open-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/sun-open-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/survey.md b/2022/talks/survey.md
new file mode 100644
index 00000000..4e1238bf
--- /dev/null
+++ b/2022/talks/survey.md
@@ -0,0 +1,160 @@
+[[!sidebar content=""]]
+[[!meta title="Results of the 2022 Emacs Survey"]]
+[[!meta copyright="Copyright &copy; 2022 Timothy"]]
+[[!inline pages="internal(2022/info/survey-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Results of the 2022 Emacs Survey
+Timothy (he/him, IRC: tecosaur)
+
+[[!inline pages="internal(2022/info/survey-before)" raw="yes"]]
+
+If I am giving this talk, then a month ago the 2022 Emacs Survey will
+have occurred! I will go through the motivations, implementation,
+results, and plans of the Emacs Survey.
+
+Outline:
+
+- A quick overview of the main results of the 2022 Emacs Survey
+- Discussion of motivation, implementation, and future plans
+
+
+# Discussion
+
+## Notes
+
+- 2020: 7000 participants in the survey (Adrien Brochard)
+- 2022: new survey framework: julia (language) + Genie Framework
+- 2022: 6600 responses (1000 partial); 115 nations; 96% male (better
+ among younger people)
+- the plots are using Makie, a Julia plotting library
+
+## From IRC
+
+- Magit
+ - magit is more popular than org mode :-O
+ - Magit was more popular in 2020 too, however the gap has narrowed in the 2022 results 😀
+ - magit is a miracle
+ - I've read about people who use Emacs for magit ONLY!
+ - magit deserves every heart given
+ - I love magit and I am not even a developer so I can only imagine how amazing it is for people who use it for actual work
+ - Especially since for programmers, which is a large chunk of emacs users, version control is probably more important than org I would assume
+ - ieure, i see why people might think that, but svn is non negotiable at work. my question was: does magit do anything useful for all merging VCS that could be included in VC?
+ - The difference between terminal git and magit is huge for me, even as someone who doesnt use it every day
+ - If your repos are mostly standard source and not dependent on huge binary assets or anything, you're missing out on better VCS first and foremost
+ - but judging by the way users extol magit, it must do something better than vc that can be applied to all merging version control systems (non locking ones). if someone can tell me what it is and i find it useful, i might add it to vc
+ - I use both VC and Magit actively and I've found it's mostly about the enhanced interactivity with Git. It's very visual and also allows you to pretty much interactively set/unset flags to various Git commands as you would on the terminal but much faster all thanks to transient.el.
+ - +1 for transient being a big part of why people find magit easier to use.
+- New versions
+ - We have to be careful about selection bias when it comes to versions used.
+ - my worry is that people on older versions are less up to date with what is going on and might not hear about the survey :/
+ - the way i see it packages don't really have to officially support versions of emacs older than the latest release
+ - unless they're big and see frequent updates for new platforms
+ - i.e. TRAMP
+ - otherwise users of older versions will just backport those packages themselves
+
+## Feedback
+
+- Survey framework
+ - oh yeah, the new framework was super pleasant to use, am a fan
+ - Liked how there was a way the responses were saved (locally?), and there was a possibility to resume answering later!
+ - from a user's perspective, the UX was amazing including download-options for my own answers. Impressive.
+ - I loved this year's platform too! so another +1 here
+- found the pie charts a little hard to follow, e.g. what color related to that package etc. Maybe add more labeling to the chart itself?
+ - on that topic, some of the colors were also very close (eg. Haskell and Java in the language graph)
+- I'd suggest that bar charts with more than 5 colors be labeled at the bar versus in the margin. (Also take mercy on the color blind)
+ - i'd suggest using a different tiled pattern for each bar instead of colors. That makes them easier to follow, especially for the color blind, or for people who cannot see colors well at night (me)
+ - Speaker: Hopefully this isn't too bad for the colour blind, I chose Paul Tol's colour schemes for that reason (among others)
+- i took part in that survey! *proud of accomplishment*
+- First, a general BIG THANK YOU for your survey!
+- nice, thanks for working on all of this
+- this is an amazing talk.
+- org mode huge, always forget how much of that pie it brings in
+- nice pie chart :)
+- lobste.rs getting bigger lately?
+- i am going to be interested in how the results differ when you factor out /r/emacs
+- the graphics are gorgeous
+- hence while I sprinkle in phrases like "within this more engaged subset of users ..." 😉
+- Hmmm, I didn't think about using Emacs as my chat / email client as counting as writing prose in Emacs. But it does.
+- (and the same with Org 😛)
+- magit applies to many mode, there is only one org-mode ;]
+- I don't think I can stop using magit
+- man who are these people filling the survey in less than 10 min?
+- Excellent talk! Thank you.
+- thanks for the talk btw, it was very interesting
+- Very informative. Nicely done!
+- Excellent work, looking forward to further analysis
+- Very nice presentation!
+- Thanks Timothy, great talk!
+- Thanks, great talk! *clapclapclap*
+- Great presentation
+- next year, I will join survey
+- Great talk and thanks for all this nice work!!
+- my compliments for your great analysis of the survey's data
+
+## Questions and answers
+
+- Q: will there be another survey next year as well?
+ - That's the plan, and the year after, etc.
+- Q: Do Emacs developers take into account the survey results? I mean,
+ they are volunteers working on what they find useful/interesting for
+ them, which is of course great.
+ - A: There's no obligation for emacs-devel or Emacs package
+ maintainers to do anything in response to the survey results,
+ but hopefully the results will be able to inform development
+ choices they make.
+- Q: are you planning to have the software used beyond Emacs surveys?
+ - A: It could well be, it's written as a general survey platform
+- Q: Is the survey software available in source code via
+ Gitlab/Github/...? What's the license?
+ - A: Yep, it's GPL-3, and the source is availible at
+ <https://git.tecosaur.net/tec/emacs-survey>
+- Q: Are the raw results available so we can run some data analysis
+ ourselves?
+ - A: Indeed! As mentioned in the talk they're publically
+ availible in a number of formats, e.g.
+ - <https://emacssurvey.org/results/3425413930.csv>
+ - <https://emacssurvey.org/results/3425413930.json>
+ - <https://emacssurvey.org/results/3425413930.db>
+- Q: Any specific reason why you chose Julia as a language to code the
+ survey (curious about it)?
+ - A: I use it a lot, and like doing so :)
+- Q: Do you have any insight on the degree of selection bias (the
+ respondents may represent a very particular segment of the overall
+ users, in terms of motivation to respond). The nb of days of
+ response after announce may indicate that respondents are very much
+ in touch with emacs news.
+ - A: We can try to look at the degree to which the survey referrer
+ (r/emacs, HN, etc.) changes the survey results, but ultimately
+ this is a hard question. At the end of the day, the way I view
+ things is we can just do our best to investigate how much of an
+ effect is seen in the results, but this is the best shot we have
+ availible.
+ - A2: That said, we can compare a few particular statistics to
+ other surveys done in a wider population to gauge how close our
+ results are to them, but that assumes that those other surveys
+ (e.g. Stack Overflow's developer survey) are themselves
+ representative of the Emacs user base, itself can be quite an
+ assumption.
+- Q: Are the pies in gnuplot or something else?
+ - A: The plots are using Makie, a Julia plotting library.
+- Q: Thoughts on an emacs package to fill out the survey? Just more
+ work for you ;)
+ - A: Hopefully more work for someone else ;)
+- Q: Is the survey framework open sourced already or still in the
+ works?
+ - A: (replied above, IIUC) it's GPL-3 and the source is available
+ at <https://git.tecosaur.net/tec/emacs-survey>
+- Q: what did you use to draw the diagram in p.7?
+ - Inkscape
+- Q: you might go into this in a second, but are there any specific questions you are looking to go into when you find the time?
+
+
+[[!inline pages="internal(2022/info/survey-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/survey-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/tramp.md b/2022/talks/tramp.md
new file mode 100644
index 00000000..cf7b5076
--- /dev/null
+++ b/2022/talks/tramp.md
@@ -0,0 +1,28 @@
+[[!sidebar content=""]]
+[[!meta title="Elisp and the TRAMP: How to NOT write code you don't have to"]]
+[[!meta copyright="Copyright &copy; 2022 Grant Shangreaux"]]
+[[!inline pages="internal(2022/info/tramp-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# CANCELLED: Elisp and the TRAMP: How to NOT write code you don't have to
+Grant Shangreaux (Shang-groo or Shang-grow, he/him, <mailto:shoshin@cicadas.surf>, <https://cicadas.surf/~shoshin>, IRC: shoshin on libera.chat, @kheya@mastodon.social, <https://matrix.to/#/@shoshin:cicadas.surf>)
+
+[[!inline pages="internal(2022/info/tramp-before)" raw="yes"]]
+
+When you have a hammer, everything looks like a nail. When you have
+Emacs, everything looks like&#x2026; what? This is a story of understanding
+a particular feature of Tramp and realizing it could be used in all
+sorts of places in Emacs-land. Some of them are truly useful, but I
+ended up in a place where applying it was going to create a non-trivial
+amount of work writing Emacs Lisp to extend EMMS.
+
+
+
+[[!inline pages="internal(2022/info/tramp-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/tramp-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/treesitter.md b/2022/talks/treesitter.md
new file mode 100644
index 00000000..317cf3f5
--- /dev/null
+++ b/2022/talks/treesitter.md
@@ -0,0 +1,121 @@
+[[!sidebar content=""]]
+[[!meta title="Tree-sitter beyond syntax highlighting"]]
+[[!meta copyright="Copyright &copy; 2022 Abin Simon"]]
+[[!inline pages="internal(2022/info/treesitter-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Tree-sitter beyond syntax highlighting
+Abin Simon (IRC: meain on libera.chat, Matrix: @meain:matrix.org, <mailto:mail@meain.io>)
+
+[[!inline pages="internal(2022/info/treesitter-before)" raw="yes"]]
+
+Tree sitter has seen a lot of development recently, but more often
+than not folks are only aware of its use for syntax highliting. The
+idea of this talk is to introduce some other usecases where they could
+benefit from tree-sitter.
+
+This talk will be an overview of the kind of things that they will be
+able to do with tree-sitter with demos but won't go in depth into how
+they would all of them. The presentation will link to the resources
+mentioned during the talk where folks can learn more about each of
+them.
+
+This session will introduce them to things like (not final list):
+
+- textobjects using tree-sitter: <https://github.com/meain/evil-textobj-tree-sitter/>
+- Folding using tree-sitter: <https://github.com/emacs-tree-sitter/ts-fold>
+- Navigating config headings: <https://blog.meain.io/2022/navigating-config-files-using-tree-sitter/>
+- Using tree-sitter for narrowing: <https://blog.meain.io/2022/more-treesitter-emacs/#narrow-to-language-level-constructs>
+- Intelligent snippets using tree-sitter: <https://blog.meain.io/2021/intelligent-snippets-treesitter/>
+- Using tree-sitter to get which-func like functionality: <https://blog.meain.io/2022/more-treesitter-emacs/#show-current-class%2Ffunction-name-in-modeline>
+- Some useful tree-sitter functions: tree-sitter-save-excursion
+
+
+# Discussion
+
+## Notes
+
+- The speaker's blog: <https://blog.meain.io/>
+- Fancy Narrow: <https://github.com/Malabarba/fancy-narrow>
+- Text objects using tree-sitter in evil-mode:
+ <https://github.com/meain/evil-textobj-tree-sitter/>
+- Notes/Slides: <https://github.com/meain/emacsconf-talk-tree-sitter>
+
+## Questions and answers
+
+- Q: What treesitter package is being used I think there is 3
+ different ones
+ - A:  Most of what is demoed here is using
+ <https://github.com/emacs-tree-sitter/elisp-tree-sitter>
+- Q: Can the folds be treated as outlines as in outline-minor-mode
+ folds?
+ - A: I don't think the package ts-fold which I showcased works
+ with outline mode, but it should be simple enough to add
+ something like that
+ (<https://github.com/emacs-tree-sitter/ts-fold>)
+- Q: Is there any benefit to use tree-sitter for sexp-based languages?
+ +1
+ - A: Being able to query for specific things like variables /
+ conditions might come in handy
+- Q:Do you have to have an LSP set up in order to use tree-sitter?
+ - A:I still use eglot for lsp. While tree-sitter help with
+ highlighting, folding, nav etc . . tree-sitter can be more
+ thought of to be working on a single file. So when I need to do
+ project wide things like jump to defenition, find reference or
+ renames lsp comes in handy.
+- Q: Is there any example configuration for the transition from
+ traditional major mode to new *-ts-major-mode? It seems that
+ configuration of major mode (xxx-mode-hook, yasnippet, etc) has to
+ been rewritten
+ - A: I am just starting to work with builtin tree-sitter, so
+ don't have much input here  unfortunately :(
+- Q: So, is there a tree-sitter language definition for elisp?
+ - A: I'm just starting to look into built-in tree sitter, but I feel like we should be able to do all of them.
+- Q: awesome stuff. i always wonder when itll appear in my fingers. sure the lib is in 29 but i guess some glue is required?
+- Q: thanks for the great talk. I have one question. Will tree sitter able to highlight syntax in sourceblocks of org files?
+ - A: there is nothing technically stopping one from enabling highlighting in config blocks. Since I don't use org, I've not really looked into how it currently is.
+- Q: So Emacs 29 includes the original tree sitter C library by Max Brunsfeld or is it a custom rewrite?
+- Q: what about the relationship between emacs-tree-sitter and treesitter in core emacs
+ - A: there are just two Emacs side implementaions for the tree-sitter lib <https://tree-sitter.github.io/tree-sitter/> . The first one is in Rust and the second in C within core
+ - A: I have not extensively tested out the builtin one, but both should be more or less the same. The builtin one is less mature as of now and has a slightly different api.
+ - A: Plus most plugins that work with tree-sitter will be working with elisp-tree-sitter only as of now
+ - I'm speaking of the the third party package. Perhaps it has been fixed. IIUC the issue is not the emacs package but rather tree-sitter itself.
+ - A: You might wanna open an issue at https://github.com/emacs-tree-sitter/tree-sitter-langs if you are having issues with tree-sitter highlighting
+- Q: biggest difference between the treesitter functionality built into Emacs 29 and the emacs-tree-sitter github package?
+- Q: Are there any sample configurations about *-ts-mode integrated with default major-mode?
+- Q: Building Emacs 29 with native tree-sitter support seem challanging any useful tip.
+ - building emacs ... tips from Xah Lee <http://xahlee.info/emacs/emacs/building_emacs_on_linux.html>
+- Q: How much of what you showed can be done with the build-in tree-sitter?
+- Q: How easy is it to hack the syntax definition?
+ - A: It is super easy once you learn a bit about tree-sitter. This is how the highlight queries looks like. <https://github.com/emacs-tree-sitter/tree-sitter-langs/blob/master/queries/python/highlights.scm> Once we have this, the tree-sitter integration can take care of the rest.
+- Q: So Emacs 29 includes the original tree sitter C library by Max Brunsfeld or is it a custom rewrite?
+ - both elisp-tree-sitter and tree-sitter in emacs core are emacs side wrappers on top of the tree-sitter lib from Max.
+- Q: What was the name of the module used for doing AST queries on the current buffer?
+ - A: for viewing and querying the tree, they are commands built into `tree-sitter-debug-mode` and `tree-sitter-query-builder`
+
+## Other IRC discussions
+
+- thanks for the great talk meain!
+- thank you for the talk
+- Great talk. Can I use this with Python? Bash?
+- Amazing stuff!!! I need that YAML thing!
+- When I am writing lisp macros I'm always having problems with the highlighting. I'm seeing this can be achieve with tree-sitter, is there a more streamlined way of doing it with treesitter - with less code?
+- thank you for tree-sitter talk, It's awesome
+- Now I definitely need to try tree-sitter
+- very inspiring talk, the future looks bright!
+- Very well done talk. Thank you.
+- I've actually added a lot of highlighting for rust mode on my editor, using tree sitter. It's very powerful once you get into it
+- with the new *-ts-mode, seems that a lot of configurations of language specific major mode have to be rewritten
+ - A: yup, there are quite a few things that being rewritten a bit like indent, highlight etc.
+- yup, previously I would just jump to top after reformatting code. These days I've been also trying https://github.com/radian-software/apheleia which has been pretty good at keeping the position by using some other methods
+- I use your tree-sitter package for a long time, It works very stable.
+- I use tree-sitter write plugin to replace paredit: https://github.com/manateelazycat/grammatical-edit
+
+[[!inline pages="internal(2022/info/treesitter-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/treesitter-nav)" raw="yes"]]
+
+[[!taglink CategoryTreeSitter]]
diff --git a/2022/talks/wayland.md b/2022/talks/wayland.md
new file mode 100644
index 00000000..9f633c8a
--- /dev/null
+++ b/2022/talks/wayland.md
@@ -0,0 +1,122 @@
+[[!meta title="Emacs should become a Wayland compositor"]]
+[[!meta copyright="Copyright &copy; 2022 Michael Bauer"]]
+[[!inline pages="internal(2022/info/wayland-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Emacs should become a Wayland compositor
+Michael Bauer[[!sidebar content=""]]
+ (IRC: permcu, <mailto:perma-curious@posteo.de>)
+
+[[!inline pages="internal(2022/info/wayland-before)" raw="yes"]]
+[[!template id="help"
+volunteer=""
+summary="Q&A could be indexed with chapter markers"
+tags="help_with_chapter_markers"
+message="""The Q&A session for this talk does not have chapter markers yet.
+Would you like to help? See [[help_with_chapter_markers]] for more details. You can use the vidid="wayland-qanda" if adding the markers to this wiki page, or e-mail your chapter notes to <emacsconf-submit@gnu.org>."""]]
+
+
+Since Emacs learned wayland last year, it can now become a wayland compositor.
+Emacs is already a great window manager. Let us embrace this in the wayland
+future, where managers become compositors.
+
+In this short talk I would like to convince you that this is a good idea and get
+you exciting about the possibilities. I then outline how to go about
+implementing this idea.
+
+Afterwards I would very much like to get a discussion started together.
+
+Discussions:
+
+- <https://news.ycombinator.com/item?id=33849556>
+
+# Discussion
+
+## Notes
+
+- Call to action - let Michael know if you know anyone else working on
+ something like this so they can collaborate and not duplicate
+ effort.
+- Site (coming soon): perma-curious.eu
+- I am an EXWM user and would be very happy to test your code! Looks great!
+- I know of many people quitting EXWM because of the lack of active development. Your project could be a kind of revival!
+- I would be interested to try it out. I'm on sway right now.
+- What I mean is that people are moving to other WMs which work or are planned to work with Wayland
+- sway.el might have something that could be used
+- Feedback:
+ - Thank you very much for the talk and the work.
+ - Thank you for sharing your amazing work!
+ - Yes, thank you for the talk, looks really promising
+ - thank you for the talk
+ - Thanks and great job!
+
+## Questions and answers
+
+- Q: Are you using it as a replacement of EXWM?
+ - A: No, not yet, but I'm planning to.
+- Q:Is this testable?
+ - A:
+- Q: Have you considered contributing it to emacs core? 
+ - A:
+- Q:Question: this is wayland compositor in Emacs? What different with
+ XReprarent in X11 ?
+ - A:No, I planned it, but no. Does not handle file descriptors.
+ It's a compositor that talks to Emacs. etc. I don't know what
+ XReparent is; have to skip that.
+- Q:What does it mean for emacs to be "a wayland compositor"? What
+ can the end users do with it?
+ - A:
+- Q: How would multiple monitors be handled? Separate Frames?
+ - A:
+- Q:  Could you make it so you can restart emacs without loging out;
+ or switch to non emacs buffers while emacs is blocking: these are
+ the biggest issues with EXWM? Maybe in the future with a different
+ ui for non emacs buffers.
+ - A: 
+- Q:Did this project can implement *mirror* of buffer for Emacs
+ different window?
+ - A:
+- Q:How does the single-threaded affects the project?
+ - A:
+- Q:this technology need write wayland server? Can it works with
+ Gnome3 ?
+ - A:
+- Q: Could there be a emacs-wayland-server and just connect with
+ emacsclient?
+ - A:
+- Q: When you share your code, could you provide the equivalent of an
+ .xsession script for those who are on EXWM and want to test?
+ - A:
+- Q: there have a demo to show this emacs-wayland-compositor, even it
+ buggy now? Just curious. ;)
+ - A:
+- Q: So the current limitation is that buffer mirroring doesn't respect different widths/heights?
+ - A:(answered - transcript tbd)
+- Q:Could you use some of this package with other walyand compositers
+ "probably not all of it" , sway, kde, river, gnome.
+ - A:(answered - transcript tbd)
+- Q:Will Wayland support reach feature parity with EXWM in the future?
+ Will there be other tradeoffs?
+ - A:(answered - transcript tbd)
+- Q: What is the biggest difference between Xorg and wayland that you
+ have found?
+ - A:(answered - transcript tbd)
+- Q: Did you know EAF
+ <https://github.com/emacs-eaf/emacs-application-framework> ? 
+- Q: Do you have the code available somewhere (git repo)?
+ - <https://perma-curious.eu>
+- Q: So the current limitation is that buffer mirroring doesn't respect different widths/heights?
+
+Other discussions from IRC:
+
+- If I understand correctly, this project is more like philosophy of EXWM, but it not based on X11, instead based on Wayland.
+
+
+[[!inline pages="internal(2022/info/wayland-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/wayland-nav)" raw="yes"]]
+
+
diff --git a/2022/talks/workflows.md b/2022/talks/workflows.md
new file mode 100644
index 00000000..a42db628
--- /dev/null
+++ b/2022/talks/workflows.md
@@ -0,0 +1,56 @@
+[[!sidebar content=""]]
+[[!meta title="Org workflows for developers"]]
+[[!meta copyright="Copyright &copy; 2022 George Mauer"]]
+[[!inline pages="internal(2022/info/workflows-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Org workflows for developers
+George Mauer (he/him/they/ze, IRC: gmauer, <mailto:gmauer+emacsconf@gmail.com>)
+
+[[!inline pages="internal(2022/info/workflows-before)" raw="yes"]]
+
+# Table of Contents
+
+
+
+We all know org-mode is great but much of the discussion often
+focuses on the agendas, todo lists, and project planning. These are
+all valuable. yet rarely do we talk about workflows that do work, not
+just plan it. Inspired by literate programming ideas, this talk will
+demonstrate a grab-bag of workflows developed over the years that are
+of use not only for planning, tracking, note keeping, and ops work,
+but in actual day-to-day enterprise software development.
+
+
+# Discussion
+
+## Notes
+
+- Start with all the things from howardism literate devops articles -
+ its all great and is what got me started
+ <http://howardism.org/Technical/Emacs/literate-devops.html> (he also
+ just did a talk on eshell)
+- Learning request.el, dash.el, cl-loop facility, and s.el reasonably
+ well is a pretty big 
+- there is also <https://gitlab.com/mtekman/org-tanglesync.el>
+
+- Q: are arduino blocks included in org-mode?
+ - A: I did add `arduino-mode` I think thats the only thing I did so maybe its from there
+- A: This is the bit that I'm particularly proud of btw - the ability to do dynamic scoping of variables that is driven by properties in the org outline
+- Q: how did you insert the texts (not caption)?
+ - A: in kdenlive
+
+## Feedback
+
+- liked it a lot
+- awesome talk gmauer`
+- :) It was fun captioning it.
+
+[[!inline pages="internal(2022/info/workflows-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/workflows-nav)" raw="yes"]]
+
+[[!taglink CategoryOrgMode]] [[!taglink CategoryCoding]]
diff --git a/2022/upload.md b/2022/upload.md
new file mode 100644
index 00000000..98e9fb07
--- /dev/null
+++ b/2022/upload.md
@@ -0,0 +1,100 @@
+[[!meta title="Upload instructions for speakers"]]
+
+You can upload your video through a web-based interface or using your
+favourite FTP client. Please start your filename with the identifier
+for your talk, which is the last part of the talk page URL. For
+example, if your talk page is at
+https://emacsconf.org/2022/talks/journalism/ , the ID is
+`journalism`.
+
+If you have slides, notes, or a script for your talk, please include
+them as well. We can post them on the talk page, and we can also use
+them to help caption your talk. You can also send us additional text
+or links to include on your talk page. If you need help, please email
+<emacsconf-submit@gnu.org>.
+
+Please let us know at <emacsconf-submit@gnu.org> if you do *not* want
+your talk included in the EmacsConf 2022 password-protected backstage
+area for volunteers and speakers.
+
+[[!toc]]
+
+# Web interface
+
+Go to <https://ftp-upload.emacsconf.org> and enter the password
+**emacsconf** (Javascript required, compatible with LibreJS).
+
+You can upload multiple files by dragging and dropping onto the window
+or by clicking on the green + button at the bottom of the list on the
+left. The default settings are fine.
+
+When you have selected all of your files, click on the **Upload**
+button. The page will show a progress bar. When the upload is
+complete, the page will display the download URL. You can e-mail
+<emacsconf-submit@gnu.org> with that URL, or we can pick up the files
+when we check regularly.
+
+<a name="ftp"></a>
+# FTP
+Here are the FTP server details:
+
+- host: ftp-upload.emacsconf.org
+- username: anonymous
+- port: 21
+- folder: upload-here
+
+To upload your recording and any accompanying material to the above
+FTP server, you can use your FTP client of choice. For instance,
+FileZilla, a free/libre user-friendly application with a graphical
+user interface. On deb-based GNU/Linux distributions such as Trisquel
+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.
+
+# What happens next?
+
+We'll send you an e-mail when we download your files. Then we'll
+process your video to normalize the audio levels and try to reduce
+noise. We'll also convert it into a standard format using codecs that
+aren't encumbered by patents, and we'll make a compressed version that
+will be easier for people with limited bandwidth.
+
+We'll upload your materials to the EmacsConf 2022 backstage area so
+that volunteers can work on captioning it. If you don't want your talk
+included in the backstage area for volunteers and other speakers,
+please let us know at <emacsconf-submit@gnu.org> before you submit
+your talk
+
+In a few weeks, we'll e-mail you check-in instructions for the
+conference. If you plan to have a live Q&A session, we'll also e-mail
+you instructions for the BigBlueButton room that you can use to answer
+questions.
+
+On the day of the conference, we'll move your materials to the public
+EmacsConf 2022 area and publish them when the talk is streamed.
+
+# What if you can't upload the presentation by November 4?
+
+We can accept later submissions, although it's more of a scramble.
+Please try to upload your talk as soon as you can. (Our stress levels
+get higher and higher as the conference approaches!)
+
+Thank you for your help in getting ready for a smooth EmacsConf 2022!
diff --git a/2022/volunteer.md b/2022/volunteer.md
new file mode 100644
index 00000000..8a052d5c
--- /dev/null
+++ b/2022/volunteer.md
@@ -0,0 +1,35 @@
+[[!meta title="Volunteer"]]
+[[!meta copyright="Copyright &copy; 2022 Sacha Chua"]]
+
+[[!toc levels=3]]
+
+EmacsConf 2022 was a lot of fun, and now we get to turn all those
+wonderful talks and Q&A sessions into something people can keep
+learning from in the years to come. We would love to figure out how to
+work with your skills, interests, and availability. Volunteering is a
+great way to meet fellow Emacs geeks, tinker around with interesting
+packages and scripts, and learn a ton.
+
+<https://emacsconf.org/2022/organizers-notebook/#overall> has an
+overall prioritization matrix. If any of those options look like
+something you want to learn or help with, or if you want to make
+things even better than what's in the table, let us know.
+
+# Some ideas for help wanted / projects after the conferenc
+
+- [[harvest|**Review, index, and caption Q&A sesssions**]]
+- Make things even better next year
+ - Automate the video processing workflow so that we can handle last-minute submissions more smoothly
+ - Improve the captioning workflow
+
+See <https://emacsconf.org/2022/organizers-notebook/> for a lot more
+about what's happening backstage and opportunities to help. Let us
+know what sorts of things you're interested in and what you'd like to
+learn more about. Doesn't have to be limited to this list!
+
+# Got other ideas?
+
+[We'd love to hear from you!](mailto:emacsconf-org@gnu.org) (or privately:
+[emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org))
+
+[[!taglink CategoryVolunteer]]
diff --git a/2022/volunteer/caption.md b/2022/volunteer/caption.md
new file mode 100644
index 00000000..7494b720
--- /dev/null
+++ b/2022/volunteer/caption.md
@@ -0,0 +1,63 @@
+[[!meta title="Caption volunteer"]]
+
+# Responsibilities
+
+- Write captions or edit auto-generated captions in order to make
+ pre-recorded videos easier to understand
+- (optional) Note chapter markers
+- (optional) Note other things that may need additional help to make
+ them accessible, such as images not described in the speaker's
+ voiceover
+- (optional) Help extract information from Q&A videos after the conference
+
+# Preparation
+
+We'll set up a protected directory so you can get a sneak peek at the
+prerecorded videos, and we'll e-mail you the username and password to
+use. If slides, scripts, or auto-generated captions are available as a
+starting point, we'll upload those as well.
+
+# Process
+
+We'll e-mail all the captioning volunteers once speakers submit videos.
+
+When you want to caption a video, browse through the protected
+directory to see which ones are available for captioning. E-mail
+<sacha@sachachua.com> or send a message to `sachac` via IRC
+(`#emacsconf-org` on IRC) so that we can reserve that one for you.
+Check out these [[captioning]] tips and fire up your favorite subtitle
+editor.
+
+We find that captioning generally takes between 2-6x the video time if
+you're an experienced captioner editing auto-generated captions, and
+can take a bit longer than that if you're starting out or starting
+from scratch. You can work with timestamps, or you can send us plain
+text and we'll get them aligned with the videos. It's okay to work in
+small chunks.
+
+E-mail your partial or finished captions to <sacha@sachachua.com> .
+When you're finished, we'll send them to the speaker for review and
+prepare the transcript for inclusion in the wiki.
+
+When the streamer shows the pre-recorded video, your captions will be
+included below it. They will also be combined into a transcript for
+the wiki, which will be published when the talk is live. Chapter
+markers will be listed below videos so that people can jump to
+specific sections.
+
+# After the conference
+
+If any talks weren't captioned by the time of the conference, you're certainly welcome to help caption them afterwards. We'll also extract the Q&A sessions and work on either chapter markers (to indicate when specific questions were answered) or captions for those.
+
+Here's what people said about how most of the EmacsConf 2021 talks were streamed with captions during the conference itself:
+
+- "I really appreciate the approach of doing things prerecorded and having captions."
+- "The captions for this conference have has an impressive amount of work put into them."
+- "++ to all that stuff. Great job on the captions, and the demonstrated functionality is very impressive."
+- "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."
+
+Your captions will not only make talks more accessible during the conference, but also more searchable and more browsable after the conference. Thank you!
+
+[[Check out other ways to volunteer|2022/volunteer]]
+
+[[!taglink CategoryVolunteer ]]
diff --git a/2022/volunteer/checkin.md b/2022/volunteer/checkin.md
new file mode 100644
index 00000000..fc3f6182
--- /dev/null
+++ b/2022/volunteer/checkin.md
@@ -0,0 +1,118 @@
+[[!meta title="Check-in volunteer"]]
+
+# Responsibilities
+
+- Notice speakers checking into IRC or Big Blue Button
+- Get them into the correct room and help them doublecheck their audio and video quality
+- Follow up with speakers who haven't checked in yet
+- Check on speakers periodically so that they're not waiting alone
+- (optional) Do tech-checks with speakers before the conference to identify potential issues
+
+Live Q&A is part of what makes EmacsConf better than a video playlist
+watch party. You can help speakers get settled in and feel at ease so
+that they're ready to go live as soon as their video finishes.
+
+# Preparation
+
+You'll need an account on bbb.emacsverse.org, and we'll set you up
+with moderator access on the relevant BBB rooms.
+
+We'll share a list of talks for your shift with:
+
+- starting time
+- talk title
+- track
+- speaker name
+- pronunciation
+- pronouns
+- BBB room URL
+- pad URL
+- email address
+- emergency contact information
+
+# Process
+
+## Looking for speakers
+
+We'll ask speakers to check into `#emacsconf-org` at least 30 minutes
+before their Q&A session and say something like "Hello, this is NAME
+checking in." You can hang out in the #emacsconf-org channel and keep
+an eye out for their messages.
+
+## Checking speakers in
+
+When you notice a speaker checking in, you can use something like
+`/msg NICK Hi, let me help you get checked in. Please join BBB_URL .`
+to send a private message to the speaker with the Big Blue Button URL.
+
+Join the BBB room. If you do not have moderator access, let sachac know.
+
+The BBB rooms will be set up so that people can join without approval.
+When the speaker arrives, you can take a few moments to say hi to
+them, thank them for presenting at EmacsConf, etc.
+
+Click on their name and choose **Promote to moderator.**
+
+Click on their name again and choose **Make presenter.**
+
+**Checklist with notes:**
+
+- Can you speak and be heard? Is there echo?
+ - Help them doublecheck their audio quality. Using earphones or headphones can help avoid audio feedback, and using an external microphone can improve audio as well.
+- Can you hear me?
+- Can you share your screen? Will the screen be readable at 1280x720?
+ - Speakers may want to share their screen during the Q&A session. They can do so using the monitor icon in the lower middle. Sharing a single window is usually more advisable than sharing the entire screen, since it allows them to resize the window so that it's easy for people to read.
+ - We recommend good contrast with dark foreground on light background to make it easier for people to see things even in bright light.
+- 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?
+ - The speaker's webcam is optional but highly recommended. The speaker can turn their webcam on using the camera icon in the lower middle.
+- 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?
+ - If the speaker wants to read questions as they come in on Etherpad or IRC, help them load the pad or the track-specific IRC channel. If there is a host for the session, the host can also read questions out loud. Let the speaker know that they can answer questions in any order they want, skip questions, take a little time to think about their answers, and answer questions for as short or as long as they'd like. The room is dedicated for their use, so they don't have to worry about stepping on someone else's Q&A. The first part of their Q&A will be streamed. The host will let them know when the time for streamed Q&A is almost done, but people can continue discussing things in the Q&A room if they want.
+- If you plan to play sounds during your Q&A session, is that audible?
+ - Sometimes speakers will need to set up a virtual loopback device to get their system audio to be included in BBB. This is somewhat complicated and should be tested before the conference.
+
+Once the speaker is settled in, you can let `#emacsconf-org` know that
+the speaker has been checked in.
+
+Let the speaker know how many minutes before their Q&A starts. They
+can take a break before then. Many speakers choose to watch other
+talks before theirs.
+
+## Heads-up before the Q&A starts
+
+Check in on the speaker about five minutes before their Q&A session
+starts to give them a heads-up. Ask them to close any other tabs that
+they might be using to watch EmacsConf, because that will create an
+audio feedback loop once their Q&A session is being streamed.
+
+Right before the Q&A starts, make sure the host has started the
+recording. If there is no host or the host has forgotten, you can use
+the **Start recording** button at the top.
+
+In between checking in people, feel free to enjoy the conference!
+
+## What if a live Q&A session is starting within 30 minutes and the speaker hasn't shown up yet?
+
+Let us know on `#emacsconf-org`. You or another organizer can contact
+them using their emergency contact info. If you prefer to not use your
+phone, you can ask one of the organizers in #emacsconf-org and we'll
+call the speaker for you.
+
+If the speaker is still not available, we can stream any ongoing Q&A
+sessions or open it up for community discussion.
+
+## After the Q&A wraps up
+
+If you notice that the Q&A in a room is all done, you can thank the
+speaker and click on **Stop recording** in the top middle.
+
+# After the conference
+
+Checking in speakers goes a long way to reducing the technical risks
+and keeping the conference running smoothly. A smooth checkin can
+encourage both speakers and participants to come back next year for
+more Emacs awesomeness. Thank you!
+
+[[Check out other ways to volunteer|2022/volunteer]]
+
+[[!taglink CategoryVolunteer]]
diff --git a/2022/volunteer/host.md b/2022/volunteer/host.md
new file mode 100644
index 00000000..4f19ca27
--- /dev/null
+++ b/2022/volunteer/host.md
@@ -0,0 +1,111 @@
+[[!meta title="Host volunteer"]]
+
+# Responsibilities
+
+For talks with live Q&A sessions:
+
+- Start the recording
+- Ask the speaker questions from the pad and read out feedback if you want
+- (optional) Monitor IRC for questions as well
+- (optional) Let the other organizers know when you're ready for conference
+ participants to join the Q&A; moderate the discussion as needed
+- Handle technical issues that turn up
+- Give the speaker time warnings
+- Keep things cool
+
+Many speakers find it easier to reply to questions that are spoken
+aloud, and this also ensures that the questions get into the
+recording. As the host, you can help shape the Q&A session by choosing
+the order of questions to ask (unless the speaker wants to address a
+different question). You can also help rephrase unclear questions or
+help the speaker feel more comfortable by reminding them that they
+don't have to answer all the questions.
+
+# Preparation
+
+We will give you a list of talks with the times, speaker info, pad
+URL, and URL for the live Q&A session. Please keep the Q&A URLs secret
+until you are ready for everyone to join the Q&A session.
+
+We will also add you as a moderator to the rooms for the talks in your
+shift. You may want to practice muting people in BBB.
+
+We strongly recommend using a headset or earphones to minimize audio
+feedback. Using a headset microphone or an external microphone can
+also improve your sound quality.
+
+# Process
+
+This year we are experimenting with per-talk pads in order to simplify
+the experience for the speakers, since many speakers found it
+difficult to find and focus on their section in a long pad.
+
+At least 5 minutes before the Q&A session starts, go to the provided
+URL. If BBB shows you a list of meetings, you can click on **Join**
+to join the selected one. If you do not have moderator access, let
+us know in `#emacsconf-org` and we can add you.
+
+Have another window for the pad for the current talk.
+
+Have another window or two for IRC. You may want to set up your
+windows so that you can quickly glance at #emacsconf-org. Optionally,
+you can also monitor the chat channel for your track (optional).
+Ideally, an IRC volunteer will monitor that channel and copy the
+questions into the pad for you, so you can focus on just the pad if
+you like.
+
+Make sure you do **not** have another window watching the stream, or
+you may get audio feedback whenever you unmute yourself. If you notice
+audio feedback when other people unmute, you can ask them to make sure
+they aren't watching the stream in a different window and that they
+haven't accidentally joined twice.
+
+To minimize background noise, keep your mic on mute unless you're
+speaking. You can optionally turn on your webcam.
+
+The streamer will join the BBB meeting shortly after the prerecorded
+video ends. When the streamer gives you the go-ahead, **turn on
+recording** and confirm that it is on. Double-check that recording is
+on by seeing whether the button at the top has changed to a red button
+with a timer.
+
+The Q&A will start out closed; just you and the speaker. Depending on
+your comfort level and how the discussion goes, you can let us know
+when you would like it to be opened up to general participation by
+inviting people out loud (and possibly quickly posting in #emacsconf-org).
+Then we will update the public BBB redirect URL to
+point to the BBB room so that people can join. This should take less
+than a minute to update. People will then be able to join using the
+Q&A URL that will be in the talk page and in IRC. That way,
+participants can join the Q&A session and ask directly. You can then
+shift to be more of a moderator, reminding people to stay on mute
+unless it's their turn to speak and muting people as needed.
+
+BBB sometimes has issues if there are lots of participants with
+webcams on. If you notice that things are getting slow or choppy, you
+can ask participants to turn their webcams off.
+
+Please give the speaker a 5-minute warning and a 2-minute warning
+before the end of their streamed Q&A session. If you've decided to
+open up the Q&A session, it can continue off-stream for as long as the
+speaker likes while you move on to the next Q&A session to host. If
+the speaker would like to wrap up, they can leave the meeting whenever
+they want. You can then thank everyone and move on to the next
+presentation.
+
+# In case of...
+
+- Incidents: If someone isn't keeping the
+ [[guidelines for conduct|conduct]] in mind, you can moderate using
+ BBB's tools (muting or removing participants), or let us know in
+ `#emacsconf-org` and we'll figure out how to deal with the
+ situation.
+
+# Afterwards
+
+Q&A sessions are what make EmacsConf more fun than a playlist. =)
+Thanks for helping make EmacsConf awesome!
+
+[[Check out other ways to volunteer|2022/volunteer]]
+
+[[!taglink CategoryVolunteer ]]
diff --git a/2022/volunteer/irc.md b/2022/volunteer/irc.md
new file mode 100644
index 00000000..50724753
--- /dev/null
+++ b/2022/volunteer/irc.md
@@ -0,0 +1,82 @@
+[[!meta title="IRC volunteer"]]
+
+# Responsibilities
+
+- Keep an eye on the IRC channel for your track and copy questions to
+ the relevant Etherpad so that hosts and speakers can easily find
+ them.
+- (optional) Copy other talk-related items to the talk's Etherpad
+- (optional) Copy other conference-related items to the conference Etherpad
+- (optional) Answer conference-related questions
+- (optional) Announce talks and Q&A sessions
+
+The IRC conversations can be pretty fast and difficult to follow. Your
+help in copying questions and other important points to the Etherpad
+will be much appreciated by hosts, speakers, and other participants.
+
+# Preparation
+
+If you'd like to announce talks and Q&A sessions, we can share a pad
+with announcements that you can copy and paste.
+
+If you would like to help set the channel topic or moderate the
+channel, please ask one of the main organizers (bandali, zaeph, or
+sachac) to add you as a channel operator.
+
+# Process
+
+## Copying questions
+
+Open `#emacsconf-gen` and/or `#emacsconf-dev` depending on your shift
+and your ability to keep track of multiple things at the same time.
+
+In another window, open the Etherpad for the relevant talk(s). You can
+find pad URLs on the talk page or in the talk announcement that is
+also posted on IRC.
+
+When you notice a question posted in IRC, reply to the person and say
+that you'll copy the question into the relevant pad. If you're using
+ERC or another programmable IRC client, you may want to make a command
+that simplifies that process.
+
+Copy the question to the bottom of the question list of the relevant
+pad and add the person's nick after it in parentheses. Please keep it
+as a top-level item instead of nesting it under something else. You
+can reword the question for clarity if needed.
+
+The conversation might be too fast to keep track of, especially if the
+channel for a track has overlapping discussions. Feel free to ask if
+people have any more questions for a particular speaker. You can also
+encourage people to use conventions like starting their questions with
+Q: or Q-talkid:.
+
+## Copying other talk-related items
+
+IRC participants might share interesting observations, links, or
+feedback. Please feel free to copy them into the Etherpad for future
+reference.
+
+For Q&A sessions done over IRC, it would also be helpful to copy the
+answers to the Etherpad.
+
+## Announcing talks and Q&A sessions
+
+At the indicated time, paste the announcement into the relevant
+channel. (This might be automated if we get around to it.)
+
+# In case of...
+
+- Incidents: If someone isn't keeping
+ [[guidelines for conduct|conduct]] in mind, let us know in
+ `#emacsconf-org` and we'll figure out how to deal with the
+ situation.
+
+# After the conference
+
+We'll review the chat logs and add anything that might have been
+missed to the Etherpad before archiving it onto the talk page. Thank
+you!
+
+[[Check out other ways to volunteer|2022/volunteer]]
+
+[[!taglink CategoryVolunteer ]]
diff --git a/2022/volunteer/pad.md b/2022/volunteer/pad.md
new file mode 100644
index 00000000..49dcf1a4
--- /dev/null
+++ b/2022/volunteer/pad.md
@@ -0,0 +1,83 @@
+[[!meta title="Etherpad volunteer"]]
+
+# Responsibilities
+
+- Write down interesting points, links, questions, and answers on the
+ Etherpad during talks and Q&A sessions so that people can quickly
+ get the gist even if they're jumping in late or skimming through
+ things without watching the full video
+- Add the Q&A BBB URL to the Etherpad when the host gives the OK for
+ everyone to join
+
+# Preparation
+
+We will add the pad URLs to the watch page for the track.
+
+We will also give you a list of URLs for the live Q&A sessions in the
+BBB room. Please keep these URLs secret until the host gives you the
+OK to add them to the pad.
+
+You can see the pad for the previous year at
+https://etherpad.wikimedia.org/p/emacsconf-2021 . The discussion
+section in https://emacsconf.org/2021/talks/frownies/ shows how the
+pad will be archived onto the talk page. A sample pad for this year's
+conference can be found at <https://pad.emacsconf.org/2022-journalism>
+
+If you would like to suggest improvements to the pad format, please
+e-mail <emacsconf-org@gnu.org> before the conference starts. Thank
+you!
+
+# Process
+
+This year we are experimenting with per-talk pads in order to simplify
+the experience for the speakers, since many speakers found it
+difficult to find and focus on their section in a long pad.
+
+Open one window with the watch page for the EmacsConf track so that
+you can watch the prerecorded video and the Q&A session. Open another
+for the pad for the current talk. You can get the pad URL from the
+watch page, the talk page, the IRC announcements, or by navigating the
+**Next talks** links on a pad.
+
+You don't need to make a verbatim transcription. Short bullet-points
+are enough. If you're not sure about a term, you can mark it with
+something like ?? and someone else may be able to fill it in. If you
+happen to be able to quickly add timestamps in US/Eastern time, that
+may be handy.
+
+If you would like to continue scribing the live Q&A for a session even
+after the next pre-recorded talk starts, you can join the BBB session
+for the live Q&A. Scribing live Q&A sessions might be more useful than
+scribing the pre-recorded video portion because people will have
+access to the videos and possibly transcripts, while Q&A may take a
+while to extract.
+
+To make it easier for the hosts and speakers, we keep the BBB room
+URLs secret until the hosts or speakers give the OK to open it up.
+When the host or speaker invites everyone in, you can add the BBB URL
+to the Etherpad to make it easier for people to join from there.
+
+You can keep an eye on the time to see when the next live Q&A session
+is starting so that you can join the next one if there are overlapping
+sessions.
+
+# In case of...
+
+- Oopsies: Sometimes people accidentally delete chunks of the pad. It happens.
+ You can use the time slider (looks like a clock, second icon in the
+ top right) to go back to a previous version.
+
+- Incidents: If someone isn't keeping
+ [[guidelines for conduct|conduct]] in mind, let us know in
+ `#emacsconf-org` and we'll figure out how to deal with the
+ situation.
+
+# After the conference
+
+We'll archive the pad on the talk page after the event, so your work
+will also help people follow up, find ideas and answers, and get even
+more out of EmacsConf 2022. Thank you!
+
+[[Check out other ways to volunteer|2022/volunteer]]
+
+[[!taglink CategoryVolunteer ]]
diff --git a/2022/watch-dev.md b/2022/watch-dev.md
new file mode 100644
index 00000000..7a211013
--- /dev/null
+++ b/2022/watch-dev.md
@@ -0,0 +1,45 @@
+<!-- Automatically generated by emacsconf-publish-watch-pages -->
+[[!inline pages="internal(2022/info/watch-announce)" raw="yes"]]
+[[!meta title="Development stream"]]
+[[!sidebar content=""]]
+
+<a name="watch"></a>
+<a href="#watch">Watch</a> - <a href="#chat">Chat</a> - <a href="#sched">View schedule</a> -
+Streams: [[General|/2022/watch-gen]] - [[Development|/2022/watch-dev]]
+
+<video controls><source src="https://live0.emacsconf.org/dev.webm" type="video/webm" /></video>
+Alternatively, load <https://live0.emacsconf.org/dev.webm> in a streaming media player.
+
+<a name="chat"></a>
+<a href="#watch">Watch</a> - <a href="#chat">Chat</a> - <a href="#sched">View schedule</a> -
+Streams: [[General|/2022/watch-gen]] - [[Development|/2022/watch-dev]]
+
+Chat: [#emacsconf-dev on libera.chat](https://chat.emacsconf.org/?join=emacsconf-dev)
+
+<div class="chat-iframe" data-track="dev"></div>
+
+<a name="sched"></a>
+<a href="#watch">Watch</a> - <a href="#chat">Chat</a> - <a href="#sched">View schedule</a> -
+Streams: [[General|/2022/watch-gen]] - [[Development|/2022/watch-dev]]
+
+<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <title> Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs"> <title> Back to school with Emacs</title> <rect x="75" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(106,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <title> How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="125" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(139,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <title> Writing and organizing literature notes for scientific writing</title> <rect x="191" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(222,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <title> Attending and organizing Emacs meetups</title> <rect x="400" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(414,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative"> <title> The Emacs Buddy initiative</title> <rect x="450" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(464,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <title> The ship that builds itself: How we used Emacs to develop a workshop for communities</title> <rect x="483" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas"> <title> Real estate and Org table formulas</title> <rect x="583" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(614,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <title> Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <title> Edit live Jupyter notebook cells with Emacs</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <title> orgvm: a simple HTTP server for org</title> <rect x="750" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(764,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <title> Tree-sitter beyond syntax highlighting</title> <rect x="100" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(114,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <title> lsp-bridge: complete asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(164,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <title> asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="183" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(197,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <title> Emacs should become a Wayland compositor</title> <rect x="241" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(255,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <title> Using SQLite as a data source: a framework and an example</title> <rect x="400" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(431,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <title> Revisiting the anatomy of Emacs mail user agents</title> <rect x="475" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(523,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <title> Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="583" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(614,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev"> <title> Bidirectional links with eev</title> <rect x="658" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(664,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs"> <title> Short hyperlinks to Python docs</title> <rect x="683" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(689,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs"> <title> Haskell code exploration with Emacs</title> <rect x="708" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(756,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g> <g transform="translate(0,150)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <title> Results of the 2022 Emacs Survey</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org"> <title> This Year in Org</title> <rect x="58" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(72,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <title> Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="100" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(131,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <title> Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="166" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(180,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <title> Linking personal info with Hyperbole implicit buttons</title> <rect x="216" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(230,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <title> Powerful productivity with Hyperbole and Org Mode</title> <rect x="400" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(448,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers"> <title> Org workflows for developers</title> <rect x="483" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(514,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers"> <title> GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="550" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(581,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <title> Putting Org Mode on the Indieweb</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <title> Fanfare for the Common Emacs User</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction"> <title> rde Emacs introduction</title> <rect x="100" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs"> <title> justl: Driving recipes within Emacs</title> <rect x="175" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(189,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <title> Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="208" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(256,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs"> <title> Getting detached from Emacs</title> <rect x="400" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(414,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <title> Top 10 reasons why you should be using Eshell</title> <rect x="458" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(472,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool"> <title> Emacs was async before async was cool</title> <rect x="516" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(547,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus"> <title> The Wheels on D-Bus</title> <rect x="608" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(639,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs"> <title> Pre-localizing Emacs</title> <rect x="700" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(731,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g></svg>
+
+
+[[!template id=sched title="Tree-sitter beyond syntax highlighting" url="/2022/talks/treesitter" speakers="Abin Simon" q-and-a="IRC or pad after event"]]
+[[!template id=sched title="lsp-bridge: complete asynchronous LSP client" url="/2022/talks/lspbridge" speakers="Andy Stewart, Matthew Zeng" q-and-a="IRC"]]
+[[!template id=sched title="asm-blox: a game based on WebAssembly that no one asked for" url="/2022/talks/asmblox" speakers="Zachary Romero" q-and-a="live"]]
+[[!template id=sched title="Emacs should become a Wayland compositor" url="/2022/talks/wayland" speakers="Michael Bauer" q-and-a="live"]]
+[[!template id=sched title="Using SQLite as a data source: a framework and an example" url="/2022/talks/sqlite" speakers="Andrew Hyatt" q-and-a="live"]]
+[[!template id=sched title="Revisiting the anatomy of Emacs mail user agents" url="/2022/talks/mail" speakers="Mohsen BANAN" q-and-a="live"]]
+[[!template id=sched title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" url="/2022/talks/maint" speakers="Sid Kasivajhula" q-and-a="live"]]
+[[!template id=sched title="Bidirectional links with eev" url="/2022/talks/eev" speakers="Eduardo Ochs" q-and-a="IRC"]]
+[[!template id=sched title="Short hyperlinks to Python docs" url="/2022/talks/python" speakers="Eduardo Ochs" q-and-a="IRC"]]
+[[!template id=sched title="Haskell code exploration with Emacs" url="/2022/talks/haskell" speakers="Yuchen Pei" q-and-a="live"]]
+[[!template id=sched title="rde Emacs introduction" url="/2022/talks/rde" speakers="Andrew Tropin" q-and-a="live"]]
+[[!template id=sched title="justl: Driving recipes within Emacs" url="/2022/talks/justl" speakers="Sibi Prabakaran" q-and-a="IRC"]]
+[[!template id=sched title="Elisp and the TRAMP: How to NOT write code you don't have to" url="/2022/talks/tramp" speakers="Grant Shangreaux" q-and-a="live"]]
+[[!template id=sched title="Getting detached from Emacs" url="/2022/talks/detached" speakers="Niklas Eklund" q-and-a="live"]]
+[[!template id=sched title="Top 10 reasons why you should be using Eshell" url="/2022/talks/eshell" speakers="Howard Abrams" q-and-a="live"]]
+[[!template id=sched title="Emacs was async before async was cool" url="/2022/talks/async" speakers="Michael Herstine" q-and-a="live"]]
+[[!template id=sched title="The Wheels on D-Bus" url="/2022/talks/dbus" speakers="Ian Eure" q-and-a="live"]]
+[[!template id=sched title="Pre-localizing Emacs" url="/2022/talks/localizing" speakers="Jean-Christophe Helary" q-and-a="live"]]
diff --git a/2022/watch-gen.md b/2022/watch-gen.md
new file mode 100644
index 00000000..a2fee277
--- /dev/null
+++ b/2022/watch-gen.md
@@ -0,0 +1,52 @@
+<!-- Automatically generated by emacsconf-publish-watch-pages -->
+[[!inline pages="internal(2022/info/watch-announce)" raw="yes"]]
+[[!meta title="General stream"]]
+[[!sidebar content=""]]
+
+<a name="watch"></a>
+<a href="#watch">Watch</a> - <a href="#chat">Chat</a> - <a href="#sched">View schedule</a> -
+Streams: [[General|/2022/watch-gen]] - [[Development|/2022/watch-dev]]
+
+<video controls><source src="https://live0.emacsconf.org/gen.webm" type="video/webm" /></video>
+Alternatively, load <https://live0.emacsconf.org/gen.webm> in a streaming media player.
+
+<a name="chat"></a>
+<a href="#watch">Watch</a> - <a href="#chat">Chat</a> - <a href="#sched">View schedule</a> -
+Streams: [[General|/2022/watch-gen]] - [[Development|/2022/watch-dev]]
+
+Chat: [#emacsconf-gen on libera.chat](https://chat.emacsconf.org/?join=emacsconf-gen)
+
+<div class="chat-iframe" data-track="gen"></div>
+
+<a name="sched"></a>
+<a href="#watch">Watch</a> - <a href="#chat">Chat</a> - <a href="#sched">View schedule</a> -
+Streams: [[General|/2022/watch-gen]] - [[Development|/2022/watch-dev]]
+
+<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" background="white"> <g transform="translate(0,0)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)"> <title> Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs"> <title> Back to school with Emacs</title> <rect x="75" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(106,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode"> <title> How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="125" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(139,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing"> <title> Writing and organizing literature notes for scientific writing</title> <rect x="191" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(222,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups"> <title> Attending and organizing Emacs meetups</title> <rect x="400" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(414,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative"> <title> The Emacs Buddy initiative</title> <rect x="450" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(464,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/community" title="The ship that builds itself: How we used Emacs to develop a workshop for communities"> <title> The ship that builds itself: How we used Emacs to develop a workshop for communities</title> <rect x="483" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> community</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas"> <title> Real estate and Org table formulas</title> <rect x="583" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(614,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and GNUplot"> <title> Health data journaling and visualization with Org Mode and GNUplot</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs"> <title> Edit live Jupyter notebook cells with Emacs</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org"> <title> orgvm: a simple HTTP server for org</title> <rect x="750" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(764,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting"> <title> Tree-sitter beyond syntax highlighting</title> <rect x="100" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(114,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: complete asynchronous LSP client"> <title> lsp-bridge: complete asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(164,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for"> <title> asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="183" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(197,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor"> <title> Emacs should become a Wayland compositor</title> <rect x="241" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(255,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example"> <title> Using SQLite as a data source: a framework and an example</title> <rect x="400" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(431,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents"> <title> Revisiting the anatomy of Emacs mail user agents</title> <rect x="475" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(523,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source"> <title> Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="583" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(614,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev"> <title> Bidirectional links with eev</title> <rect x="658" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(664,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs"> <title> Short hyperlinks to Python docs</title> <rect x="683" y="75" opacity="0.8" width="8" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(689,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs"> <title> Haskell code exploration with Emacs</title> <rect x="708" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(756,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g> <g transform="translate(0,150)"> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey"> <title> Results of the 2022 Emacs Survey</title> <rect x="8" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(39,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org"> <title> This Year in Org</title> <rect x="58" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(72,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex"> <title> Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="100" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(131,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)"> <title> Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="166" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(180,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons"> <title> Linking personal info with Hyperbole implicit buttons</title> <rect x="216" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(230,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode"> <title> Powerful productivity with Hyperbole and Org Mode</title> <rect x="400" y="15" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(448,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers"> <title> Org workflows for developers</title> <rect x="483" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(514,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers"> <title> GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="550" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(581,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb"> <title> Putting Org Mode on the Indieweb</title> <rect x="633" y="15" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User"> <title> Fanfare for the Common Emacs User</title> <rect x="700" y="15" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(714,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction"> <title> rde Emacs introduction</title> <rect x="100" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs"> <title> justl: Driving recipes within Emacs</title> <rect x="175" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(189,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/tramp" title="Elisp and the TRAMP: How to NOT write code you don't have to"> <title> Elisp and the TRAMP: How to NOT write code you don't have to</title> <rect x="208" y="75" opacity="0.8" width="50" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(256,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> tramp</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs"> <title> Getting detached from Emacs</title> <rect x="400" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(414,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell"> <title> Top 10 reasons why you should be using Eshell</title> <rect x="458" y="75" opacity="0.8" width="16" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(472,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool"> <title> Emacs was async before async was cool</title> <rect x="516" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(547,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus"> <title> The Wheels on D-Bus</title> <rect x="608" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(639,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs"> <title> Pre-localizing Emacs</title> <rect x="700" y="75" opacity="0.8" width="33" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(731,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 9</text></g> <g transform="translate(100,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 10</text></g> <g transform="translate(200,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 11</text></g> <g transform="translate(300,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 12</text></g> <g transform="translate(400,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 1</text></g> <g transform="translate(500,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 2</text></g> <g transform="translate(600,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 3</text></g> <g transform="translate(700,15)"> <line stroke="lightgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="darkgray" x="0" y="133" font-size="10" text-anchor="middle"> 4</text></g></g></svg>
+
+
+[[!template id=sched title="Saturday opening remarks" url="/2022/talks/"]]
+[[!template id=sched title="Emacs journalism (or everything's a nail if you hit it with Emacs)" url="/2022/talks/journalism" speakers="Alfred Zanini" q-and-a="live"]]
+[[!template id=sched title="Back to school with Emacs" url="/2022/talks/school" speakers="Daniel Rösel" q-and-a="IRC"]]
+[[!template id=sched title="How to incorporate handwritten notes into Emacs Orgmode" url="/2022/talks/handwritten" speakers="Bala Ramadurai" q-and-a="live"]]
+[[!template id=sched title="Writing and organizing literature notes for scientific writing" url="/2022/talks/science" speakers="Vidianos" q-and-a="live"]]
+[[!template id=sched title="Attending and organizing Emacs meetups" url="/2022/talks/meetups" speakers="Bhavin Gandhi" q-and-a="live"]]
+[[!template id=sched title="The Emacs Buddy initiative" url="/2022/talks/buddy" speakers="Andrea" q-and-a="IRC or pad"]]
+[[!template id=sched title="The ship that builds itself: How we used Emacs to develop a workshop for communities" url="/2022/talks/community" speakers="Noorah Alhasan, Joseph Corneli, Leo Vivier" q-and-a="live"]]
+[[!template id=sched title="Real estate and Org table formulas" url="/2022/talks/realestate" speakers="Daniel Gopar" q-and-a="pad"]]
+[[!template id=sched title="Health data journaling and visualization with Org Mode and GNUplot" url="/2022/talks/health" speakers="David O'Toole" q-and-a="live"]]
+[[!template id=sched title="Saturday closing remarks" url="/2022/talks/"]]
+[[!template id=sched title="Edit live Jupyter notebook cells with Emacs" url="/2022/talks/jupyter" speakers="Blaine Mooers" q-and-a="live"]]
+[[!template id=sched title="orgvm: a simple HTTP server for org" url="/2022/talks/orgvm" speakers="Corwin Brust" q-and-a="live (not indicated)"]]
+[[!template id=sched title="Sunday opening remarks" url="/2022/talks/"]]
+[[!template id=sched title="Results of the 2022 Emacs Survey" url="/2022/talks/survey" speakers="Timothy" q-and-a="IRC"]]
+[[!template id=sched title="This Year in Org" url="/2022/talks/orgyear" speakers="Timothy" q-and-a="IRC"]]
+[[!template id=sched title="Build a Zettelkasten with the Hyperbole Rolodex" url="/2022/talks/rolodex" speakers="Ramin Honary" q-and-a="IRC"]]
+[[!template id=sched title="Linking headings with org-super-links (poor-man's Zettelkasten)" url="/2022/talks/orgsuperlinks" speakers="Karl Voit" q-and-a="live"]]
+[[!template id=sched title="Linking personal info with Hyperbole implicit buttons" url="/2022/talks/buttons" speakers="Mats Lidell" q-and-a="live"]]
+[[!template id=sched title="Powerful productivity with Hyperbole and Org Mode" url="/2022/talks/hyperorg" speakers="Robert Weiner" q-and-a="live"]]
+[[!template id=sched title="Org workflows for developers" url="/2022/talks/workflows" speakers="George Mauer" q-and-a="live or IRC"]]
+[[!template id=sched title="GRAIL---A Generalized Representation and Aggregation of Information Layers" url="/2022/talks/grail" speakers="Sameer Pradhan" q-and-a="live"]]
+[[!template id=sched title="Putting Org Mode on the Indieweb" url="/2022/talks/indieweb" speakers="Michael Herstine" q-and-a="live"]]
+[[!template id=sched title="Sunday closing remarks" url="/2022/talks/"]]
+[[!template id=sched title="Fanfare for the Common Emacs User" url="/2022/talks/fanfare" speakers="John Cummings" q-and-a="live"]]
diff --git a/2022/watch.md b/2022/watch.md
new file mode 100644
index 00000000..3b2efcb9
--- /dev/null
+++ b/2022/watch.md
@@ -0,0 +1,68 @@
+[[!inline pages="internal(2022/watch/announce)" raw="yes"]]
+[[!inline pages="internal(2022/watch/info)" raw="yes"]]
+[[!sidebar content=""]]
+
+EmacsConf 2022 will be on Dec 3 (Sat) and Dec 4 (Sun), 2022 from
+9am-5pm Toronto/EST time (US/Eastern); equivalently, 6am-3pm PST,
+2pm-10pm UTC, 3pm-11pm Zurich/CET, 7:30pm-4:30am(next-day) India/IST,
+10pm-6am GMT+8.
+
+You can view streams using the watch pages or in a streaming web
+player such as [MPV](https://mpv.io). If you need to reverse the video
+for easier viewing (ex: turning dark mode into light mode), try a
+command like `mpv --vf=negate URL`.
+
+If you experience any disruptions (including weird audio), try waiting
+a minute or two and then reloading the page you're using to watch the
+video. If that still doesn't work, please check our status page at
+<https://status.emacsconf.org> for updates on the status of various
+parts of our infrastructure, and instructions on how to get in touch
+with us about disruptions.
+
+If you prefer, you can watch the livestream via Toobnix (a PeerTube
+instance): [General
+track](https://toobnix.org/w/7t9X8eXuSby8YpyEKTb4aj), [Development
+track](https://toobnix.org/w/w6K77y3bNMo8xsNuqQeCcD). Pre-recorded
+videos and replays will also be available on Toobnix in the [EmacsConf
+channel](https://toobnix.org/c/emacsconf).
+
+To participate in the Q&A, please check the [[talks]] index for a link
+to the talk page, and [[read these Q&A tips|qa]]. The talk page will
+have the Q&A details, including the Etherpad link, IRC channel, and
+optionally a BigBlueButton room (BBB) for Q&A. If you plan to
+participate in Q&A in the BigBlueButton room, please use headphones or
+earphones in order to minimize audio feedback. The link on the talk
+page will take you to a waiting room that will automatically refresh
+when the host has opened the Q&A.
+
+The Etherpad for general EmacsConf discussions is at
+<https://pad.emacsconf.org/2022>. The schedule and the talk pages link
+to the Etherpads for the specific talk. Please feel free to add notes
+and questions to the Etherpad.
+
+Here are the irc.libera.chat IRC channels that we'll be using this year:
+
+- \#emacsconf-gen: discussion for the General track
+- \#emacsconf-dev: discussion for the development track
+- \#emacsconf: hallway conversations, other general conversations
+- \#emacsconf-org: if you need to get in touch with the organizers
+
+You can use the `/JOIN` command in an IRC client (ex:
+chat.emacsconf.org) to join a different channel. Ex: `/join #emacsconf-org`
+if you want to talk to the organizers.
+
+Pre-recorded talk videos will be available on the talk pages after the
+talks go live, and other videos (including Q&A) will also be added to
+the talk pages once we process them.
+
+**Accessibility:** Pre-recorded talks will be streamed with open
+captions, and the transcripts will be posted to the talk pages as
+well. If you have any accessibility requests, please join the
+[#emacsconf-org](https://chat.emacsconf.org/?join=emacsconf-org) and
+let us know, or e-mail <emacsconf-org-private@gnu.org> to reach the
+organizers.
+
+Physical events:
+
+- [Lucerne](https://200ok.ch/posts/2022-11-01_emacsconf__with_a_new_physical_venue.html)
+
diff --git a/2022/watch/announce.md b/2022/watch/announce.md
new file mode 100644
index 00000000..80c62599
--- /dev/null
+++ b/2022/watch/announce.md
@@ -0,0 +1,6 @@
+When EmacsConf 2022 is live (Dec 3 and Dec 4), you will be able to watch the livestreams from the watch pages below.
+
+Legend:
+
+* Solid lines: Q&A will be through a BigBlueButton room (you can ask questions there or through IRC/Etherpad)
+* Dashed lines: Q&A will be over IRC or the Etherpad, or the speaker will follow up afterwards
diff --git a/2022/watch/dev.md b/2022/watch/dev.md
new file mode 100644
index 00000000..3741aef3
--- /dev/null
+++ b/2022/watch/dev.md
@@ -0,0 +1,151 @@
+<!-- Automatically generated by emacsconf-publish-watch-pages -->
+<!--
+[[!inline pages="internal(2022/watch/announce)" raw="yes"]]
+[[!meta title="Development stream"]]
+[[!sidebar content=""]] -->
+
+<hr size="1">
+<div><a name="watch"></a><strong>Watch</strong> - <a href="#links">Pad and Q&amp;A links</a> - <a href="#chat">Chat</a> - <a href="#sched">Schedule</a> | Tracks: <a href="/2022/watch/gen/">General</a> - <strong>Development</strong> | <a href="https://emacsconf.org/2022/watch/">Tips for watching/participating</a></div>
+
+<video controls class="reload"><source src="https://live0.emacsconf.org/dev.webm" type="video/webm" /></video>
+<div>Alternatively, load <a href="https://live0.emacsconf.org/dev.webm">https://live0.emacsconf.org/dev.webm</a> or <a href="https://live0.emacsconf.org/dev-480p.webm">https://live0.emacsconf.org/dev-480p.webm</a> (low-res) in a streaming media player such as MPV.</div>
+<hr size="1"><div><a name="links"></a><a href="#watch">Watch</a> - <strong>Pad and Q&amp;A links</strong> - <a href="#chat">Chat</a> - <a href="#sched">Schedule</a> | Tracks: <a href="/2022/watch/gen/">General</a> - <strong>Development</strong></div><div><span><a href="https://emacsconf.org/2022/talks/treesitter">treesitter</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-treesitter">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: meain</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/lspbridge">lspbridge</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-lspbridge">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: manateelazycat, matthewzmd</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/asmblox">asmblox</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-asmblox">pad</a>, <a href="https://emacsconf.org/current/asmblox/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/wayland">wayland</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-wayland">pad</a>, <a href="https://emacsconf.org/current/wayland/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/sqlite">sqlite</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-sqlite">pad</a>, <a href="https://emacsconf.org/current/sqlite/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/mail">mail</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-mail">pad</a>, <a href="https://emacsconf.org/current/mail/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/maint">maint</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-maint">pad</a>, <a href="https://emacsconf.org/current/maint/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/eev">eev</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-eev">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/python">python</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-python">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/haskell">haskell</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-haskell">pad</a>, <a href="https://emacsconf.org/current/haskell/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/rde">rde</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-rde">pad</a>, <a href="https://emacsconf.org/current/rde/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/justl">justl</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-justl">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/rms">rms</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-rms">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">Moderated via Mumble, ask questions via pad or IRC</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/detached">detached</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-detached">pad</a>, <a href="https://emacsconf.org/current/detached/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/eshell">eshell</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-eshell">pad</a>, <a href="https://emacsconf.org/current/eshell/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/async">async</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-async">pad</a>, <a href="https://emacsconf.org/current/async/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/dbus">dbus</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-dbus">pad</a>, <a href="https://emacsconf.org/current/dbus/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/localizing">localizing</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-localizing">pad</a>, <a href="https://emacsconf.org/current/localizing/room/">BBB</a>)</span></div>
+<div class="pad-output"></div>
+<hr size="1"><div><a name="chat"></a><a href="#watch">Watch</a> - <a href="#links">Pad and Q&amp;A links</a> - <strong>Chat</strong> - <a href="#sched">Schedule</a> | Tracks: <a href="/2022/watch/gen/">General</a> - <strong>Development</strong></div><div>Chat: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">emacsconf-dev</a> on libera.chat</div>
+
+<div class="chat-iframe" data-track="dev"></div>
+<iframe src="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev" height="600" width="100%"></iframe>
+<hr size="1"><div><a name="sched"></a><a href="#watch">Watch</a> - <a href="#links">Pad and Q&amp;A links</a> - <a href="#chat">Chat</a> - <strong>Schedule</strong> | Tracks: <a href="/2022/watch/gen/">General</a> - <strong>Development</strong></div>
+<ul>Legend:
+<li>Solid lines: Q&A will be through a BigBlueButton room (you can ask questions there or through IRC/Etherpad)</li>
+<li>Dashed lines: Q&A will be over IRC or the Etherpad, or the speaker will follow up afterwards</li></ul>
+<div><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 3:50- 3:55 Short hyperlinks to Python docs</title> <rect x="643" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(648,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:55-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="86" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="https://emacsconf.org/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:15 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(397,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div>
+<div><h1>Saturday, Dec 3, 2022</h1>
+<div data-start="2022-12-03T15:00:00+0000" data-end="2022-12-03T15:15:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:00</span> - <span class="sched-end">10:15</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-treesitter">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: meain</a></span>; <span class="sched-slug">id:treesitter</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/treesitter">Tree-sitter beyond syntax highlighting</a></div>
+ <div class="sched-speakers">Abin Simon</div>
+
+</div>
+
+<div data-start="2022-12-03T15:25:00+0000" data-end="2022-12-03T15:45:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:25</span> - <span class="sched-end">10:45</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-lspbridge">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: manateelazycat, matthewzmd</a></span>; <span class="sched-slug">id:lspbridge</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/lspbridge">lsp-bridge: a smooth-as-butter asynchronous LSP client</a></div>
+ <div class="sched-speakers">Andy Stewart, Matthew Zeng</div>
+
+</div>
+
+<div data-start="2022-12-03T15:55:00+0000" data-end="2022-12-03T16:15:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:55</span> - <span class="sched-end">11:15</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-asmblox">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/asmblox/room/">BBB</a></span>; <span class="sched-slug">id:asmblox</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/asmblox">asm-blox: a game based on WebAssembly that no one asked for</a></div>
+ <div class="sched-speakers">Zachary Romero</div>
+
+</div>
+
+<div data-start="2022-12-03T16:25:00+0000" data-end="2022-12-03T16:35:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">11:25</span> - <span class="sched-end">11:35</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-wayland">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/wayland/room/">BBB</a></span>; <span class="sched-slug">id:wayland</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/wayland">Emacs should become a Wayland compositor</a></div>
+ <div class="sched-speakers">Michael Bauer</div>
+
+</div>
+
+<div data-start="2022-12-03T18:00:00+0000" data-end="2022-12-03T18:25:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:00</span> - <span class="sched-end">1:25</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-sqlite">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/sqlite/room/">BBB</a></span>; <span class="sched-slug">id:sqlite</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/sqlite">Using SQLite as a data source: a framework and an example</a></div>
+ <div class="sched-speakers">Andrew Hyatt (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T18:50:00+0000" data-end="2022-12-03T19:30:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:50</span> - <span class="sched-end">2:30</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-mail">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/mail/room/">BBB</a></span>; <span class="sched-slug">id:mail</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/mail">Revisiting the anatomy of Emacs mail user agents</a></div>
+ <div class="sched-speakers">Mohsen BANAN (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T19:50:00+0000" data-end="2022-12-03T20:10:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">2:50</span> - <span class="sched-end">3:10</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-maint">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/maint/room/">BBB</a></span>; <span class="sched-slug">id:maint</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/maint">Maintaining the Maintainers: Attribution as an Economic Model for Open Source</a></div>
+ <div class="sched-speakers">Sid Kasivajhula (he/him or any)</div>
+
+</div>
+
+<div data-start="2022-12-03T20:35:00+0000" data-end="2022-12-03T20:40:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">3:35</span> - <span class="sched-end">3:40</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-eev">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a></span>; <span class="sched-slug">id:eev</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/eev">Bidirectional links with eev</a></div>
+ <div class="sched-speakers">Eduardo Ochs</div>
+
+</div>
+
+<div data-start="2022-12-03T20:50:00+0000" data-end="2022-12-03T20:55:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">3:50</span> - <span class="sched-end">3:55</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-python">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a></span>; <span class="sched-slug">id:python</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/python">Short hyperlinks to Python docs</a></div>
+ <div class="sched-speakers">Eduardo Ochs</div>
+
+</div>
+
+<div data-start="2022-12-03T21:05:00+0000" data-end="2022-12-03T21:35:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">4:05</span> - <span class="sched-end">4:35</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-haskell">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/haskell/room/">BBB</a></span>; <span class="sched-slug">id:haskell</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/haskell">Haskell code exploration with Emacs</a></div>
+ <div class="sched-speakers">Yuchen Pei (he/him/himself/his/his)</div>
+
+</div>
+
+<h1>Sunday, Dec 4, 2022</h1>
+<div data-start="2022-12-04T15:00:00+0000" data-end="2022-12-04T15:25:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:00</span> - <span class="sched-end">10:25</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-rde">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/rde/room/">BBB</a></span>; <span class="sched-slug">id:rde</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/rde">rde Emacs introduction</a></div>
+ <div class="sched-speakers">Andrew Tropin (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T15:50:00+0000" data-end="2022-12-04T16:05:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:50</span> - <span class="sched-end">11:05</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-justl">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev</a></span>; <span class="sched-slug">id:justl</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/justl">justl: Driving recipes within Emacs</a></div>
+ <div class="sched-speakers">Sibi Prabakaran (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T16:15:00+0000" data-end="2022-12-04T16:35:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">11:15</span> - <span class="sched-end">11:35</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-rms">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">Moderated via Mumble, ask questions via pad or IRC</a></span>; <span class="sched-slug">id:rms</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/rms">What I'd like to see in Emacs</a></div>
+ <div class="sched-speakers">Richard M. Stallman</div>
+
+</div>
+
+<div data-start="2022-12-04T18:00:00+0000" data-end="2022-12-04T18:15:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:00</span> - <span class="sched-end">1:15</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-detached">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/detached/room/">BBB</a></span>; <span class="sched-slug">id:detached</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/detached">Getting detached from Emacs</a></div>
+ <div class="sched-speakers">Niklas Eklund (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T18:40:00+0000" data-end="2022-12-04T18:55:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:40</span> - <span class="sched-end">1:55</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-eshell">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/eshell/room/">BBB</a></span>; <span class="sched-slug">id:eshell</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/eshell">Top 10 reasons why you should be using Eshell</a></div>
+ <div class="sched-speakers">Howard Abrams (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T19:20:00+0000" data-end="2022-12-04T19:40:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">2:20</span> - <span class="sched-end">2:40</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-async">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/async/room/">BBB</a></span>; <span class="sched-slug">id:async</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/async">Emacs was async before async was cool</a></div>
+ <div class="sched-speakers">Michael Herstine</div>
+
+</div>
+
+<div data-start="2022-12-04T20:15:00+0000" data-end="2022-12-04T20:35:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">3:15</span> - <span class="sched-end">3:35</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-dbus">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/dbus/room/">BBB</a></span>; <span class="sched-slug">id:dbus</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/dbus">The Wheels on D-Bus</a></div>
+ <div class="sched-speakers">Ian Eure (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T21:00:00+0000" data-end="2022-12-04T21:10:00+0000" class="sched-entry track-Development">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">4:00</span> - <span class="sched-end">4:10</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-localizing">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/localizing/room/">BBB</a></span>; <span class="sched-slug">id:localizing</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/localizing">Pre-localizing Emacs</a></div>
+ <div class="sched-speakers">Jean-Christophe Helary (he/him)</div>
+
+</div>
+
+</div>
diff --git a/2022/watch/gen.md b/2022/watch/gen.md
new file mode 100644
index 00000000..22452154
--- /dev/null
+++ b/2022/watch/gen.md
@@ -0,0 +1,200 @@
+<!-- Automatically generated by emacsconf-publish-watch-pages -->
+<!--
+[[!inline pages="internal(2022/watch/announce)" raw="yes"]]
+[[!meta title="General stream"]]
+[[!sidebar content=""]] -->
+
+<hr size="1">
+<div><a name="watch"></a><strong>Watch</strong> - <a href="#links">Pad and Q&amp;A links</a> - <a href="#chat">Chat</a> - <a href="#sched">Schedule</a> | Tracks: <strong>General</strong> - <a href="/2022/watch/dev/">Development</a> | <a href="https://emacsconf.org/2022/watch/">Tips for watching/participating</a></div>
+
+<video controls class="reload"><source src="https://live0.emacsconf.org/gen.webm" type="video/webm" /></video>
+<div>Alternatively, load <a href="https://live0.emacsconf.org/gen.webm">https://live0.emacsconf.org/gen.webm</a> or <a href="https://live0.emacsconf.org/gen-480p.webm">https://live0.emacsconf.org/gen-480p.webm</a> (low-res) in a streaming media player such as MPV.</div>
+<hr size="1"><div><a name="links"></a><a href="#watch">Watch</a> - <strong>Pad and Q&amp;A links</strong> - <a href="#chat">Chat</a> - <a href="#sched">Schedule</a> | Tracks: <strong>General</strong> - <a href="/2022/watch/dev/">Development</a></div><div><span><a href="https://emacsconf.org/2022/talks/sat-open">sat-open</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-sat-open">pad</a>, none)</span> - <span><a href="https://emacsconf.org/2022/talks/journalism">journalism</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-journalism">pad</a>, <a href="https://emacsconf.org/current/journalism/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/school">school</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-school">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: velocitatem</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/handwritten">handwritten</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-handwritten">pad</a>, <a href="https://emacsconf.org/current/handwritten/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/science">science</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-science">pad</a>, <a href="https://emacsconf.org/current/science/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/buddy">buddy</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-buddy">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/meetups">meetups</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-meetups">pad</a>, <a href="https://emacsconf.org/current/meetups/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/buttons">buttons</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-buttons">pad</a>, <a href="https://emacsconf.org/current/buttons/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/realestate">realestate</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-realestate">pad</a>, <a href="nil">Etherpad</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/health">health</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-health">pad</a>, <a href="https://emacsconf.org/current/health/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/jupyter">jupyter</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-jupyter">pad</a>, <a href="https://emacsconf.org/current/jupyter/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/sat-close">sat-close</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-sat-close">pad</a>, none)</span> - <span><a href="https://emacsconf.org/2022/talks/sun-open">sun-open</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-sun-open">pad</a>, none)</span> - <span><a href="https://emacsconf.org/2022/talks/survey">survey</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-survey">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: tecosaur</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/orgyear">orgyear</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-orgyear">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: tecosaur</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/rolodex">rolodex</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-rolodex">pad</a>, <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/orgsuperlinks">orgsuperlinks</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-orgsuperlinks">pad</a>, <a href="https://emacsconf.org/current/orgsuperlinks/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/orgvm">orgvm</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-orgvm">pad</a>, <a href="https://emacsconf.org/current/orgvm/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/hyperorg">hyperorg</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-hyperorg">pad</a>, <a href="https://emacsconf.org/current/hyperorg/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/workflows">workflows</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-workflows">pad</a>, <a href="https://emacsconf.org/current/workflows/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/grail">grail</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-grail">pad</a>, <a href="https://emacsconf.org/current/grail/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/indieweb">indieweb</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-indieweb">pad</a>, <a href="https://emacsconf.org/current/indieweb/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/devel">devel</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-devel">pad</a>, none)</span> - <span><a href="https://emacsconf.org/2022/talks/fanfare">fanfare</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-fanfare">pad</a>, <a href="https://emacsconf.org/current/fanfare/room/">BBB</a>)</span> - <span><a href="https://emacsconf.org/2022/talks/sun-close">sun-close</a> (<a class="pad-link" href="https://pad.emacsconf.org/2022-sun-close">pad</a>, none)</span></div>
+<div class="pad-output"></div>
+<hr size="1"><div><a name="chat"></a><a href="#watch">Watch</a> - <a href="#links">Pad and Q&amp;A links</a> - <strong>Chat</strong> - <a href="#sched">Schedule</a> | Tracks: <strong>General</strong> - <a href="/2022/watch/dev/">Development</a></div><div>Chat: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen">emacsconf-gen</a> on libera.chat</div>
+
+<div class="chat-iframe" data-track="gen"></div>
+<iframe src="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen" height="600" width="100%"></iframe>
+<hr size="1"><div><a name="sched"></a><a href="#watch">Watch</a> - <a href="#links">Pad and Q&amp;A links</a> - <a href="#chat">Chat</a> - <strong>Schedule</strong> | Tracks: <strong>General</strong> - <a href="/2022/watch/dev/">Development</a></div>
+<ul>Legend:
+<li>Solid lines: Q&A will be through a BigBlueButton room (you can ask questions there or through IRC/Etherpad)</li>
+<li>Dashed lines: Q&A will be over IRC or the Etherpad, or the speaker will follow up afterwards</li></ul>
+<div><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 3:50- 3:55 Short hyperlinks to Python docs</title> <rect x="643" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(648,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:55-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="86" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="https://emacsconf.org/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:15 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(397,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div>
+<div><h1>Saturday, Dec 3, 2022</h1>
+<div data-start="2022-12-03T14:00:00+0000" data-end="2022-12-03T14:05:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:00</span> - <span class="sched-end">9:05</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-sat-open">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: none</span>; <span class="sched-slug">id:sat-open</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/sat-open">Saturday opening remarks</a></div>
+ <div class="sched-speakers">Sacha Chua</div>
+
+</div>
+
+<div data-start="2022-12-03T14:05:00+0000" data-end="2022-12-03T14:25:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:05</span> - <span class="sched-end">9:25</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-journalism">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/journalism/room/">BBB</a></span>; <span class="sched-slug">id:journalism</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/journalism">Emacs journalism (or everything's a nail if you hit it with Emacs)</a></div>
+ <div class="sched-speakers">Alfred Zanini (he/they)</div>
+
+</div>
+
+<div data-start="2022-12-03T14:45:00+0000" data-end="2022-12-03T14:55:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:45</span> - <span class="sched-end">9:55</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-school">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: velocitatem</a></span>; <span class="sched-slug">id:school</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/school">Back to school with Emacs</a></div>
+ <div class="sched-speakers">Daniel Rösel</div>
+
+</div>
+
+<div data-start="2022-12-03T15:05:00+0000" data-end="2022-12-03T15:15:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:05</span> - <span class="sched-end">10:15</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-handwritten">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/handwritten/room/">BBB</a></span>; <span class="sched-slug">id:handwritten</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/handwritten">How to incorporate handwritten notes into Emacs Orgmode</a></div>
+ <div class="sched-speakers">Bala Ramadurai (his/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T15:45:00+0000" data-end="2022-12-03T16:05:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:45</span> - <span class="sched-end">11:05</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-science">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/science/room/">BBB</a></span>; <span class="sched-slug">id:science</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/science">Writing and organizing literature notes for scientific writing</a></div>
+ <div class="sched-speakers">Vidianos Giannitsis</div>
+
+</div>
+
+<div data-start="2022-12-03T16:25:00+0000" data-end="2022-12-03T16:35:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">11:25</span> - <span class="sched-end">11:35</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-buddy">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen</a></span>; <span class="sched-slug">id:buddy</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/buddy">The Emacs Buddy initiative</a></div>
+ <div class="sched-speakers">Andrea</div>
+
+</div>
+
+<div data-start="2022-12-03T18:00:00+0000" data-end="2022-12-03T18:20:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:00</span> - <span class="sched-end">1:20</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-meetups">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/meetups/room/">BBB</a></span>; <span class="sched-slug">id:meetups</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/meetups">Attending and organizing Emacs meetups</a></div>
+ <div class="sched-speakers">Bhavin Gandhi (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T18:40:00+0000" data-end="2022-12-03T18:55:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:40</span> - <span class="sched-end">1:55</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-buttons">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/buttons/room/">BBB</a></span>; <span class="sched-slug">id:buttons</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/buttons">Linking personal info with Hyperbole implicit buttons</a></div>
+ <div class="sched-speakers">Mats Lidell (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T19:15:00+0000" data-end="2022-12-03T19:40:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">2:15</span> - <span class="sched-end">2:40</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-realestate">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="nil">Etherpad</a></span>; <span class="sched-slug">id:realestate</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/realestate">Real estate and Org table formulas</a></div>
+ <div class="sched-speakers">Daniel Gopar (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T20:00:00+0000" data-end="2022-12-03T20:25:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">3:00</span> - <span class="sched-end">3:25</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-health">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/health/room/">BBB</a></span>; <span class="sched-slug">id:health</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/health">Health data journaling and visualization with Org Mode and gnuplot</a></div>
+ <div class="sched-speakers">David O'Toole (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T20:45:00+0000" data-end="2022-12-03T21:05:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">3:45</span> - <span class="sched-end">4:05</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-jupyter">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/jupyter/room/">BBB</a></span>; <span class="sched-slug">id:jupyter</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/jupyter">Edit live Jupyter notebook cells with Emacs</a></div>
+ <div class="sched-speakers">Blaine Mooers (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-03T21:50:00+0000" data-end="2022-12-03T21:55:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">4:50</span> - <span class="sched-end">4:55</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-sat-close">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: none</span>; <span class="sched-slug">id:sat-close</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/sat-close">Saturday closing remarks</a></div>
+
+
+</div>
+
+<h1>Sunday, Dec 4, 2022</h1>
+<div data-start="2022-12-04T14:00:00+0000" data-end="2022-12-04T14:05:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:00</span> - <span class="sched-end">9:05</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-sun-open">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: none</span>; <span class="sched-slug">id:sun-open</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/sun-open">Sunday opening remarks</a></div>
+
+
+</div>
+
+<div data-start="2022-12-04T14:05:00+0000" data-end="2022-12-04T14:25:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:05</span> - <span class="sched-end">9:25</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-survey">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: tecosaur</a></span>; <span class="sched-slug">id:survey</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/survey">Results of the 2022 Emacs Survey</a></div>
+ <div class="sched-speakers">Timothy (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T14:35:00+0000" data-end="2022-12-04T14:45:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:35</span> - <span class="sched-end">9:45</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-orgyear">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: tecosaur</a></span>; <span class="sched-slug">id:orgyear</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/orgyear">This Year in Org</a></div>
+ <div class="sched-speakers">Timothy (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T14:55:00+0000" data-end="2022-12-04T15:20:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:55</span> - <span class="sched-end">10:20</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-rolodex">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen</a></span>; <span class="sched-slug">id:rolodex</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/rolodex">Build a Zettelkasten with the Hyperbole Rolodex</a></div>
+ <div class="sched-speakers">Ramin Honary (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T15:40:00+0000" data-end="2022-12-04T15:50:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">10:40</span> - <span class="sched-end">10:50</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-orgsuperlinks">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/orgsuperlinks/room/">BBB</a></span>; <span class="sched-slug">id:orgsuperlinks</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/orgsuperlinks">Linking headings with org-super-links (poor-man's Zettelkasten)</a></div>
+ <div class="sched-speakers">Karl Voit (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T16:10:00+0000" data-end="2022-12-04T16:20:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">11:10</span> - <span class="sched-end">11:20</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-orgvm">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/orgvm/room/">BBB</a></span>; <span class="sched-slug">id:orgvm</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/orgvm">orgvm: a simple HTTP server for org</a></div>
+ <div class="sched-speakers">Corwin Brust (he/him/any)</div>
+
+</div>
+
+<div data-start="2022-12-04T18:00:00+0000" data-end="2022-12-04T18:30:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:00</span> - <span class="sched-end">1:30</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-hyperorg">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/hyperorg/room/">BBB</a></span>; <span class="sched-slug">id:hyperorg</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/hyperorg">Powerful productivity with Hyperbole and Org Mode</a></div>
+ <div class="sched-speakers">Robert Weiner</div>
+
+</div>
+
+<div data-start="2022-12-04T18:50:00+0000" data-end="2022-12-04T19:15:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">1:50</span> - <span class="sched-end">2:15</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-workflows">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/workflows/room/">BBB</a></span>; <span class="sched-slug">id:workflows</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/workflows">Org workflows for developers</a></div>
+ <div class="sched-speakers">George Mauer (he/him/they/ze)</div>
+
+</div>
+
+<div data-start="2022-12-04T19:35:00+0000" data-end="2022-12-04T19:55:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">2:35</span> - <span class="sched-end">2:55</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-grail">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/grail/room/">BBB</a></span>; <span class="sched-slug">id:grail</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/grail">GRAIL---A Generalized Representation and Aggregation of Information Layers</a></div>
+ <div class="sched-speakers">Sameer Pradhan (he/him)</div>
+
+</div>
+
+<div data-start="2022-12-04T20:25:00+0000" data-end="2022-12-04T20:45:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">3:25</span> - <span class="sched-end">3:45</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-indieweb">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/indieweb/room/">BBB</a></span>; <span class="sched-slug">id:indieweb</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/indieweb">Putting Org Mode on the Indieweb</a></div>
+ <div class="sched-speakers">Michael Herstine</div>
+
+</div>
+
+<div data-start="2022-12-04T21:05:00+0000" data-end="2022-12-04T21:15:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">4:05</span> - <span class="sched-end">4:15</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-devel">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: none</span>; <span class="sched-slug">id:devel</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/devel">Emacs development updates</a></div>
+ <div class="sched-speakers">John Wiegley</div>
+
+</div>
+
+<div data-start="2022-12-04T21:25:00+0000" data-end="2022-12-04T21:35:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">4:25</span> - <span class="sched-end">4:35</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-fanfare">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://emacsconf.org/current/fanfare/room/">BBB</a></span>; <span class="sched-slug">id:fanfare</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/fanfare">Fanfare for the Common Emacs User</a></div>
+ <div class="sched-speakers">John Cummings</div>
+
+</div>
+
+<div data-start="2022-12-04T21:50:00+0000" data-end="2022-12-04T22:00:00+0000" class="sched-entry track-General">
+<div class="sched-meta"><span class="sched-time"><span class="sched-start">4:50</span> - <span class="sched-end">5:00</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2022-sun-close">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: none</span>; <span class="sched-slug">id:sun-close</span></div>
+<div class="sched-title"><a href="https://emacsconf.org/2022/talks/sun-close">Sunday closing remarks</a></div>
+
+
+</div>
+
+</div>
diff --git a/2022/watch/info.md b/2022/watch/info.md
new file mode 100644
index 00000000..b6b0a50f
--- /dev/null
+++ b/2022/watch/info.md
@@ -0,0 +1,7 @@
+[[!sidebar content=""]]<!-- Automatically generated by emacsconf-publish-watch-pages -->
+
+<h1>Tracks</h1><table width="100%"><tr><th>Watch page</th><th>IRC channel (libera.chat)</th><th>Alternative for streaming player</th><th>Low res</th></tr>
+<tr><td><div class="sched-track General"><a href="/2022/watch/gen/">General</a></div></td><td><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen">emacsconf-gen</a></td><td><a href="https://live0.emacsconf.org/gen.webm">https://live0.emacsconf.org/gen.webm</a></td><td><a href="https://live0.emacsconf.org/gen-480p.webm">gen-480p.webm</a></tr>
+<tr><td><div class="sched-track Development"><a href="/2022/watch/dev/">Development</a></div></td><td><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">emacsconf-dev</a></td><td><a href="https://live0.emacsconf.org/dev.webm">https://live0.emacsconf.org/dev.webm</a></td><td><a href="https://live0.emacsconf.org/dev-480p.webm">dev-480p.webm</a></tr></table>
+
+<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="https://emacsconf.org/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="https://emacsconf.org/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="https://emacsconf.org/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="https://emacsconf.org/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="https://emacsconf.org/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="https://emacsconf.org/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="https://emacsconf.org/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="https://emacsconf.org/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="https://emacsconf.org/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="https://emacsconf.org/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="https://emacsconf.org/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="https://emacsconf.org/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="https://emacsconf.org/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="https://emacsconf.org/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="https://emacsconf.org/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="https://emacsconf.org/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="https://emacsconf.org/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="https://emacsconf.org/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="https://emacsconf.org/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="https://emacsconf.org/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 3:50- 3:55 Short hyperlinks to Python docs</title> <rect x="643" y="75" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(648,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="https://emacsconf.org/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="https://emacsconf.org/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="https://emacsconf.org/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="https://emacsconf.org/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:55-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="86" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="https://emacsconf.org/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="https://emacsconf.org/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="https://emacsconf.org/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="https://emacsconf.org/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="https://emacsconf.org/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="https://emacsconf.org/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="https://emacsconf.org/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="https://emacsconf.org/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="https://emacsconf.org/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="https://emacsconf.org/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="https://emacsconf.org/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="https://emacsconf.org/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="https://emacsconf.org/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:15 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(397,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="https://emacsconf.org/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="https://emacsconf.org/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="https://emacsconf.org/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="https://emacsconf.org/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg> \ No newline at end of file